SlideShare a Scribd company logo
1 of 83
2016년 8월 16일
PE File Format & Packer
KUICS 장하진
2
Who am I?
 고려대학교 정보보호동아리 KUICS 12대 회장 (2015.12 ~ 현재)
 차세대 보안리더 양성프로그램 BoB 4기 수료생
 https://joveler.kr
 https://ied206.github.io
 https://github.com/ied206
 http://www.slideshare.net/ied206
KUICS
PE File Format
exe 파일의 정체는?
4
PE File이란?
 Windows에서 사용하는 실행 파일 포맷
 Portable Executable의 약자
 대표적인 PE File Format
- exe (실행 파일)
- dll (동적 링크 라이브러리)
- sys (드라이버)
KUICS
5
PE File 구조
 다음과 같은 구조로 이루어져 있다.
 DOS Header
 DOS Stub
 COFF File Header
 Optional Header
 Section Header
 Sections
- .text, .data 등
KUICS
6
PE File 구조 – 1) DOS Header & Stub
 PE File은 DOS의 MZ 실행 파일 규격에 대한 하위 호환성을 지닌다.
 MS-DOS에서 Windows의 exe 파일을 실행할 경우 다음과 같은 문구를 볼 수 있
다.
 동일 exe 파일은 Windows에서 다음과 같이 실행된다.
 즉, 하나의 파일이 운영체제에 따라 다르게 실행된다.
KUICS
7
PE File 구조 – 1) DOS Header & Stub
 이러한 구조가 가능한 이유?
 PE File은 DOS MZ 규격을 확장한 형태이다.
 DOS Header
 DOS Stub
 DOS에서 PE File을 실행하면 DOS Stub을 실행하고 종료한다.
 Windows에서 PE File을 실행할 때, 이 DOS 관련 부분을 곧바로 건너뛴다.
KUICS
8
PE File 구조 – 2) COFF File Header
 PE File은 MZ 포맷의 확장이기도 하지만 COFF 포맷의 확장이기도 하다.
 대표적으로 다음과 같은 값을 지닌다.
 Machine
 SizeOfOptionalHeader
 Characteristics
KUICS
9
PE File 구조 – 3) Optional File Header
 PE File이 메모리에 로드되기 위해 필요한 정보들이 이곳에 담겨 있다.
 AddressOfEntryPoint
 ImageBase
 SectionAlignment
 FileAlignment
 SizeOfImage
 SizeOfHeader
 Subsystem
 NumberOfRavAndSizes
 DataDirectory
KUICS
10
PE File 구조 – 3) Optional File Header
 AddressOfEntryPoint
- 처음 실행될 때 어디부터 시작할지 결정
 ImageBase
- 가상 메모리 주소에서 PE File이 로드되는 기준 위치
 FileAlignment & SectionAlignment
- Section의 크기는 반드시 특정 값의 배수여야 한다.
- 파일 상태 : FileAlignment의 배수
- 메모리 : SectionAlignment의 배수
 SizeOfImage
- PE 파일이 메모리에 로드되었을 때 차지하는 크기
 Subsystem
- PE 파일이 실행될 때 사용하는 Windows의 Subsystem
KUICS
11
PE File 구조 – 4) Section
 실행 파일은 크게 기계어와 기계어가 사용하는 데이터로 이루어져 있다.
 PE File은 이들을 별도의 영역에 분리해 보관한다.
 .text
- 기계어 코드
 .data
- 데이터 (전역변수, 상수 등)
 .rsrc
- 아이콘 등의 리소스
KUICS
12
PE File 구조 – 4) Section
 각각의 Section은 별도의 권한을 가진다.
 Ex) Read, Write, Execute
 .text
- Read, Execute
 .data
- Read, Write
 .rsrc
- Read, Write
KUICS
13
PE File 구조 – 4) Section
 Section Header
- 각 섹션에 대한 정보가 담겨 있다.
 VirtualSize
 VirtualAddress (VirtualOffset)
- 섹션이 메모리에 로딩되었을 상태의 크기와 시작 위치
- VirtualAddress는 SectionAlignment의 배수
 SizeOfRawData (RawSize)
 PointerToRawData (RawOffset)
- 파일 상태일때의 섹션의 크기와 시작 위치
- PointerToRawData는 FileAlignment의 배수
 Characteristics
- 섹션의 속성 (Ex 권한)
KUICS
14
PE File 구조 – 4) Section
PE
(File)
.text
.data
.rsrc
KUICS
PE
(Memory)
.text
.data
.rsrc
15
VA & RVA
 하나의 exe 파일이 실행될 때는 다음
과 같이 메모리 구역을 용도에 맞게
나눠 사용한다.
 다양한 dll도 함께 로드된다.
KUICS
16
VA & RVA
 Virtual Memory (VA)
- 가상 메모리의 절대주소
 Relative Virtual Memory (RVA)
- Base Address부터의 상대주소
 PE File 내부의 메모리 주소는 RVA로 표현되어 있다.
 PE File이 메모리에 올라갈 때 RVA 주소값은 절대주소인 VA로 변환된다.
 RVA로 메모리 주소를 표현한 이유는 Base Address는 로드시마다 다르게 바뀔
수 있기 때문이다.
 PE 파일을 조작하고 분석하기 위해선 RVA와 RAW의 관계를 잘 알아야 한다.
KUICS
17
VA & RVA
 다음 이유들로 인해 메모리와 파일 형태에 차이가 생긴다.
- FileAlignment와 SectionAlignment의 차이
- RVA의 사용
 메모리 형태에서 본 주소를 PE 파일과 매핑하려면, VA와 RVA 사이의 관계를 알아
야 한다.
 VA = BaseAddress + RVA
 RAW – PointerToRawData = RVA – VirtualAddress
 PointerToRawData : 파일에서 RVA가 속해 있는 섹션의 시작 위치
 VirtualAddress : 메모리에서 RVA가 속해 있는 섹션의 시작 위치
KUICS
18
PE File 구조 – 4) Section
PE
(File)
.text
.data
.rsrc
KUICS
PE
(Memory)
.text
.data
.rsrc
19
IAT
 Import Address Table
- dll에서 불러 사용하는 함수의 주소값을 보관할 영역
 dll에서 불러 사용하는 함수의 주소는 PE 파일의 상태에 따라 다르다.
- 파일 형태에서는 RVA로 표현되어 있다.
- 메모리에 로드되면 이 RVA가 VA값으로 바뀐다.
KUICS
20
IAT
 CloseHandle의 주소가 0x400000 + 0x122B8로 표기되어 있다.
 0x4122B8를 통해 0x73BB9660에 있는 Kernel32.dll의 CloseHandle로 간다.
 dll에 있는 함수를 호출하는 경우, 이와 같이 IAT를 활용한 간접 호출을 한다.
KUICS
21
IAT
 실행파일 내부에서 API를 호출할 때 다음과 같은 과정을 거친다.
- 코드 -> API (X)
- 코드 -> IAT -> API (O)
 후자는 속도가 더 느려지지 않을까?
 DLL이 메모리에 로드될 때 ImageBase 값이 변경될 수 있다.
 VA는 ImageBase 값에 따라 변동된다.
 이러한 특징 때문에 API의 주소를 VA로 하드코딩할 수 없다.
 따라서, API의 주소는 dll에 대한 RVA로 적혀 있으며 dll이 로딩되는 시점에 VA로
변환된다.
KUICS
PE Packer 분석
UPX와 UPack의 세계로!
KUICS
23
PE Packer
 Packer의 종류
 Compressor
- 실행 프로그램의 용량을 줄인다.
Ex) UPX
 Protector
- 실행 프로그램의 역공학을 방해한다.
- 상용프로그램의 경우, 핵심 알고리즘의 역공학을 막기 위해 사용
Ex) Themida
- 악성코드는 백신 탐지를 어렵게 할 목적으로 사용
Ex) UPack
KUICS
24
Compressor : UPX
 실행 압축계의 No1 패커
- http://upx.sourceforge.net/
 다양한 운영체제와 아키텍쳐를 지원한다.
- OS : Windows, macOS, Linux, FreeBSD, OpenBSD, NetBSD, MS-DOS 등
- Arch : amd64, i386, arm, mips, powerpc 등
 압축해제 속도가 매우 빠른 UCL 라이브러리를 사용
- 실행 압축 특성상 압축해제가 빨라야 한다.
 작동 방법
- 1) SFX 형태로 임시 폴더에 압축을 해제하여 실행 (extract to temp file)
- 2) 실행되는 시점에 메모리에 압축 해제를 하고 실행 (in-place)
- 대부분 2번 in-place 방법을 사용
KUICS
25
Compressor : UPX
 구조를 알아보기 위해 한 실행 프로그램을 패킹하고, 분석해보자.
 패킹 전
- 다양한 섹션이 존재하는 것을 확인할 수 있다.
- 섹션의 용도에 맞는 권한들을 가지고 있다.
KUICS
26
Compressor : UPX
 패킹 중
 212KB가 175KB로 줄어들었다
KUICS
27
Compressor : UPX
 패킹 후
- rsrc 섹션을 제외한 나머지 섹션들이 사라졌다.
- UPX0, UPX1 모두 Read/Write/Execute 권한을 가지고 있다.
- UPX0의 RawSize는 0이다 (파일 상태에서는 존재하지 않는다).
- UPX0의 VirtualSize는 원본 파일의 섹션의 크기를 다 더한 것보다 크다.
- UPX1은 RawSize를 가지고 있으며 VirtualSize의 크기와 같다.
- UPX1에 EntryPoint가 존재한다.
 이것들이 의미하는 바는?
KUICS
28
Compressor : UPX
 패킹 후
 가정
- UPX1 섹션에 EP가 존재하므로, 압축해제 코드가 존재하리라 알 수 있다.
- UPX0 섹션의 RawSize가 0이지만 VirtualSize는 값이 크다는 점에서, 이 프로그램이
실행되는 시점에 원래의 데이터가 UPX0에 압축해제됨을 추측할 수 있다.
- rsrc 섹션의 크기는 거의 똑같으므로, 압축된 데이터는 UPX1 섹션에 존재할 것이다.
- UPX0 섹션은 Read/Write/Execute 권한을 모두 가지고 있으므로, code 섹션
(Read/Execute)과 data 섹션 (Read/Write)의 역할을 모두 할 것이다.
KUICS
29
Compressor : UPX
 패킹 후
 섹션 Offset (ImageAddress + VirtualOffset)
- UPX0 = 0x400000 + 0x01000 = 0x401000 (~0x436FFFF)
- UPX1 = 0x400000 + 0x37000 = 0x437000 (~0x43CFFFF)
 EntryPoint
- EP = 0x400000 + 0x3CC50 = 0x43CC50
- EP는 UPX1 섹션에 존재한다.
KUICS
30
Compressor : UPX
 UPX의 압축 해제 코드를 분석해보자.
 IDA로 패킹된 프로그램을 열 경우 IAT가 깨져있다는 경고가 나타난다.
 -> UPX는 압축시 IAT를 건드린다는 점을 알 수 있다.
KUICS
31
Compressor : UPX
 패킹 전의 IAT
KUICS
32
Compressor : UPX
 패킹 후의 IAT
 압축 해제에 필수적인 API만 제대로 표시되고 있다.
KUICS
33
Compressor : UPX
 패킹된 파일은 단 두개의 함수만을 가지고 있다.
 start 함수가 압축해제 코드일 가능성이 높다.
KUICS
34
Compressor : UPX
 start 함수는 PUSHA로 시작하여 POPA ~ JMP 문으로 끝난다.
KUICS
35
Compressor : UPX
 첫 부분에서 ESI와 EDI를 세팅하고 있다.
 어셈블리어에서 ESI와 EDI가 쓰일 경우 관용적으로 다음을 가리킨다.
- ESI : Source, 데이터를 읽어올 주소
- EDI : Destination, 데이터를 쓸 주소
 즉, 다음 가능성이 높다.
- ESI : 압축된 데이터의 주소
- EDI : 원본 데이터가 들어가야 할 위치
KUICS
36
Compressor : UPX
 첫 부분에서 ESI와 EDI를 세팅하고 있다.
 세팅되는 값을 살펴보자.
- ESI = 0x437015
- EDI = 0x401000
 즉, ESI는 UPX1 섹션, EDI는 UPX0 섹션을 가리키고 있다.
- UPX0 = 0x401000 ~ 0x436FFFF
- UPX1 = 0x437000 ~ 0x43CFFFF
KUICS
37
Compressor : UPX
 [EDI]에 쓰기를 하는 코드가 있는 곳이 패킹된 파일을 원래 상태로 복구하는 핵심
부분이다.
KUICS
38
Compressor : UPX
 CALL을 만났다.
 뭐하는 녀석이지?
KUICS
39
Compressor : UPX
 더 진행하면 CALL로 함수를 호출하는 부분이 존재한다.
KUICS
40
Compressor : UPX
 동적 분석 결과, LoadLibrary와 GetProcAddress를 호출하고 있음을 알 수 있다.
KUICS
41
Compressor : UPX
 UPX로 패킹된 프로그램은 IAT Table에 함수의 RVA가 없어 불완전하다.
 LoadLibrary로 dll을 로드하고 그 주소를 EBP에 저장한다.
 dll 명단은 IAT에서 직접 가져온다.
KUICS
42
 UPX로 패킹된 프로그램은 IAT Table에 함수의 RVA가 없어 불완전하다.
 GetProcAddress을 dll 주소 (EBP), 함수 이름(EDI)을 인자로 주고 호출한다.
 API의 주소(VA)를 얻어 (EAX) EBX가 가리키는 곳에 복사한다.
Compressor : UPX
KUICS
43
Compressor : UPX
 마무리로, 메모리 특정 구역의 권한을 설정한다.
KUICS
44
Compressor : UPX
 동적 분석 결과, 다음과 같은 작업을 한다.
 VirtualProtect(0x400000, 0x1000, PAGE_READWRITE, &지역변수);
 VirtualProtect(0x400000, 0x1000, PAGE_READONLY, &지역변수);
 TlsCallback(…);
KUICS
45
Compressor : UPX
 마지막 단계
 POPA 명령으로 레지스터를 복구한다.
 그 뒤 원래의 EP로 JMP한다.
KUICS
46
Compressor : UPX
 패킹 전 원본 파일의 EP
KUICS
47
Compressor : UPX
 패킹된 프로그램의 압축해제 전 (원본의 EP)
 NULL Padding만 존재한다.
KUICS
48
Compressor : UPX
 패킹된 프로그램의 압축해제 후 (원본의 EP)
 원본과 같은 코드가 나타난 것을 볼 수 있다.
KUICS
49
Compressor : UPX
 UPX 압축해제가 정상적으로 끝난 상태에서 F9를 눌러주면?
 원본이 실행되듯이 정상적으로 잘 실행된다.
KUICS
50
Compressor : UPX
 결론
 UPX의 압축 해제는 다음과 같은 순서로 진행된다.
 UCL 알고리즘으로 압축된 PE 섹션의 압축 해제 -> IAT 복구
KUICS
51
Compressor : UPX
 사족 : 디버거의 빼애애액
 패커가 적용되었을 때 디버거에서 BP를 걸면 다음과 같은 경고 메시지가 뜬다.
 디버거는 EP를 보고 어떤 섹션이 code 섹션인지 구분한다.
 패커가 EP를 다른 섹션으로 바꿔버렸기 때문에 디버거에 혼동이 온 것.
KUICS
52
Protector : UPack
 PE 파일을 난독화시키는 패커이다.
 헤더를 꼬아 파일의 구조를 완벽하게 바꿔 버리기에 리버싱에 큰 지장이 온다.
 Windows의 PE 로더가 PE 표준 규격보다 너그럽게 구현된 것을 악용한다.
KUICS
53
Protector : UPack
 원본 PE 파일 헤더 구조
- 헤더들이 순서대로 붙어 있다.
KUICS
DOS MZ Header
COFF
Header
DOS
Stub
Optional Header
54
Protector : UPack
 UPack으로 패킹한 후의 PE 헤더
- 헤더들이 이리저리 꼬여 있다.
KUICS
DOS MZ Header
COFF
Header
Optional
Header
55
Protector : UPack
헤더 겹치기
 Windows는 DOS Stub을 전혀 참고하지 않으며, MZ Header의 맨 마지막 값,
e_lfnew 값을 보고 PE 헤더의 시작점을 찾는다.
 PE 규격에 COFF Header의 시작 오프셋은 정해져 있지 않다.
 MZ Header의 e_lfnew 값을 MZ Header의 바깥이 아닌, 안을 향하게 만들어
서 헤더를 겹치게 만든다.
KUICS
DOS MZ Header
COFF
Header
Optional
Header
56
Protector : UPack
Section 겹치기 + Alignment 꼬기
 섹션의 메모리상 Offset (ImageAddress + VirtualOffset)
- Sec01 = 0x400000 + 0x01000 = 0x401000 (~0x43BFFFF)
- Sec02 = 0x400000 + 0x3C000 = 0x43C000 (~0x46DFFFF)
- Sec03 = 0x400000 + 0x6E000 = 0x46E000 (~0x46EFFFF)
 섹션의 파일상 Offset (PointerToRawData)
- Sec01 = 0x000010 ~ 0x0001FF
- Sec02 = 0x000200 ~ 0x02AAB7
- Sec03 = 0x000010 ~ 0x0001FF
 파일상 Offset이 이상하다?
KUICS
57
Protector : UPack
Section 겹치기 + Alignment 꼬기
 섹션의 파일상 Offset (PointerToRawData)
- Sec01 = 0x000010 ~ 0x0001FF
- Sec02 = 0x000200 ~ 0x02AAB7
- Sec03 = 0x000010 ~ 0x0001FF
 파일상 Offset이 이상하다?
- 파일상의 Offset은 반드시 FileAlignment의 배수여야 한다.
- 일반적으로 FlieAlignment는 0x200 (512)의 값을 가진다.
- 그런데 0x10은 0x200의 배수가 아니다.
 Windows의 PE Loader는 이 경우 강제로 배수에 맞춘다.
KUICS
58
Protector : UPack
Section 겹치기 + Alignment 꼬기
 즉 여기서 0x10의 RawOffset은 0x0 또는 0x200으로 교정된다.
- 테스트 결과 0x00으로 계산됨
 실제 파일상 Offset (PointerToRawData)
- Sec01 = 0x000000 ~ 0x0001EF
- Sec02 = 0x000200 ~ 0x02AAB7
- Sec03 = 0x000000 ~ 0x0001EF
 RAW to RVA를 계산할 때도 이 점에 유의해야 한다.
KUICS
59
Protector : UPack
Section 겹치기 + Alignment 꼬기
 EntryPoint (RAW)를 계산해보자.
 헤더에 따르면, EntryPoint (RVA)는 0x00001018이다.
 이 RAW 주소는 Sec01 및 Sec03에 속한다.
 RAW = RVA–VirtualOffset + RawOffset
 EP (RAW) = 0x1018 – 0x1000 + 0x10 = 0x28 (X)
 그러나 RawOffset이 0x10으로, 0x200의 배수가 아니므로 0x0으로 교정한다.
 EP (RAW) = 0x1018 – 0x1000 + 0x0 = 0x18(O)
KUICS
60
Protector : UPack
 x64dbg의 경우, Sec01에 진입을 시도할 시 크래시가 발생한다.
KUICS
61
Protector : UPack
 Immunity
Debugger
 패킹된 프로그램의
EP로 접근하지
못한다.
KUICS
62
Protector : UPack
 UPack이 RAW to RVA 변환법을 꼬아놓기에 Immunity Debugger가 EP를 제
대로 계산하지 못해 발생하는 문제이다.
 EP를 강제로 지정해야 디버깅이 가능하다.
 EP = ImageBase + EntryPoint (RVA)
 EP = 0x400000 + 0x001018 = 0x401018
KUICS
63
Protector : UPack
 EP를 강제로 지정해야 디버깅이 가능하다.
 Ctrl + G -> 00401018 (EP) 입력
 New origin here로 EP 강제 지정.
KUICS
64
Protector : UPack
 정상적인 PE 파일이 아니기에 Ctrl + G를 통해 00401018로 직접 이동하지 않으
면 어셈블리 코드가 비정상적으로 표기된다.
 정상
 디버거의 표시
KUICS
65
Protector : UPack
 IDA Pro는?
 경고 5관왕 달성!
KUICS
66
Protector : UPack
 4) Section 겹치기 + Alignment 꼬기
 섹션의 파일상 Offset (PointerToRawData)
- Sec01 = 0x000010 ~ 0x0001FF
- Sec02 = 0x000200 ~ 0x02AAB7
- Sec03 = 0x000010 ~ 0x0001FF
 파일상 Offset이 이상하다?
- 파일상의 Offset은 반드시 FileAlignment의 배수여야 한다.
- 일반적으로 FlieAlignment는 0x200 (512)의 값을 가진다.
- 그런데 0x10은 0x200의 배수가 아니다.
 Windows의 PE Loader는 이 경우 강제로 배수에 맞춘다.
KUICS
67
Protector : UPack
 가정
 Sec01은 파일 상태의 크기는 작으나, 메모리 상태의 크기는 크다.
 Sec02는 파일 상태의 크기와 메모리 상태의 크기가 모두 크다.
 Sec03은 파일 상태의 크기와 메모리 상태의 크기가 모두 작다.
 용량으로 보아 Sec02에 압축된 원본 데이터가 존재하리라 추측할 수 있다.
 Sec01이 Sec02보다 메모리 상태의 크기가 더 크다.
 이를 통해 Sec01에 원본 데이터가 압축해제 된다는 점을 추측할 수 있다.
KUICS
68
Protector : UPack
 EP에서 몇가지 연산을 수행한 이후 0x004667A3 으로 JMP한다.
KUICS
69
Protector : UPack
 0x4667A3 이후부터는 CALL DWORD PTR [ESI] 구문이 자주 등장한다.
KUICS
70
Protector : UPack
 CALL DWORD PTR DS:[ESI] 실행시 0x46675B 함수를 호출한다.
 인자를 EAX와 EDX로 받는다.
 자주 호출되는 것을 보아 압축 해제를 담당하는 코드일 가능성이 높다.
KUICS
71
Protector : UPack
 [ESI] 뿐만 아니라 [ESI+54], [ESI+50]도 호출하고 있다.
KUICS
72
Protector : UPack
 BP를 걸고 F9를 계속 눌러보자.
KUICS
73
Protector : UPack
 원본 프로그램의
.text 섹션
 패킹된 프로그램
디버깅 중 살펴본
동일 영역
KUICS
압축 해제가
이루어지고
있다.
74
Protector : UPack
 이 시점에서 다시 IAT를 살펴보자.
 IAT를 복구할 때 필요한 두 API만 여기에 존재한다.
 원래의 IAT 명단을 복구해야 하므로, IAT를 복구하는 코드가 존재할 것이다.
KUICS
75
Protector : UPack
 그런데 이 주소를 직접 부르고 있지 않아 정적 분석으로는 추적이 불가능하다!
 동적 분석 중 0x4011E8나 0x4011EC를 CALL하는 부분을 찾자.
 모든 CALL에 BP를 걸고 진행하며 찾다보면 나오지 않을까?
KUICS
76
Protector : UPack
 0x466923
 LoadLibraryA("GDI32.DLL");
KUICS
77
Protector : UPack
 0x46693A
 GetProcAddress([HANDLE of GDI32.DLL], "BitBlt");
KUICS
78
Protector : UPack
 EAX에 BitBlt 값이 반환되고, STOS를 통해 EAX의 값을 [EDI]에 복사한다.
KUICS
79
Protector : UPack
 F9를 반복해서 눌러 상황을 보자.
 IAT가 복구되고 있다.
KUICS
80
Protector : UPack
 IAT를 복구한 뒤 원래의 EP로 JMP한다.
KUICS
패킹 전 원본 파일
패킹 복구 후
81
Protector : UPack
 결론
 UPack도 UPX와 마찬가지로 실행시 압축 해제 -> IAT 복구 순서를 거친다.
 용량을 줄이기 위해 압축만 하는 UPX와는 달리, UPack은 PE 헤더의 값을 꼬아 분
석의 난이도를 높인다.
 결과적으로 리버싱과 같은 바이너리 분석을 크게 방해한다.
KUICS
Q&A
KUICS
2016-08-19 동아리이름

More Related Content

What's hot

사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401guest91f89d83
 
도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편Sam Kim
 
우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기Hoyoung Jung
 
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은jieun kim
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploitsGangSeok Lee
 
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹GangSeok Lee
 
Text to Speech 사용법
Text to Speech 사용법Text to Speech 사용법
Text to Speech 사용법Dahyun Kim
 
망고100 보드로 놀아보자 14
망고100 보드로 놀아보자 14망고100 보드로 놀아보자 14
망고100 보드로 놀아보자 14종인 전
 
Apache httpd ( 아파치 웹서버 ) 설치 가이드
Apache httpd ( 아파치 웹서버 ) 설치 가이드Apache httpd ( 아파치 웹서버 ) 설치 가이드
Apache httpd ( 아파치 웹서버 ) 설치 가이드Opennaru, inc.
 
Ryu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIRyu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIjieun kim
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Kwen Won Lee
 
Windows reversing study_basic_7
Windows reversing study_basic_7Windows reversing study_basic_7
Windows reversing study_basic_7Jinkyoung Kim
 
Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1Jinkyoung Kim
 
Function calling convention
Function calling conventionFunction calling convention
Function calling conventionYuk SeungChan
 
[241] 하나의 cpu 에 운영제체 두 개 김성민
[241] 하나의 cpu 에 운영제체 두 개 김성민[241] 하나의 cpu 에 운영제체 두 개 김성민
[241] 하나의 cpu 에 운영제체 두 개 김성민NAVER D2
 

What's hot (20)

04 프로세스
04 프로세스04 프로세스
04 프로세스
 
사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401사내스터디 발표 온라인게임서버이해 20100401
사내스터디 발표 온라인게임서버이해 20100401
 
도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편
 
우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기
 
System+os study 3
System+os study 3System+os study 3
System+os study 3
 
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
 
System+os study 1
System+os study 1System+os study 1
System+os study 1
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
 
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
[2011 CodeEngn Conference 05] ashine - 안드로이드 리눅스에서의 시스템 해킹
 
Text to Speech 사용법
Text to Speech 사용법Text to Speech 사용법
Text to Speech 사용법
 
망고100 보드로 놀아보자 14
망고100 보드로 놀아보자 14망고100 보드로 놀아보자 14
망고100 보드로 놀아보자 14
 
Apache httpd ( 아파치 웹서버 ) 설치 가이드
Apache httpd ( 아파치 웹서버 ) 설치 가이드Apache httpd ( 아파치 웹서버 ) 설치 가이드
Apache httpd ( 아파치 웹서버 ) 설치 가이드
 
System+os study 4
System+os study 4System+os study 4
System+os study 4
 
Ryu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIRyu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST API
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표
 
Windows reversing study_basic_7
Windows reversing study_basic_7Windows reversing study_basic_7
Windows reversing study_basic_7
 
Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1
 
Function calling convention
Function calling conventionFunction calling convention
Function calling convention
 
[241] 하나의 cpu 에 운영제체 두 개 김성민
[241] 하나의 cpu 에 운영제체 두 개 김성민[241] 하나의 cpu 에 운영제체 두 개 김성민
[241] 하나의 cpu 에 운영제체 두 개 김성민
 

Viewers also liked

PE Packers Used in Malicious Software - Part 1
PE Packers Used in Malicious Software - Part 1PE Packers Used in Malicious Software - Part 1
PE Packers Used in Malicious Software - Part 1amiable_indian
 
해시암호와 비밀번호 - 9th KUSISWALL
해시암호와 비밀번호 - 9th KUSISWALL해시암호와 비밀번호 - 9th KUSISWALL
해시암호와 비밀번호 - 9th KUSISWALLHajin Jang
 
공인인증서 크래킹 - Inc0gnito 2015
공인인증서 크래킹 - Inc0gnito 2015공인인증서 크래킹 - Inc0gnito 2015
공인인증서 크래킹 - Inc0gnito 2015Hajin Jang
 
the PE format 2011/01/17
the PE format 2011/01/17the PE format 2011/01/17
the PE format 2011/01/17Ange Albertini
 
PE102 - a Windows executable format overview (booklet V1)
PE102 - a Windows executable format overview (booklet V1)PE102 - a Windows executable format overview (booklet V1)
PE102 - a Windows executable format overview (booklet V1)Ange Albertini
 
Pe Format
Pe FormatPe Format
Pe FormatHexxx
 
PE Trojan Detection Based on the Assessment of Static File Features
PE Trojan Detection Based on the Assessment of Static File FeaturesPE Trojan Detection Based on the Assessment of Static File Features
PE Trojan Detection Based on the Assessment of Static File FeaturesAntiy Labs
 
Exploring the Portable Executable format
Exploring the Portable Executable formatExploring the Portable Executable format
Exploring the Portable Executable formatAnge Albertini
 
비밀번호 486 공인인증서와 액티브X
비밀번호 486 공인인증서와 액티브X비밀번호 486 공인인증서와 액티브X
비밀번호 486 공인인증서와 액티브Xkmhyekyung
 
Reversing & malware analysis training part 3 windows pe file format basics
Reversing & malware analysis training part 3   windows pe file format basicsReversing & malware analysis training part 3   windows pe file format basics
Reversing & malware analysis training part 3 windows pe file format basicssecurityxploded
 
Primer on password security
Primer on password securityPrimer on password security
Primer on password securitysecurityxploded
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기ChangKyu Song
 
Spark & Zeppelin을 활용한 머신러닝 실전 적용기
Spark & Zeppelin을 활용한 머신러닝 실전 적용기Spark & Zeppelin을 활용한 머신러닝 실전 적용기
Spark & Zeppelin을 활용한 머신러닝 실전 적용기Taejun Kim
 
텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 Yong Joon Moon
 
07.flash memory technology
07.flash memory technology07.flash memory technology
07.flash memory technologyruchiusha
 

Viewers also liked (17)

PE Packers Used in Malicious Software - Part 1
PE Packers Used in Malicious Software - Part 1PE Packers Used in Malicious Software - Part 1
PE Packers Used in Malicious Software - Part 1
 
해시암호와 비밀번호 - 9th KUSISWALL
해시암호와 비밀번호 - 9th KUSISWALL해시암호와 비밀번호 - 9th KUSISWALL
해시암호와 비밀번호 - 9th KUSISWALL
 
공인인증서 크래킹 - Inc0gnito 2015
공인인증서 크래킹 - Inc0gnito 2015공인인증서 크래킹 - Inc0gnito 2015
공인인증서 크래킹 - Inc0gnito 2015
 
the PE format 2011/01/17
the PE format 2011/01/17the PE format 2011/01/17
the PE format 2011/01/17
 
Protection
ProtectionProtection
Protection
 
PE102 - a Windows executable format overview (booklet V1)
PE102 - a Windows executable format overview (booklet V1)PE102 - a Windows executable format overview (booklet V1)
PE102 - a Windows executable format overview (booklet V1)
 
Pe Format
Pe FormatPe Format
Pe Format
 
PE Trojan Detection Based on the Assessment of Static File Features
PE Trojan Detection Based on the Assessment of Static File FeaturesPE Trojan Detection Based on the Assessment of Static File Features
PE Trojan Detection Based on the Assessment of Static File Features
 
PE File Format
PE File FormatPE File Format
PE File Format
 
Exploring the Portable Executable format
Exploring the Portable Executable formatExploring the Portable Executable format
Exploring the Portable Executable format
 
비밀번호 486 공인인증서와 액티브X
비밀번호 486 공인인증서와 액티브X비밀번호 486 공인인증서와 액티브X
비밀번호 486 공인인증서와 액티브X
 
Reversing & malware analysis training part 3 windows pe file format basics
Reversing & malware analysis training part 3   windows pe file format basicsReversing & malware analysis training part 3   windows pe file format basics
Reversing & malware analysis training part 3 windows pe file format basics
 
Primer on password security
Primer on password securityPrimer on password security
Primer on password security
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
 
Spark & Zeppelin을 활용한 머신러닝 실전 적용기
Spark & Zeppelin을 활용한 머신러닝 실전 적용기Spark & Zeppelin을 활용한 머신러닝 실전 적용기
Spark & Zeppelin을 활용한 머신러닝 실전 적용기
 
텐서플로우 기초 이해하기
텐서플로우 기초 이해하기 텐서플로우 기초 이해하기
텐서플로우 기초 이해하기
 
07.flash memory technology
07.flash memory technology07.flash memory technology
07.flash memory technology
 

Similar to PE File Format and Packer - Inc0gnito 2016

[오픈소스컨설팅] RPM 만들기
[오픈소스컨설팅] RPM 만들기[오픈소스컨설팅] RPM 만들기
[오픈소스컨설팅] RPM 만들기Ji-Woong Choi
 
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은jieun kim
 
포렌식 세미나.pptx
포렌식 세미나.pptx포렌식 세미나.pptx
포렌식 세미나.pptxdalonn
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoMario Cho
 
Kernel 2.6 makefile_분석(송형주)
Kernel 2.6 makefile_분석(송형주)Kernel 2.6 makefile_분석(송형주)
Kernel 2.6 makefile_분석(송형주)iamhjoo (송형주)
 
rpm package 를 이용한 MySQL 설치자동화
rpm package 를 이용한 MySQL 설치자동화rpm package 를 이용한 MySQL 설치자동화
rpm package 를 이용한 MySQL 설치자동화I Goo Lee
 
Open vSwitch의 Vendor Extension 구현
Open vSwitch의 Vendor Extension 구현Open vSwitch의 Vendor Extension 구현
Open vSwitch의 Vendor Extension 구현Seung-Hoon Baek
 
2006 03 15_pe & api hook
2006 03 15_pe & api hook2006 03 15_pe & api hook
2006 03 15_pe & api hook용환 노
 
[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick Guide
[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick Guide[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick Guide
[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick GuideJi-Woong Choi
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리Seungyong Lee
 
Linux programming study
Linux programming studyLinux programming study
Linux programming studyYunseok Lee
 
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)Ubuntu Korea Community
 
Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호용호 최
 
PCF Installation Guide
PCF Installation GuidePCF Installation Guide
PCF Installation Guideseungdon Choi
 
RHEL8 Kernel Management Manual in Korean
RHEL8 Kernel Management Manual in KoreanRHEL8 Kernel Management Manual in Korean
RHEL8 Kernel Management Manual in KoreanJun Hee Shin
 
Osc4.x installation v1-upload
Osc4.x installation v1-uploadOsc4.x installation v1-upload
Osc4.x installation v1-uploadDong-Hwa jung
 
MySQL Deep dive with FusionIO
MySQL Deep dive with FusionIOMySQL Deep dive with FusionIO
MySQL Deep dive with FusionIOI Goo Lee
 

Similar to PE File Format and Packer - Inc0gnito 2016 (20)

[오픈소스컨설팅] RPM 만들기
[오픈소스컨설팅] RPM 만들기[오픈소스컨설팅] RPM 만들기
[오픈소스컨설팅] RPM 만들기
 
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
20150502 unix v6로 배우는 커널의 원리와 구조 1 김지은
 
포렌식 세미나.pptx
포렌식 세미나.pptx포렌식 세미나.pptx
포렌식 세미나.pptx
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
 
Kernel 2.6 makefile_분석(송형주)
Kernel 2.6 makefile_분석(송형주)Kernel 2.6 makefile_분석(송형주)
Kernel 2.6 makefile_분석(송형주)
 
rpm package 를 이용한 MySQL 설치자동화
rpm package 를 이용한 MySQL 설치자동화rpm package 를 이용한 MySQL 설치자동화
rpm package 를 이용한 MySQL 설치자동화
 
Open vSwitch의 Vendor Extension 구현
Open vSwitch의 Vendor Extension 구현Open vSwitch의 Vendor Extension 구현
Open vSwitch의 Vendor Extension 구현
 
ice_grad
ice_gradice_grad
ice_grad
 
Pe+file+format
Pe+file+formatPe+file+format
Pe+file+format
 
2006 03 15_pe & api hook
2006 03 15_pe & api hook2006 03 15_pe & api hook
2006 03 15_pe & api hook
 
[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick Guide
[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick Guide[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick Guide
[오픈소스컨설팅] Red Hat ReaR (relax and-recover) Quick Guide
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리
 
Linux programming study
Linux programming studyLinux programming study
Linux programming study
 
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)
강분도 - 나만의 우분투 배포판 만들기 (2011Y06M25D)
 
Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호
 
PCF Installation Guide
PCF Installation GuidePCF Installation Guide
PCF Installation Guide
 
RHEL8 Kernel Management Manual in Korean
RHEL8 Kernel Management Manual in KoreanRHEL8 Kernel Management Manual in Korean
RHEL8 Kernel Management Manual in Korean
 
Oracle History #7
Oracle History #7Oracle History #7
Oracle History #7
 
Osc4.x installation v1-upload
Osc4.x installation v1-uploadOsc4.x installation v1-upload
Osc4.x installation v1-upload
 
MySQL Deep dive with FusionIO
MySQL Deep dive with FusionIOMySQL Deep dive with FusionIO
MySQL Deep dive with FusionIO
 

PE File Format and Packer - Inc0gnito 2016

  • 1. 2016년 8월 16일 PE File Format & Packer KUICS 장하진
  • 2. 2 Who am I?  고려대학교 정보보호동아리 KUICS 12대 회장 (2015.12 ~ 현재)  차세대 보안리더 양성프로그램 BoB 4기 수료생  https://joveler.kr  https://ied206.github.io  https://github.com/ied206  http://www.slideshare.net/ied206 KUICS
  • 3. PE File Format exe 파일의 정체는?
  • 4. 4 PE File이란?  Windows에서 사용하는 실행 파일 포맷  Portable Executable의 약자  대표적인 PE File Format - exe (실행 파일) - dll (동적 링크 라이브러리) - sys (드라이버) KUICS
  • 5. 5 PE File 구조  다음과 같은 구조로 이루어져 있다.  DOS Header  DOS Stub  COFF File Header  Optional Header  Section Header  Sections - .text, .data 등 KUICS
  • 6. 6 PE File 구조 – 1) DOS Header & Stub  PE File은 DOS의 MZ 실행 파일 규격에 대한 하위 호환성을 지닌다.  MS-DOS에서 Windows의 exe 파일을 실행할 경우 다음과 같은 문구를 볼 수 있 다.  동일 exe 파일은 Windows에서 다음과 같이 실행된다.  즉, 하나의 파일이 운영체제에 따라 다르게 실행된다. KUICS
  • 7. 7 PE File 구조 – 1) DOS Header & Stub  이러한 구조가 가능한 이유?  PE File은 DOS MZ 규격을 확장한 형태이다.  DOS Header  DOS Stub  DOS에서 PE File을 실행하면 DOS Stub을 실행하고 종료한다.  Windows에서 PE File을 실행할 때, 이 DOS 관련 부분을 곧바로 건너뛴다. KUICS
  • 8. 8 PE File 구조 – 2) COFF File Header  PE File은 MZ 포맷의 확장이기도 하지만 COFF 포맷의 확장이기도 하다.  대표적으로 다음과 같은 값을 지닌다.  Machine  SizeOfOptionalHeader  Characteristics KUICS
  • 9. 9 PE File 구조 – 3) Optional File Header  PE File이 메모리에 로드되기 위해 필요한 정보들이 이곳에 담겨 있다.  AddressOfEntryPoint  ImageBase  SectionAlignment  FileAlignment  SizeOfImage  SizeOfHeader  Subsystem  NumberOfRavAndSizes  DataDirectory KUICS
  • 10. 10 PE File 구조 – 3) Optional File Header  AddressOfEntryPoint - 처음 실행될 때 어디부터 시작할지 결정  ImageBase - 가상 메모리 주소에서 PE File이 로드되는 기준 위치  FileAlignment & SectionAlignment - Section의 크기는 반드시 특정 값의 배수여야 한다. - 파일 상태 : FileAlignment의 배수 - 메모리 : SectionAlignment의 배수  SizeOfImage - PE 파일이 메모리에 로드되었을 때 차지하는 크기  Subsystem - PE 파일이 실행될 때 사용하는 Windows의 Subsystem KUICS
  • 11. 11 PE File 구조 – 4) Section  실행 파일은 크게 기계어와 기계어가 사용하는 데이터로 이루어져 있다.  PE File은 이들을 별도의 영역에 분리해 보관한다.  .text - 기계어 코드  .data - 데이터 (전역변수, 상수 등)  .rsrc - 아이콘 등의 리소스 KUICS
  • 12. 12 PE File 구조 – 4) Section  각각의 Section은 별도의 권한을 가진다.  Ex) Read, Write, Execute  .text - Read, Execute  .data - Read, Write  .rsrc - Read, Write KUICS
  • 13. 13 PE File 구조 – 4) Section  Section Header - 각 섹션에 대한 정보가 담겨 있다.  VirtualSize  VirtualAddress (VirtualOffset) - 섹션이 메모리에 로딩되었을 상태의 크기와 시작 위치 - VirtualAddress는 SectionAlignment의 배수  SizeOfRawData (RawSize)  PointerToRawData (RawOffset) - 파일 상태일때의 섹션의 크기와 시작 위치 - PointerToRawData는 FileAlignment의 배수  Characteristics - 섹션의 속성 (Ex 권한) KUICS
  • 14. 14 PE File 구조 – 4) Section PE (File) .text .data .rsrc KUICS PE (Memory) .text .data .rsrc
  • 15. 15 VA & RVA  하나의 exe 파일이 실행될 때는 다음 과 같이 메모리 구역을 용도에 맞게 나눠 사용한다.  다양한 dll도 함께 로드된다. KUICS
  • 16. 16 VA & RVA  Virtual Memory (VA) - 가상 메모리의 절대주소  Relative Virtual Memory (RVA) - Base Address부터의 상대주소  PE File 내부의 메모리 주소는 RVA로 표현되어 있다.  PE File이 메모리에 올라갈 때 RVA 주소값은 절대주소인 VA로 변환된다.  RVA로 메모리 주소를 표현한 이유는 Base Address는 로드시마다 다르게 바뀔 수 있기 때문이다.  PE 파일을 조작하고 분석하기 위해선 RVA와 RAW의 관계를 잘 알아야 한다. KUICS
  • 17. 17 VA & RVA  다음 이유들로 인해 메모리와 파일 형태에 차이가 생긴다. - FileAlignment와 SectionAlignment의 차이 - RVA의 사용  메모리 형태에서 본 주소를 PE 파일과 매핑하려면, VA와 RVA 사이의 관계를 알아 야 한다.  VA = BaseAddress + RVA  RAW – PointerToRawData = RVA – VirtualAddress  PointerToRawData : 파일에서 RVA가 속해 있는 섹션의 시작 위치  VirtualAddress : 메모리에서 RVA가 속해 있는 섹션의 시작 위치 KUICS
  • 18. 18 PE File 구조 – 4) Section PE (File) .text .data .rsrc KUICS PE (Memory) .text .data .rsrc
  • 19. 19 IAT  Import Address Table - dll에서 불러 사용하는 함수의 주소값을 보관할 영역  dll에서 불러 사용하는 함수의 주소는 PE 파일의 상태에 따라 다르다. - 파일 형태에서는 RVA로 표현되어 있다. - 메모리에 로드되면 이 RVA가 VA값으로 바뀐다. KUICS
  • 20. 20 IAT  CloseHandle의 주소가 0x400000 + 0x122B8로 표기되어 있다.  0x4122B8를 통해 0x73BB9660에 있는 Kernel32.dll의 CloseHandle로 간다.  dll에 있는 함수를 호출하는 경우, 이와 같이 IAT를 활용한 간접 호출을 한다. KUICS
  • 21. 21 IAT  실행파일 내부에서 API를 호출할 때 다음과 같은 과정을 거친다. - 코드 -> API (X) - 코드 -> IAT -> API (O)  후자는 속도가 더 느려지지 않을까?  DLL이 메모리에 로드될 때 ImageBase 값이 변경될 수 있다.  VA는 ImageBase 값에 따라 변동된다.  이러한 특징 때문에 API의 주소를 VA로 하드코딩할 수 없다.  따라서, API의 주소는 dll에 대한 RVA로 적혀 있으며 dll이 로딩되는 시점에 VA로 변환된다. KUICS
  • 22. PE Packer 분석 UPX와 UPack의 세계로! KUICS
  • 23. 23 PE Packer  Packer의 종류  Compressor - 실행 프로그램의 용량을 줄인다. Ex) UPX  Protector - 실행 프로그램의 역공학을 방해한다. - 상용프로그램의 경우, 핵심 알고리즘의 역공학을 막기 위해 사용 Ex) Themida - 악성코드는 백신 탐지를 어렵게 할 목적으로 사용 Ex) UPack KUICS
  • 24. 24 Compressor : UPX  실행 압축계의 No1 패커 - http://upx.sourceforge.net/  다양한 운영체제와 아키텍쳐를 지원한다. - OS : Windows, macOS, Linux, FreeBSD, OpenBSD, NetBSD, MS-DOS 등 - Arch : amd64, i386, arm, mips, powerpc 등  압축해제 속도가 매우 빠른 UCL 라이브러리를 사용 - 실행 압축 특성상 압축해제가 빨라야 한다.  작동 방법 - 1) SFX 형태로 임시 폴더에 압축을 해제하여 실행 (extract to temp file) - 2) 실행되는 시점에 메모리에 압축 해제를 하고 실행 (in-place) - 대부분 2번 in-place 방법을 사용 KUICS
  • 25. 25 Compressor : UPX  구조를 알아보기 위해 한 실행 프로그램을 패킹하고, 분석해보자.  패킹 전 - 다양한 섹션이 존재하는 것을 확인할 수 있다. - 섹션의 용도에 맞는 권한들을 가지고 있다. KUICS
  • 26. 26 Compressor : UPX  패킹 중  212KB가 175KB로 줄어들었다 KUICS
  • 27. 27 Compressor : UPX  패킹 후 - rsrc 섹션을 제외한 나머지 섹션들이 사라졌다. - UPX0, UPX1 모두 Read/Write/Execute 권한을 가지고 있다. - UPX0의 RawSize는 0이다 (파일 상태에서는 존재하지 않는다). - UPX0의 VirtualSize는 원본 파일의 섹션의 크기를 다 더한 것보다 크다. - UPX1은 RawSize를 가지고 있으며 VirtualSize의 크기와 같다. - UPX1에 EntryPoint가 존재한다.  이것들이 의미하는 바는? KUICS
  • 28. 28 Compressor : UPX  패킹 후  가정 - UPX1 섹션에 EP가 존재하므로, 압축해제 코드가 존재하리라 알 수 있다. - UPX0 섹션의 RawSize가 0이지만 VirtualSize는 값이 크다는 점에서, 이 프로그램이 실행되는 시점에 원래의 데이터가 UPX0에 압축해제됨을 추측할 수 있다. - rsrc 섹션의 크기는 거의 똑같으므로, 압축된 데이터는 UPX1 섹션에 존재할 것이다. - UPX0 섹션은 Read/Write/Execute 권한을 모두 가지고 있으므로, code 섹션 (Read/Execute)과 data 섹션 (Read/Write)의 역할을 모두 할 것이다. KUICS
  • 29. 29 Compressor : UPX  패킹 후  섹션 Offset (ImageAddress + VirtualOffset) - UPX0 = 0x400000 + 0x01000 = 0x401000 (~0x436FFFF) - UPX1 = 0x400000 + 0x37000 = 0x437000 (~0x43CFFFF)  EntryPoint - EP = 0x400000 + 0x3CC50 = 0x43CC50 - EP는 UPX1 섹션에 존재한다. KUICS
  • 30. 30 Compressor : UPX  UPX의 압축 해제 코드를 분석해보자.  IDA로 패킹된 프로그램을 열 경우 IAT가 깨져있다는 경고가 나타난다.  -> UPX는 압축시 IAT를 건드린다는 점을 알 수 있다. KUICS
  • 31. 31 Compressor : UPX  패킹 전의 IAT KUICS
  • 32. 32 Compressor : UPX  패킹 후의 IAT  압축 해제에 필수적인 API만 제대로 표시되고 있다. KUICS
  • 33. 33 Compressor : UPX  패킹된 파일은 단 두개의 함수만을 가지고 있다.  start 함수가 압축해제 코드일 가능성이 높다. KUICS
  • 34. 34 Compressor : UPX  start 함수는 PUSHA로 시작하여 POPA ~ JMP 문으로 끝난다. KUICS
  • 35. 35 Compressor : UPX  첫 부분에서 ESI와 EDI를 세팅하고 있다.  어셈블리어에서 ESI와 EDI가 쓰일 경우 관용적으로 다음을 가리킨다. - ESI : Source, 데이터를 읽어올 주소 - EDI : Destination, 데이터를 쓸 주소  즉, 다음 가능성이 높다. - ESI : 압축된 데이터의 주소 - EDI : 원본 데이터가 들어가야 할 위치 KUICS
  • 36. 36 Compressor : UPX  첫 부분에서 ESI와 EDI를 세팅하고 있다.  세팅되는 값을 살펴보자. - ESI = 0x437015 - EDI = 0x401000  즉, ESI는 UPX1 섹션, EDI는 UPX0 섹션을 가리키고 있다. - UPX0 = 0x401000 ~ 0x436FFFF - UPX1 = 0x437000 ~ 0x43CFFFF KUICS
  • 37. 37 Compressor : UPX  [EDI]에 쓰기를 하는 코드가 있는 곳이 패킹된 파일을 원래 상태로 복구하는 핵심 부분이다. KUICS
  • 38. 38 Compressor : UPX  CALL을 만났다.  뭐하는 녀석이지? KUICS
  • 39. 39 Compressor : UPX  더 진행하면 CALL로 함수를 호출하는 부분이 존재한다. KUICS
  • 40. 40 Compressor : UPX  동적 분석 결과, LoadLibrary와 GetProcAddress를 호출하고 있음을 알 수 있다. KUICS
  • 41. 41 Compressor : UPX  UPX로 패킹된 프로그램은 IAT Table에 함수의 RVA가 없어 불완전하다.  LoadLibrary로 dll을 로드하고 그 주소를 EBP에 저장한다.  dll 명단은 IAT에서 직접 가져온다. KUICS
  • 42. 42  UPX로 패킹된 프로그램은 IAT Table에 함수의 RVA가 없어 불완전하다.  GetProcAddress을 dll 주소 (EBP), 함수 이름(EDI)을 인자로 주고 호출한다.  API의 주소(VA)를 얻어 (EAX) EBX가 가리키는 곳에 복사한다. Compressor : UPX KUICS
  • 43. 43 Compressor : UPX  마무리로, 메모리 특정 구역의 권한을 설정한다. KUICS
  • 44. 44 Compressor : UPX  동적 분석 결과, 다음과 같은 작업을 한다.  VirtualProtect(0x400000, 0x1000, PAGE_READWRITE, &지역변수);  VirtualProtect(0x400000, 0x1000, PAGE_READONLY, &지역변수);  TlsCallback(…); KUICS
  • 45. 45 Compressor : UPX  마지막 단계  POPA 명령으로 레지스터를 복구한다.  그 뒤 원래의 EP로 JMP한다. KUICS
  • 46. 46 Compressor : UPX  패킹 전 원본 파일의 EP KUICS
  • 47. 47 Compressor : UPX  패킹된 프로그램의 압축해제 전 (원본의 EP)  NULL Padding만 존재한다. KUICS
  • 48. 48 Compressor : UPX  패킹된 프로그램의 압축해제 후 (원본의 EP)  원본과 같은 코드가 나타난 것을 볼 수 있다. KUICS
  • 49. 49 Compressor : UPX  UPX 압축해제가 정상적으로 끝난 상태에서 F9를 눌러주면?  원본이 실행되듯이 정상적으로 잘 실행된다. KUICS
  • 50. 50 Compressor : UPX  결론  UPX의 압축 해제는 다음과 같은 순서로 진행된다.  UCL 알고리즘으로 압축된 PE 섹션의 압축 해제 -> IAT 복구 KUICS
  • 51. 51 Compressor : UPX  사족 : 디버거의 빼애애액  패커가 적용되었을 때 디버거에서 BP를 걸면 다음과 같은 경고 메시지가 뜬다.  디버거는 EP를 보고 어떤 섹션이 code 섹션인지 구분한다.  패커가 EP를 다른 섹션으로 바꿔버렸기 때문에 디버거에 혼동이 온 것. KUICS
  • 52. 52 Protector : UPack  PE 파일을 난독화시키는 패커이다.  헤더를 꼬아 파일의 구조를 완벽하게 바꿔 버리기에 리버싱에 큰 지장이 온다.  Windows의 PE 로더가 PE 표준 규격보다 너그럽게 구현된 것을 악용한다. KUICS
  • 53. 53 Protector : UPack  원본 PE 파일 헤더 구조 - 헤더들이 순서대로 붙어 있다. KUICS DOS MZ Header COFF Header DOS Stub Optional Header
  • 54. 54 Protector : UPack  UPack으로 패킹한 후의 PE 헤더 - 헤더들이 이리저리 꼬여 있다. KUICS DOS MZ Header COFF Header Optional Header
  • 55. 55 Protector : UPack 헤더 겹치기  Windows는 DOS Stub을 전혀 참고하지 않으며, MZ Header의 맨 마지막 값, e_lfnew 값을 보고 PE 헤더의 시작점을 찾는다.  PE 규격에 COFF Header의 시작 오프셋은 정해져 있지 않다.  MZ Header의 e_lfnew 값을 MZ Header의 바깥이 아닌, 안을 향하게 만들어 서 헤더를 겹치게 만든다. KUICS DOS MZ Header COFF Header Optional Header
  • 56. 56 Protector : UPack Section 겹치기 + Alignment 꼬기  섹션의 메모리상 Offset (ImageAddress + VirtualOffset) - Sec01 = 0x400000 + 0x01000 = 0x401000 (~0x43BFFFF) - Sec02 = 0x400000 + 0x3C000 = 0x43C000 (~0x46DFFFF) - Sec03 = 0x400000 + 0x6E000 = 0x46E000 (~0x46EFFFF)  섹션의 파일상 Offset (PointerToRawData) - Sec01 = 0x000010 ~ 0x0001FF - Sec02 = 0x000200 ~ 0x02AAB7 - Sec03 = 0x000010 ~ 0x0001FF  파일상 Offset이 이상하다? KUICS
  • 57. 57 Protector : UPack Section 겹치기 + Alignment 꼬기  섹션의 파일상 Offset (PointerToRawData) - Sec01 = 0x000010 ~ 0x0001FF - Sec02 = 0x000200 ~ 0x02AAB7 - Sec03 = 0x000010 ~ 0x0001FF  파일상 Offset이 이상하다? - 파일상의 Offset은 반드시 FileAlignment의 배수여야 한다. - 일반적으로 FlieAlignment는 0x200 (512)의 값을 가진다. - 그런데 0x10은 0x200의 배수가 아니다.  Windows의 PE Loader는 이 경우 강제로 배수에 맞춘다. KUICS
  • 58. 58 Protector : UPack Section 겹치기 + Alignment 꼬기  즉 여기서 0x10의 RawOffset은 0x0 또는 0x200으로 교정된다. - 테스트 결과 0x00으로 계산됨  실제 파일상 Offset (PointerToRawData) - Sec01 = 0x000000 ~ 0x0001EF - Sec02 = 0x000200 ~ 0x02AAB7 - Sec03 = 0x000000 ~ 0x0001EF  RAW to RVA를 계산할 때도 이 점에 유의해야 한다. KUICS
  • 59. 59 Protector : UPack Section 겹치기 + Alignment 꼬기  EntryPoint (RAW)를 계산해보자.  헤더에 따르면, EntryPoint (RVA)는 0x00001018이다.  이 RAW 주소는 Sec01 및 Sec03에 속한다.  RAW = RVA–VirtualOffset + RawOffset  EP (RAW) = 0x1018 – 0x1000 + 0x10 = 0x28 (X)  그러나 RawOffset이 0x10으로, 0x200의 배수가 아니므로 0x0으로 교정한다.  EP (RAW) = 0x1018 – 0x1000 + 0x0 = 0x18(O) KUICS
  • 60. 60 Protector : UPack  x64dbg의 경우, Sec01에 진입을 시도할 시 크래시가 발생한다. KUICS
  • 61. 61 Protector : UPack  Immunity Debugger  패킹된 프로그램의 EP로 접근하지 못한다. KUICS
  • 62. 62 Protector : UPack  UPack이 RAW to RVA 변환법을 꼬아놓기에 Immunity Debugger가 EP를 제 대로 계산하지 못해 발생하는 문제이다.  EP를 강제로 지정해야 디버깅이 가능하다.  EP = ImageBase + EntryPoint (RVA)  EP = 0x400000 + 0x001018 = 0x401018 KUICS
  • 63. 63 Protector : UPack  EP를 강제로 지정해야 디버깅이 가능하다.  Ctrl + G -> 00401018 (EP) 입력  New origin here로 EP 강제 지정. KUICS
  • 64. 64 Protector : UPack  정상적인 PE 파일이 아니기에 Ctrl + G를 통해 00401018로 직접 이동하지 않으 면 어셈블리 코드가 비정상적으로 표기된다.  정상  디버거의 표시 KUICS
  • 65. 65 Protector : UPack  IDA Pro는?  경고 5관왕 달성! KUICS
  • 66. 66 Protector : UPack  4) Section 겹치기 + Alignment 꼬기  섹션의 파일상 Offset (PointerToRawData) - Sec01 = 0x000010 ~ 0x0001FF - Sec02 = 0x000200 ~ 0x02AAB7 - Sec03 = 0x000010 ~ 0x0001FF  파일상 Offset이 이상하다? - 파일상의 Offset은 반드시 FileAlignment의 배수여야 한다. - 일반적으로 FlieAlignment는 0x200 (512)의 값을 가진다. - 그런데 0x10은 0x200의 배수가 아니다.  Windows의 PE Loader는 이 경우 강제로 배수에 맞춘다. KUICS
  • 67. 67 Protector : UPack  가정  Sec01은 파일 상태의 크기는 작으나, 메모리 상태의 크기는 크다.  Sec02는 파일 상태의 크기와 메모리 상태의 크기가 모두 크다.  Sec03은 파일 상태의 크기와 메모리 상태의 크기가 모두 작다.  용량으로 보아 Sec02에 압축된 원본 데이터가 존재하리라 추측할 수 있다.  Sec01이 Sec02보다 메모리 상태의 크기가 더 크다.  이를 통해 Sec01에 원본 데이터가 압축해제 된다는 점을 추측할 수 있다. KUICS
  • 68. 68 Protector : UPack  EP에서 몇가지 연산을 수행한 이후 0x004667A3 으로 JMP한다. KUICS
  • 69. 69 Protector : UPack  0x4667A3 이후부터는 CALL DWORD PTR [ESI] 구문이 자주 등장한다. KUICS
  • 70. 70 Protector : UPack  CALL DWORD PTR DS:[ESI] 실행시 0x46675B 함수를 호출한다.  인자를 EAX와 EDX로 받는다.  자주 호출되는 것을 보아 압축 해제를 담당하는 코드일 가능성이 높다. KUICS
  • 71. 71 Protector : UPack  [ESI] 뿐만 아니라 [ESI+54], [ESI+50]도 호출하고 있다. KUICS
  • 72. 72 Protector : UPack  BP를 걸고 F9를 계속 눌러보자. KUICS
  • 73. 73 Protector : UPack  원본 프로그램의 .text 섹션  패킹된 프로그램 디버깅 중 살펴본 동일 영역 KUICS 압축 해제가 이루어지고 있다.
  • 74. 74 Protector : UPack  이 시점에서 다시 IAT를 살펴보자.  IAT를 복구할 때 필요한 두 API만 여기에 존재한다.  원래의 IAT 명단을 복구해야 하므로, IAT를 복구하는 코드가 존재할 것이다. KUICS
  • 75. 75 Protector : UPack  그런데 이 주소를 직접 부르고 있지 않아 정적 분석으로는 추적이 불가능하다!  동적 분석 중 0x4011E8나 0x4011EC를 CALL하는 부분을 찾자.  모든 CALL에 BP를 걸고 진행하며 찾다보면 나오지 않을까? KUICS
  • 76. 76 Protector : UPack  0x466923  LoadLibraryA("GDI32.DLL"); KUICS
  • 77. 77 Protector : UPack  0x46693A  GetProcAddress([HANDLE of GDI32.DLL], "BitBlt"); KUICS
  • 78. 78 Protector : UPack  EAX에 BitBlt 값이 반환되고, STOS를 통해 EAX의 값을 [EDI]에 복사한다. KUICS
  • 79. 79 Protector : UPack  F9를 반복해서 눌러 상황을 보자.  IAT가 복구되고 있다. KUICS
  • 80. 80 Protector : UPack  IAT를 복구한 뒤 원래의 EP로 JMP한다. KUICS 패킹 전 원본 파일 패킹 복구 후
  • 81. 81 Protector : UPack  결론  UPack도 UPX와 마찬가지로 실행시 압축 해제 -> IAT 복구 순서를 거친다.  용량을 줄이기 위해 압축만 하는 UPX와는 달리, UPack은 PE 헤더의 값을 꼬아 분 석의 난이도를 높인다.  결과적으로 리버싱과 같은 바이너리 분석을 크게 방해한다. KUICS

Editor's Notes

  1. 안녕하세요, PE File Format과 Packer를 주제로 발표를 할 장하진입니다.
  2. 간단히 자기소개를 하자면, 저는 현재 고려대학교 컴퓨터학과의 정보보호동아리인 KUICS의 회장을 맡고 있고, BoB 4기 수료생입니다.
  3. 발표는 PE File Format은 어떤 구조를 가지고 있는지 알아보고, Packer란 무엇인가를 살펴본 뒤 Packer를 분석하는 순서로 진행됩니다. 기초부터 닦아야 나중에 분석할 때 쉽겠죠? PE File의 구조부터 먼저 알아봅시다.
  4. PE File은 Windows에서 사용하는 실행 파일 포맷입니다. 여기서 파일 포맷이란? (예시 제시) (pdf 파일은 파이어폭스도 Adobe Reader도 읽을 수 있는데, 이는 pdf 파일은 어떻게 기술되어야 한다라는 규칙이 있기 때문입니다. 이 규칙을 포맷이라고 부릅니다.) 일반적으로 우리가 자주 접하는 exe 파일이 여기 PE File에 속합니다. Compiler는 PE 포맷에 맞춰서 exe 파일을 작성하고, Windows는 PE 포맷에 맞춰서 exe 파일을 읽습니다. 그 외에는 dll, 드라이버로 쓰이는 sys 파일등이 있습니다. 아, 그런데 Windows에서밖에 안 쓰는데 Portable이냐구요? 원래 여러 종류의 CPU에서 사용하기 위해 설계한 물건이기 때문에 그렇습니다. (지금은 사실상 Intel의 x86 CPU만 사용하고 있지만요)
  5. PE File의 내부구조를 살펴보면 다음과 같은 항목들이 주르륵 나열되어 있습니다. 하나씩 뜯어봅시다.
  6. 여기 계신 분들 중 MS-DOS 써보신 분? Windows가 대중화되기 전에는 MS-DOS가 PC의 주 OS로 쓰였죠. 이 때 사용하던 MZ 규격이 PE 규격에도 그대로 들어있습니다. 왜 굳이 이렇게 했냐고요? 하위호환성 때문입니다. MS-DOS에서 지원하지 못하는 많은 기능들이 Windows에서 추가되었는데, MZ 규격은 이를 따라갈 수 없었습니다. 하지만 이렇게 하면 하나의 파일에서 MS-DOS용 16비트 코드와 Windows용 32비트 코드를 동시에 우겨넣을 수 있죠. Windows 98 때까지만 해도 MS-DOS와 Windows가 공존했기에 당시로써는 타당했던 전략이었습니다. 다만 DOS가 멸망한 지금은 별로 신경쓸 필요가 없죠.
  7. 이러한 구조는 PE File이 DOS의 MZ 규격을 확장한 물건이라 가능합니다. MS-DOS는 PE 구조를 모르니 MZ 부분만 실행하고 끝냅니다. 반면, Windows는 MZ를 건너뛰고 곧바로 PE 부분을 해석합니다. 그러니, 당연히 DOS 코드가 담긴 DOS Stub은 없어도 Windows에서 실행에 지장이 없습니다. (후반부에 다룰 UPack이라는 패커가 이 점을 악용합니다.)
  8. COFF는 유닉스 쪽에서 사용하던 파일 포맷이었는데, MS가 Windows용 PE 규격을 만들며 COFF를 그대로 가져와서 확장했습니다. 이 COFF 부분이 명백한 증거인데요, 여기서 중요한 값들은 이 세가지 정도가 있습니다. Machine : CPU 및 명령어셋 종류 SizeOfOptionalHeader : 32비트와 64비트의 경우 주소 표기에 필요한 바이트 수가 다른 관계로 PE 헤더의 길이가 달라집니다. 따라서, PE File을 읽는 쪽이 헷갈리지 않도록 구조체의 크기를 여기에 명시해 둡니다. Characteritstics : 실행 가능한가, dll인가 등 대표적으로, 32bit PE 파일과 64bit PE 파일은 Machine과 SizeOfOptinalHeader 값이 서로 다릅니다.
  9. Optional이라고 하니 여기가 더 필요한 정보가 적을 거 같지만, 사실은 여기가 메인입니다. 다음 정보들은 계속 다룰 PE Packer를 이해하기 위해 반드시 필요한 정보들입니다. 이것들을 설명하기 전에 잠깐 운영체제에 관련된 얘기를 이해하겠습니다. 모르면 이해가 힘들거든요. 현대의 운영체제에서, 각 프로세스는 별도의 가상 메모리 공간을 받습니다. (Vmware에서 OS 가상화하는 거랑 비슷해요) 이 때 exe 파일이 가상 메모리 공간의 주체고, exe의 메모리 공간 위에 선택받은 dll들이 같이 로드됩니다. 그리고 파일 형태로 저장된 프로그램이 메모리로 올라가며 프로세스가 되는데, 이 과정에서 약간의 변형이 일어납니다.
  10. AddressOfEntryPoint 프로세스가 처음 실행될 때 어떤 코드에서부터 시작할지 주소를 지정합니다. 처음 시작하는 주소를 흔히 EntryPoint라고 부르고, EP로 줄여 부릅니다. ImageBase PE 파일을 실행하면 Windows가 파일 형태의 PE를 메모리에 올려줍니다. 이 때, PE 파일이 로드되고자 하는 <b>희망</b> 주소를 나타냅니다. exe는 가상 메모리 공간의 주인이라서 대부분 ImageBase가 그대로 성립합니다. 하지만 dll의 경우 복잡해집니다. 이 부분은 뒤에서 설명하도록 하죠. FileAlignment & SectionAlignment 섹션의 크기는 반드시 특정 값의 배수여야 합니다. 그래야 관리가 쉽고 속도 저하가 없거든요. 디스크의 최소 관리 단위는 섹터고, 512B입니다. 메모리의 최소 관리 단위는 페이지고, 주로 4KB입니다. 관리하는 단위가 이 값보다 작아지면 오버헤드가 발생하기에, 섹션도 이 경계에 맞춰둡니다. 아, 그러면 남는 공간은 어떻게 하냐고요? 그냥 0으로 채워둡니다. 흔히 NULL Padding이라고 칭하죠. SizeOfImage 가만 보면 여러 차이로 인해 PE 파일이 메모리로 올라갈 때 약간의 변형이 생길 거라는 걸 유추할 수 있습니다. 이 값은 PE 파일이 메모리에 올라갔을 때 총 몇 바이트를 차지할 것인가를 나타냅니다. Subsystem 이 값은 이 PE 파일이 어떤 파일인지 설명합니다. 크게 드라이버, GUI, CUI로 나눠집니다. 흔히 C로 코딩하면 콘솔 창 뜨는데, 대부분의 프로그램들은 콘솔이 안 뜨잖아요. 여기 값에 따라서 결정됩니다.
  11. 예전에는 실행 파일 안에 기계어 코드와 데이터가 뒤섞여 있었습니다. 그러다보니 데이터를 바꾸려다가 기계어를 건드리는 경우가 생기고, 해킹에도 악용하는 경우가 있었습니다. 따라서, 현대 운영체제는 기계어 코드와 데이터를 격리하여 섹션이라는 곳에 나눠서 저장하고, 권한을 별도로 줍니다. 주로 저 세 섹션은 대부분의 PE 파일에 개근합니다. 특히 text, data는요.
  12. 예를 들어, 실행 중에 기계어 코드가 바뀌는 경우는 거의 없으니, .text Write 권한을 뺴버립니다. 이렇게 하면 일반적인 경우 크래커가 프로세르를 어떻게 건드려도, 기계어 코드를 직접 바꾸진 못합니다. 마찬가지로, data 섹션에서 기계어가 직접 돌아갈 일은 거의 없으니 Execute 권한을 빼버립니다. 리눅스에서 BOF를 막기 위해 실제로 data에서 execute 권한을 빼는 식으로 대응했던 적이 있죠.
  13. PE 파일은 Section 관리에 필요한 정보들을 Section Header에 저장해 뒀습니다. 섹션 헤더에는 섹션이 어디에 얼만큼 저장되어 있는지를 파일 형태일때와 메모리 형태일때에 따라 기록되어 있습니다. Note : () 부분은 Stud_PE의 Notation. 이게 더 이해가 쉽다.
  14. 대부분의 경우, 파일 형태의 PE 파일이 메모리에 로드되면 다음과 같이 바뀝니다. NULL Padding과 FileAlign, SecitonAlign 등의 차이로 인해서입니다. 전 페이지에서 봤던 파일일 때와 메모리일 때의 위치와 크기 차이는 그래서 발생합니다.
  15. exe가 하나 실행되면, 운영체제가 가상 메모리 공간을 부여해줍니다. 이 때, dll도 함께 로드가 되지요. 오른쪽 사진의 Image가 메모리에 올라간 PE 파일들로, 위에 있는 보라색이 exe, 밑에 있는 보라색이 dll입니다. exe 하나씩 가상 메모리를 제공해주니 exe야 위치가 바뀔 일이 없지만 dll의 위치는 경우에 따라 매번 바뀝니다. 그런데, dll은 함수 공유해놓고 필요할 때 불러 쓰라고 있잖아요? 위치가 바뀌면 어떻게 함수 주소를 알아낼까요?
  16. 이를 해결하기 위해 다음 개념이 도입됩니다. PE 파일이 로드될 때 로드되는 위치가 Base Address입니다. 로드시마다 바뀔 수 있는 값은 엄밀히 따지면 Base Address뿐이니, 파일 상태의 PE 파일 안에서는 주소를 Base Address에 대한 상대주소값으로 기록하면 되는 겁니다. 이를 RVA라고 부릅니다. 반대로, VA는 메모리에 올라간 상태를 기준으로 하는 절대값입니다. RVA로는 함수 곧바로 못 부르고 VA로만 부를 수 있습니다. 따라서, 파일 형태일때 RVA로 저장되어 있던 주소값은 로드하는 시점에서 VA로 변환됩니다.
  17. 파일과 메모리를 서로 매핑하려면, RVA와 VA 변환식을 알아야겠죠. 식들은 다음과 같습니다. 두번째 식이 잘 이해가 안 가실 건데요, 그림을 보면서 설명하겠습니다.
  18. 여기 있는 검은 박스를 볼까요? 자신이 속해 있는 섹션의 시작 위치가 밀려나니 자신의 위치도 덩달아 밀려납니다. 하지만 자신의 주소와 자신이 속한 섹션의 시작 위치의 차이는 늘 동일합니다 (RVA) 이 성질을 이용해, 자신이 속해 있는 섹션이 얼마나 밀려났는지를 계산하면 실제 메모리 위에서의 주소를 구할 수 있습니다.
  19. IAT는 exe가 dll에서 불러 사용할 함수의 주소값을 보관하는 영역입니다. 여기의 함수 주소는 RVA로 저장되어 있습니다. 그리고 Windows가 PE 파일을 메모리로 로드할 때 Base Address 값을 더해 VA로 변환합니다.
  20. 한 실행 파일의 IAT를 열어본 상황입니다. kernel32.dll은 73B90000에 로드되어 있는데, 정작 코드에서는 0x4122B8에서 CloseHandle을 찾습니다. 알고 봤더니, 0x40122B8에는 실제 kernel32.dll 안의 CloseHandle로 향하는 주소가 기록되어 있습니다.
  21. 실행파일 내부에서 API를 호출하는 경우, API의 주소를 직접 호출하지 않고 IAT를 한번 거쳐서 호출합니다. 그러면 느려지지 않냐고요? 앞에서도 설명했듯이, dll이 로드되는 기준 주소는 일정하지 않습니다. 보안을 위해서 재부팅할 때마다 기준 주소를 바꾸는 경우도 있고 (ASLR), 자신이 A 주소를 쓰려고 봤더니 다른 DLL이 이미 거길 먹고 있어서 할 수 없이 옆자리에 로드되는 경우도 있습니다. 그러니 RVA로 기록을 해야 Base Address가 바뀌는 경우에도 문제가 없습니다.
  22. 지금까지 PE 파일에 대해서 속성으로 알아봤습니다. 여기서 질문 있으신가요? 이제는 PE Packer를 분석해 보도록 하겠습니다.
  23. Packer란 무엇일까요? 크게 두가지로 나뉩니다. 첫번째는, 프로그램의 용량을 줄이기 위해 사용하는 Compressor입니다. Compressor인 Packer로 패킹된 실행 파일은 평상시에 원본 내용이 압축되어 저장되어 있다가, 실행되는 시점에 메모리에 압축해제를 합니다. 메모리 사용량은 변하지 않겠지만 파일 상태에서 용량이 줄어든다는 이점이 있죠. 두번째로, Protector는 바이너리 분석을 방해하는 용도로 쓰이며 크던 작던 난독화가 함께 수행됩니다. 프로그램 내의 지적 재산권을 지키기 위해 사용하는 경우도 있고 (카카오톡 + 더미다), 악성코드가 백신에게 걸리지 않기 위해 난독화를 하는 경우도 있습니다. Upack) 리버싱할 때 카카오톡이 꺼지는 경우를 겪어 보셨을 건데요, 더미다 패커에 내장된 안티디버깅 기능이 작동한 케이스입니다.
  24. 이제 패커를 직접 분석해보도록 하겠습니다. UPX는 실행 압축계의 대표 주자입니다. 다양한 환경을 지원하며, 그 중에는 당연히 Windows도 있습니다.
  25. 마루타로는 BatteryLine을 사용.
  26. 실제로 대형 프로그램을 압축하는 경우, 용량이 더 크게 줄어든다. 이건 프로그램의 크기 중 절반 이상을 아이콘 (rsrc)가 차지해서 발생하는 현상 – 아이콘까지 압축하면 아이콘이 깨지니까 (…)
  27. 왜 권한을 뭉개버리나? UPX0가 code이자 data이기 때문에 그냥 모두 가능하게 다 때려박은 것
  28. 이것들이 의미하는 바는?
  29. 분석을 위해 IDA로 열었으나, IAT가 원래 있어야 할 위치에 있지 않고, 깨져보일거라는 경고가 뜸.
  30. 원본 프로그램이 사용하는 DLL들은 다 나오는데, 그 중 하나만 나오고 있다. 즉 깨진다.
  31. 복호화 코드들은 우리가 당장 관심있는 부분이 아님 (어차피 디코딩 로직은 UCL 라이브러리 찾으면 나오니까) ‘어떻게 UPX0 섹션이 복구되는지’를 확인하게 만들자!
  32. LoadLibrary랑 GetProcAddress의 역할 설명
  33. 어디서 많이 본 거 아닌가? 그렇다! IAT다! RVA가 파일에 없으니, VA로 바뀌는 걸 PE 로더가 못해준다. 그러니 패커가 직접 API 주소의 VA를 구해서 집어넣고 있는 것.
  34. VirtualProtect의 역할 설명 0x400000~ 0x401000은 PE 파일 헤더가 메모리에 올라간 상태로, 여기는 못 건드리게 ReadOnly를 거는 것.
  35. 여기서 기계어 코드 자체는 같은데, 함수 표현이 다르다는 점 등을 언급. 또한, UPX에서 압축 해제된 곳에 BP를 걸려고 하면 경고가 뜬다. 원래 EP가 존재하는 섹션이 아니었기에 .data 등으로 착각하는 것.
  36. 여기서 기계어 코드 자체는 같은데, 함수 표현이 다르다는 점 등을 언급. 페이지의 권한 문제도 있고, 디버거가 code 섹션과 data 섹션을 혼동하고 있기 때문.
  37. 실제로 실행해보면 원본의 실행 속도와 차이를 거의 못 느낀다. UCL의 압축해제 속도가 워낙 빠르기 때문.
  38. UPX에서 압축 해제된 곳에 BP를 걸려고 하면 경고가 뜬다. 원래 EP가 존재하는 섹션이 아니었기에 .data 등으로 착각하는 것.
  39. 리버싱에 큰 지장이 왔다는 점 때문에 악성코드에 널리 쓰였고, 그 결과 백신들이 이제 Upack만 보면 바이러스로 보고 때려잡는다.
  40. MZ -> COFF -> Optional 순으로 소개한다.
  41. 난독화 1 : 겹쳐쓰기
  42. 이름 부분은 깨져 있으나, 편의상 SecXX라고 부름 Q) 위화감이 드는 부분을 찾으시오 A1) Sec01이랑 Sec03이 파일상에 겹쳐있다. A2) Sec01이랑 Sec03은 파일 헤더를 포함하고 있다. A3) Sec01이랑 Sec03의 RawOffset이 FileAlignment의 배수가 아니다.
  43. 여기서 RawOffset == PointerToRawData, VirtualOffset == VirtualAddress
  44. 동적 분석하기 1차 실패 (…)
  45. 네, 눌러도 반응이 없어요.
  46. PE 헤더와 섹션은 NULL Padding으로 떨어져 있어야 하는데, NULL Padding 없이 PE 헤더 한복판에 EP가 던져져 있어서 발생하는 현상
  47. …. 경고가 몇 개야 Section이 Align되어 있지 않음 섹션의 경계가 정상적이지 않음 VA와 RVA가 정상적으로 매칭되지 않음 TLS Callback이 정상적이지 않고 찾을 수 없음 IAT가 깨져있음 5관왕 달성
  48. 저 주소들은 동적 분석 결과.
  49. 내용이 같다!
  50. 참고로, 이 부분은 IDA에서 안 보였다 (…)
  51. 참고로, 이 부분은 IDA에서 안 보였다 (…)
  52. [EDI]가 가리키고 있는 곳에 EAX의 값이 들어간 걸 확인시킬 것