ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [리버싱 핵심원리 study] 15장 UPX 실행 압축된 notepad 디버깅
    Reverse Engineering 2020. 12. 29. 02:49

    이전 실습에서 생성한 notepad_upx.exe를 디버깅하여 실행 압축에 대한 개념을 이해하고 원시적인 방법으로 tracing 하면서 OEP를 찾아보자.

     

    1. notepad.exe의 EP code

    우선 원본 notepad.exe의 EP 코드를 살펴보자.

    notepad.exe의 EP 코드

    010073BE에서 GetModuleHandleA API를 이용하여 notepad.exe 프로세스의 ImageBase를 구한 후, 010073B4와 010073C0 주소에서 각각 MZ와 PE Signature를 비교한다.

     

    2. notepad_upx.exe의 EP Code

    notepad_upx.exe의 EP 코드

    EP 주소는 010154F0으로, 이곳은 두 번째 섹션의 끝부분이다. 우선 PUSHAD 명령어를 통해 EAX ~ EDI 레지스터 값을 스택에 저장하고, ESI와 EDI 레지스터를 각각 두 번째 섹션의 시작 주소와 첫 번째 섹션 시작 주소로 세팅한다. UPX 파일에서 첫 번째 섹션은 메모리에서만 존재하는 곳으로, 압축 해제된 원본 파일의 코드가 저장되는 장소다. 이와 같이 디버깅할 때 ESI와 EDI가 동시에 세팅되면 ESI(source)에서 EDI(destination)로 메모리 복사가 일어날 거라고 예측할 수 있다.

     

    3. UPX 파일 트레이싱

    압축된 코드의 양이 상당히 많다. 이와 같은 코드를 트레싱할 때는 루프를 만나면 그 역할을 살펴본 후 탈출하는 방식으로 진행하면 좋다. OllyDbg에서는 Ctrl+F7, Ctrl+F8로 Step Into / Step Over 명령을 반복할 수 있는데, 해당 명령어를 수행하면 트레이싱 과정이 화면에 표시된다. 트레이싱을 진행하면서 루프를 만나면 기능을 파악하고 탈출 직후의 명령어에 BP를 설정하고 F9를 눌러 진행시키는 방향으로 트레이싱을 진행하면 보다 수월하게 진행할 수 있다. (F7을 다시 입력하면 트레이싱이 멈춘다.)

     

    JUMP to OEP

    계속해서 트레이싱을 진행하다보면 위와 같은 명령어를 발견할 수 있다. JUMP 명령어 윗부분에 POPAD 명령어도 확인할 수 있는데, 해당 명령을 통해 UPX 코드 중 가장 첫 번째 명령인 PUSHAD에 대응되는 것으로 레지스터를 원래대로 복원시키는 명령어이다. 최종적으로 JMP 하게 되는 0100739D는 UPX 압축전의 EP와 같은 것을 확인할 수 있다.

     

    4. UPX의 OEP를 빨리 찾는 방법

    위와 같이 트레이싱을 하는 방법은 시간이 많이 걸린다는 단점이 있다. UPX 패커를 기준으로 보다 빨리 OEP를 찾는 방법이 있는데 다음과 같은 것이 있다.

     

    1) POPAD 명령어 이후의 JUMP 명령어에 BP 설정

    UPX 패커는 EP 코드가 PUSHAD / POPAD 명령어로 둘러싸여 있으므로, POPAD 명령어가 호출되는 곳을 찾아 이후에 JMP 명령어가 나타나는 곳을 확인하는 방법이 있다.

     

    2) 스택에 하드웨어 브레이크 포인트(Hardware Break Point) 설치

    이 방법 역시 UPX의 특징인 PUSHAD/POPAD 명령어의 특성을 이용하는 방법으로, PUSHAD 명령을 실행한 후 스택을 보면 다음과 같다.

    PUSHAD 명령어 이후 스택의 모습

    마우스 커서를 스택의 top 부분인 000DFF54에 대고 우측 메뉴를 이용하여 하드웨어 BP를 설정한다.

    하드웨어 BP

    하드웨어 BP란 CPU에서 지원하는 BP로, 일반적인 BP와 다르게 BP가 설치된 명령어가 실행된 이후에 제어가 멈추게 된다는 특징이 있다. 이 상태에서 실행하게 되면 POPAD가 호출되는 순간 하드웨어 BP가 설정된 000DFF54 주소를 액세스하고 제어가 멈춘다. 밑에 있는 JMP 명령을 통해 OEP를 찾을 수 있다.

     

    하드웨어 BP 설정 후 실행 직후

    반응형

    댓글

Designed by Tistory.