본문 바로가기

2. Reversing (리버싱)/1) Write UP

[2020.04.07] Reversing.kr | Easy_Unpack

 

| Reversing.kr Easy_Unpack 문제

 

압축을 해제하면 다음과 같은 txt파일이 존재한다.

OEP 값을 찾으라는 문제다.

 

* OEP 란?

OEP(Original Point)는 실행 프로그램에서의 실제 시작점을 의미한다.
일반적인 프로그램은 실제 시작점이 프로그램 실행 시 시작점과 동일하지만
Packing이 되면 실제 OEP가 숨겨져 있게 된다.

 

PEiD로 확인해본 결과 Packing 되어 있음을 확인했고 무엇으로 Packing되었는지는 알 수 없다.

 

* Packing과 Unpacking?

1. Packing

- 실행파일을 암호화하거나, 압축하여 소스코드를 볼 수 없도록 하는 것

- 압축을 하면 용량을 줄이고, 실행속도가 높아짐

- 사용자 측면에서도 유리하지만, 악성코드 유포시에도 유리하게 작용

- 분석에 어려움이 존재(Unpacking이 필요하기 때문)

 

2. Unpacking

- Packing된 소스코드를 보기 위해 암호화나 압축을 푸는 행위

 

| Reversing

OllyDbg를 통해 파일을 열고 살펴 보았다.

 

반복문을 통해 빨간 박스의 부분이 계속해서 반복되면서 ECX와 EDX를 비교한다.

우리는 궁극적으로 어떠한 조건을 충족시켜서0040A0C3으로 가고 싶다.

 

하지만! 마지만 Jump문에서 반복문의 처음으로 돌아간다.

 

조건을 만족 시키는 방법도 있겠지만 리버싱을 잘 모르는 나는

일단 JE문에서 바로 0040A0C3으로 점프할 수 있도록Z플래그를 1로바꿔주었다.

 

계속 내려가다 보면 이전과 같은 반복문이 계속 나온다.

이 반복문의 과정을 거치면서 패킹 되었던 프로그램이 일종의 복호화가 된다고 생각하면 될 것 같다.

 

Z플래그를 계속해서 바꾸긴 귀찮으니, 맨 마지막에 수상한 지점에 F2로 Break Poin를 걸고

F9로 해당 지점까지 간다.

(후에 알았지만 보통 저렇게 JMP 뒤에 나오는 주소가 OEP라고 한다.)

 

해당 지점으로 가면 코드들이 나눠져있는 걸 알 수 있다.

 

Ctrl + A를 눌러서 Analyze Code기능을 실행하면 다음과 같이 원래 코드가 나온다

하지만 이 코드만 보고 해석할 수 있는 능력은 나에게 없으니 일단 F8로 계속 내려본다.

 

내리다보면 익숙한 00401000을 call하는 지점이 나오는 걸 알 수 있고

해당 부분을 지나면 프로그램이 실행된다!

 

따라서 본 프로그램의 OEP는 해당 부분으로 들어오는 시작점의 주소임을 알 수 있다.

답(드래그)

00401150