Chapter 10. 실행 압축(Run-Time Packer) II - UPX
1. UPX(Ultimate Packer for eXecutables)
- Packer의 한 종류로 여러 운영체제에서 수많은 File Format을 지원하는 Open Source Run-Time File Packer Program이다.
- UCL(Lossless data Compression library : 무손실 Data 압축 Library) Algorithm을 사용한다.
- 지원 File Format
· ARM - PE
· atari - tos
· *BSD - i386
· digpp2 - coff
· DOS - com / exe / sys
· Linux
◦ i386 a.out
◦ ELF - i386 / x86-64 / ARM / Power PC
◦ Kernel - i386 / x86-64 / ARM
· mach
◦ ppc32
◦ i386
· rtm32 - PE
· tmt - adam
· ps1 - exe
· watcom - le
· win32 - PE
2. UPX File Debug
- UPX를 이용해 Packing된 File은 OllyDbg를 이용해 Debugging 시 위와 같은 Message가 발생한다.
- 따라서 UPX를 이용해 Packing을 해제하거나 Tracing을 진행해야한다.
- Tracing
· Code를 하나하나 실행하면서 쫒아가는 일을 말한다.
· Code를 하나하나 보면서 Loop를 찾아 압축을 해제시켜야하기 때문에 상당히 번거롭다.
· Decompress 구간을 지나 OEP를 찾아야한다.
· OEP(Original Entry Point)
◦ 원본의 Entry Point 즉, 원본 Program의 시작 지점을 말한다.
· Tracing을 하기 위한 OllyDbg의 명령어
◦ Animate Into(Ctrl + F7) : Step Into(F7) 명령 화면에 표시하며 반복(F7을 다시 누르면 종료)
◦ Animate Into(Ctrl + F8) : Step Over(F8) 명령 화면에 표시하며 반복(F8을 다시 누르면 종료)
◦ Trace Into(Ctrl + F11) : Step Into(F7) 명령 화면에 표시하지 않으며 반복(F7을 다시 누르면 종료)
◦ Trace Over(Ctrl + F12) : Step Over(F8) 명령 화면에 표시하지 않으며 반복(F8을 다시 누르면 종료)
· Tracing 예 - notepad_upx
◦ Windows XP에서 기본으로 제공되는 notepad를 UPX로 Packing한 File을 이용한 예이다.
◦ 실행과정
▹ Loop 1
▹ Loop 2
▹ Loop 3
▹ Loop 4
▹ OEP 제어 이동 및 원본 Program 실행
◦ Loop 1
▹ 내용을 살펴보면 단순한 Loop라는 것을 알 수 있다.
▹ 위 Loop를 0x36B(875)회 반복한다.
▹ 위 Loop를 빠져나오기 위해 '010153E6'에 BP를 설정 후 실행해 Loop에서 빠져나온다.
◦ Loop 2
▹ 위 구간이 두 번째 Loop로 Animate Over(Ctrl + F8)로 진행해보면 위 전체구간이 계속 반복됨을 알 수 있다.
▹ 위 구간은 Decoding을 진행하는 Loop이다.
▹ 위 구간을 빠져나오기 위해 '01015402'에 BP를 설정 후 실행해 Loop를 빠져나온다.
◦ Loop 3
▹ 원본 Code의 CALL/JMP 명령어의 Destination 주소를 복원시켜주는 Code이다.
▹ 위 구간을 빠져나오기 위해 '01015436'에 BP를 설정 후 실행해 Loop를 빠져나온다.
◦ Loop 4
▹ IAT(Code, Data, Resource)를 복원하는 Loop이다.
▹ 'LEA EDI, DWORD PTR DS:[ESI+13000]' 명령어가 EDI를 '01014000'으로 설정한다.
▹ 해당 영역(01014000)에는 원본 Program의 API 이름 문자열이 저장되어 있다.
▹ 위 Loop가 끝나면 IAT 복원 과정이 끝난다.
◦ OEP 제어 이동 및 원본 Program 실행
▹ POPAD 명령어는 PUSHAD 명령어와 대응하는 명령어로 Register를 원래대로 되돌리는 Code이다.
▹ 마지막에 BP로 설정되어 있는 JMP 명령(JMP notepad_.0100739D)을 통해 OEP(Original Entry Point)로 이동해 원본 Program을 실행하게 된다.
· UPX를 이용해 Packing된 Program의 OEP를 보다 빨리 찾는 방법
◦ POPAD 명령어 이후의 JMP 명령어에 BP 설정
'Reversing > Theory' 카테고리의 다른 글
Chapter 9. 실행 압축(Run-Time Packer) I (0) | 2015.08.16 |
---|---|
Chapter 8. PE Header III - IAT & EAT (0) | 2015.08.16 |
Chapter 7. PE Header II - RVA to RAW (0) | 2015.08.16 |
Chapter 6. PE header I - PE Format (0) | 2015.08.16 |
Chapter 5. Calling Convention (0) | 2015.08.16 |