본문 바로가기

Reversing/Theory

Chapter 10. 실행 압축(Run-Time Packer) II - UPX

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