본문 바로가기
Reversing/리버싱 핵심 원리

[리버싱 핵심 원리] 15장, UPX 실행 압축된 notepad 디버깅

by Y06 2020. 11. 7.

15장, UPX 실행 압축된 notepad 디버깅

 

15.1 notepad.exe의 EP Code

 

원본의 notepad.exe의 EP 코드이다.

010073B2 주소에서 GetModuleHangleA() API를 호출해서 notepad.exe. 프로세스의 ImageBase를 구한다. 그리고 010073B4와 010073C0 주소에서 각각 MZ와 PE 시그니처를 비교한다.

 

15.2.notepad_upx.exe의 EP Code

 

notepad_upx.exe를 OllyDbg로 열어보면 위와 같은 경고 메세지 박스가 나타난다. 디버거가 해당 파일이 압축되었다고 판단하였다. 예/아니오 중에 아무거나 선택해서 넘어가면 UPX EP코드가 나타난다.

EP 주소는 01015330이며, 이곳은 두 번째 섹션의 끝부분이다. 실제로 압축된 notepad 원본 코드는 EP 주소(01015330) 위쪽으로 존재한다.

코드 시작 부분(01015330)이다. PUSHAD 명령으로 EAX~EDI 레지스터 값을 스택에 저장하고 ESI와 EDI 레지스터를 각각 두 번째 섹션 시작 주소(01011000)와 첫 번째 섹션 시작 주소(01001000)로 세팅한다. UPX 파일에서 첫 번째 섹션은 메모리에서만 존재한다. 이곳이 바로 압축해제된 원본 파일의 코드가 저장될 장소이다.

 

15.3.UPX 파일 트레이싱

 

파일 트레이싱을 할 때의 원칙: 루프(Loop)를 만나면 그 역할을 살펴본 후 탈출한다.

압축해제 과정은 무수히 많은 루프의 연속이다. 따라서 적절히 루프를 탈출해야 빠르게 진행할 수 있다.

 

15.3.1.OllyDbg의 트레이스 명령어

 

방대한 양을 트레이싱할 때는 일반적인 Step Into[F7] 명령을 사용하지 않고, OllyDbg에서 별도로 제공되는 명령어를 사용한다.

명령어 단축키 설 명
Animate Into Ctrl+F7 Step Into 명령 반복(화면 표시 됨)
Animate Over Ctrl+F8 Step Over 명령 반복(화면 표시 됨)
Trace Into Ctrl+F11 Step Into 명령 반복(화면 표시 안 됨)
Trace Into Ctrl+F12 Step Over 명령 반복(화면 표시 안 됨)

애니메이트(Animate) 명령어와 트레이스 명령어의 가장 큰 차이점: 트레이스 명령어는 미리 설정한 크레이스 조건에서 자동으로 멈출 수 있고, 로그를 남길 수도 있다.

 

15.3.2.루프 #1

 

EP 코드에서 Animate Over[Ctrl+F8] 명령을 내리면 트레이싱이 시작된다. 트레이싱을 멈추고 싶을 때는 Step Into[F7] 명령을 내리면 된다.

이 사진에서 자세히 보아야 할 부분은 ECX, EDX, EDI이다.

루프 회전 수 ECX = 36B이고, 루프 내용은 EDX(01001000)에서 한 바이트를 읽어 EDI(01001001)에 쓰이는 것이다. EDI 레지스터가 가리키는 01001000 주소는 첫 번째 섹션(UPX0)의 시작 주소이며, 메모리에서만 존재하는 섹션이다. 내용은 전부 NULL이다.

 

15.3.3. 루프 #2

 

그 위치에서부터 다시 Animate Over[Ctrl+F8] 명령으로 트레이싱을 시작한다.

이것이 본격적인 디코딩 루프이다. 또는 압축해제 루프이다. ESI가 가리키는 두 번째 섹션(UPX1)의 주소에서 차례대로 값을 읽어서 적절한 연산을 거쳐 압축을 해제하여 EDI가 가리키는 첫 번째 섹션(UPX0)의 주소 값을 써준다.

이 두 번째 루프를 탈출하기 위해서는 0101502 주소에 BP를 설치하고 실행하면 된다.

 

이런 식으로 책에 나와있는 루프 방법을 실습하면 된다.

 

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

 

15.4.1. POPAD 명령어 이후의 JMP 명령어에 BP 설치

 

UPX 패커의 특징 중 하나는 EP 코드가 PUSHAD/POPAD 명령어로 둘러싸여 있다는 것이다. 그리고 OPE 코드로 가는 JMP 명령어가 POPAD 명령어 바로 이후에 나타난다. 이 JMP 명령어에 BP를 설치하고 실핼하면 바오 OEP로 갈 수 있다.

 

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

 

UPX 특징인 PUSHAD/POPAD 명령어의 특성을 이용한 것이다.

EAX에서 EDI까지 스택에 차곡차곡 정리되어 있다. OllyDbg의 Dump 창에서 스택 주소(0006FFA4)로 간다. 마우스 커서를 정확히 6FFA4 주소 위치에 취치시킨 후 마우스 우측 메뉴를 이용하여 하드웨어 BP를 설치할 수 있다.