Hack The Planet

๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค, cyalume์˜ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

reverse engineering

[RCE] PE file format (1)

cyalume 2021. 5. 2. 17:52

๋ณธ๋ก ์— ๋“ค์–ด๊ฐ€๊ธฐ ์•ž์„œ, PE๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

1.PE๋ž€?
PE(Portable Executable): ์œˆ๋„์šฐ ์ƒ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ์ด๋‹ค.

์‹คํ–‰ ๊ณ„์—ด EXE, SCR
๋“œ๋ผ์ด๋ฒ„ ๊ณ„์—ด SYS, VXD
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ณ„์—ด DLL, OCX, CPL, DRV
์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ OBJ


2.PE์˜ ์ข…๋ฅ˜์—๋Š” ๋ฌด์—‡์ด ์žˆ๋Š”๊ฐ€?

1)์‹คํ–‰๊ณ„์—ด
SCR: ์Šคํฌ๋ฆฐ ์„ธ์ด๋ฒ„์˜ ์•ฝ์ž๋กœ, ํ™”๋ฉด ๋ณดํ˜ธ๊ธฐ ํŒŒ์ผ์„ ์˜๋ฏธํ•œ๋‹ค.

2)๋“œ๋ผ์ด๋ฒ„ ๊ณ„์—ด
SYS: ์‹œ์Šคํ…œ์˜ ์•ฝ์ž์ด๋ฉฐ ์šด์˜์ฒด์ œ ๊ด€๋ จ ํŒŒ์ผ์ด๋‹ค.
VXD: Virtual Device Driver , ํ•˜๋“œ์›จ์–ด์™€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋™์ž‘์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์ƒ ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„ ํŒŒ์ผ์ด๋‹ค.

3)๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ณ„์—ด
DLL: Dynamic Link Library์˜ ์•ฝ์ž. ๋™์  ๋งํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ๋กœ, ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด์šฉํ•˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ์ง‘ํ•ฉ.

DOS ์‹œ์ ˆ์—๋Š” ์—†์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

OCX:  ์œˆ๋„์šฐ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜๋ชฉ์  ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ์œˆ๋„์šฐ ํฌ๊ธฐ ์กฐ์ •์ด๋‚˜ ์Šคํฌ๋กค ์ฒ˜๋ฆฌ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

DRV: Driver์˜ ์•ฝ์ž, ํ•˜๋“œ์›จ์–ด์˜ ์ธ์‹๊ณผ ๊ตฌ๋™์„ ์ œ์–ดํ•œ๋‹ค.

4)์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ
OBJ: ์ปดํŒŒ์ผ์ด ๋๋‚˜ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜๋œ ํŒŒ์ผ.

3.PE ๊ตฌ์กฐ
์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ PEํŒŒ์ผ์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ์•„๋ณด์ž.

๋ณด์ด๋Š” ๋ฐ”์™€ ๊ฐ™์ด ํ—ค๋”์™€ ์„น์…˜์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ตฌ์กฐ์ด๋‹ค.

1)DOS Header
PE file format ์ œ์ž‘ ์‹œ DOS ํŒŒ์ผ์— ๋Œ€ํ•œ ํ•˜์œ„ํ˜ธํ™˜์„ฑ์„ ๊ณ ๋ คํ•ด IMAGE_DOS_HEADER ๊ตฌ์กฐ์ฒด๊ฐ€ ์กด์žฌํ•œ๋‹ค.

typedef struct _IMAGE_DOS_HEADER {
    WORD e_magic; //Dos signature, "MZ" 
    WORD e_cblp; 
    WORD e_cp; 
    WORD e_crlc; 
    WORD e_cparhdr; 
    WORD e_minalloc;
    WORD e_maxalloc; 
    WORD e_ss; 
    WORD e_sp; 
    WORD e_csum; 
    WORD e_ip; 
    WORD e_cs; 
    WORD e_lfarlc;
    WORD e_ovno; 
    WORD e_res[4]; 
    WORD e_oemid; 
    WORD e_oeminfo; 
    WORD e_res2[10]; 
    LONG e_lfanew; // NT header์˜ ์˜คํ”„์…‹ 
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

๋Œ€ํ‘œ์ ์ธ IMAGE_DOS_HEADER ๊ตฌ์กฐ์ฒด์˜ ๋ฉค๋ฒ„๋กœ๋Š” e_magic๊ณผ e_lfanew๊ฐ€ ์žˆ๋‹ค.
e_magic: Dos signature(4D5A, MZ)

e_lfanew: NT Header์˜ ์˜คํ”„์…‹. (์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” 000000D0์„ ์˜๋ฏธํ•œ๋‹ค. offset 39~3C)
์‹ค์ œ๋กœ ์˜คํ”„์…‹ D0์—๋Š” NT header์˜ ์‹œ์ž‘์„ ์•Œ๋ฆฌ๋Š” PE signature(5045, PE)๊ฐ€ ์กด์žฌํ•œ๋‹ค.

2)Dos stub
Dos stub์˜ ์กด์žฌ ์—ฌ๋ถ€๋Š” ์˜ต์…˜์ด๋ฉฐ, ํฌ๊ธฐ๋„ ์ผ์ •์น˜ ์•Š๋‹ค.
์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ์„ž์—ฌ์žˆ์œผ๋ฉฐ, ์•„๋ž˜ ์ด๋ฏธ์ง€์˜ 40~4D ์˜คํ”„์…‹์€ dos stub์˜ 16bit ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์ด๋‹ค.

DOS mode์—์„œ ์‹คํ–‰ํ•˜๋ฉด "This program cannot be run in DOS mode"๋ฅผ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋‹ค.

3)NT Header

์œ„์˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ PE ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๋ˆˆ์— ๋ˆ๋‹ค.
์•„๋ž˜๋Š” IMAGE_NT_HEADERS ๊ตฌ์กฐ์ฒด์ธ๋ฐ, ์‹œ๊ทธ๋‹ˆ์ฒ˜์™€ File Header ๊ตฌ์กฐ์ฒด, Optional Header ๊ตฌ์กฐ์ฒด๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.

typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature; 
    IMAGE_FILE_HEADER FileHeader; 
    IMAGE_OPTIONAL_HEADER32 OptionalHeader; 
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

๋จผ์ € NT Header์˜ File header ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ดํŽด๋ณด์ž.
3-1)NT Header - File Header

typedef struct _IMAGE_FILE_HEADER { 
    WORD Machine; 
    WORD NumberOfSections; 
    DWORD TimeDateStamp; 
    DWORD PointerToSymbolTable; 
    DWORD NumberOfSymbols; 
    WORD SizeOfOptionalHeader; 
    WORD Characteristics; 
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

Machine: CPU ๋ณ„๋กœ ๊ณ ์œ ํ•œ ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ, 32bit intel x86 ํ˜ธํ™˜ ์นฉ์—์„œ๋Š” 14C๋ผ๋Š” ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. (4C 01)

NumberOfSections: ์„น์…˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ฐ˜๋“œ์‹œ ์‹ค์ œ ์„น์…˜์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ™๊ณ  0๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค. (03 00)

TimeDateStamp: ํŒŒ์ผ์˜ ๋นŒ๋“œ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. (9A 14 14 4F)

SizeOfOptionalHeader: IMAGE_OPTIONAL_HEADER32 ๊ตฌ์กฐ์ฒด์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ตฌ์กฐ์ฒด์˜ ํฌ๊ธฐ๋Š” ์ •ํ•ด์ ธ ์žˆ์ง€๋งŒ, PE๋กœ๋”๊ฐ€ ์ด ๊ฐ’์„ ๋ณด๊ณ  ๊ตฌ์กฐ์ฒด ํฌ๊ธฐ๋ฅผ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜๋‹ค. (00E0)

Characteristics: ํŒŒ์ผ์˜ ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. (0F 01)


NT Header์˜ Optional Header ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณด์ž.
3-2)NT Header - Optional Header

typedef struct _IMAGE_DATA_DIRECTORY { 
    DWORD VirtualAddress; 
    DWORD Size; 
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; 

#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 

typedef struct _IMAGE_OPTIONAL_HEADER { 
    WORD Magic; 
    BYTE MajorLinkerVersion; 
    BYTE MinorLinkerVersion; 
    DWORD SizeOfCode; 
    DWORD SizeOfInitializedData; 
    DWORD SizeOfUninitializedData; 
    DWORD AddressOfEntryPoint; 
    DWORD BaseOfCode; 
    DWORD BaseOfData; 
    DWORD ImageBase; 
    DWORD SectionAlignment; 
    DWORD FileAlignment; 
    WORD MajorOperatingSystemVersion; 
    WORD MinorOperatingSystemVersion; 
    WORD MajorImageVersion; 
    WORD MinorImageVersion; 
    WORD MajorSubsystemVersion; 
    WORD MinorSubsystemVersion; 
    DWORD Win32VersionValue; 
    DWORD SizeOfImage; 
    DWORD SizeOfHeaders; 
    DWORD CheckSum; 
    WORD Subsystem; 
    WORD DllCharacteristics; 
    DWORD SizeOfStackReserve; 
    DWORD SizeOfStackCommit; 
    DWORD SizeOfHeapReserve; 
    DWORD SizeOfHeapCommit; 
    DWORD LoaderFlags; 
    DWORD NumberOfRvaAndSizes; 
    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; 
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

Magic: ๋ช‡ bit ํ”„๋กœ๊ทธ๋žจ์ด๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. 32bit ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๋ฉด 010B์˜ ๊ฐ’์„, 64bit ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๋ฉด 020B์˜ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค. (0B 01)

AddressOfEntryPoint: entrypoint์˜ ์ƒ๋Œ€์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์œ„ ์ด๋ฏธ์ง€์—์„œ๋Š” 10 F0์˜ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค. (F0 10)

ImageBase: PEํŒŒ์ผ์ด ๋กœ๋”ฉ๋˜๋Š” ์‹œ์ž‘ ์ฃผ์†Œ๋กœ, exe ๋ฐ dll ํŒŒ์ผ์€ user memory ์˜์—ญ์— ๋กœ๋”ฉ๋œ๋‹ค. (00 00 04 00)

Section Alignment, File Alignment: Alignment๋Š” ์ •๋ ฌ์„ ์˜๋ฏธํ•œ๋‹ค. ํŒŒ์ผ/๋ฉ”๋ชจ๋ฆฌ์˜ ์„น์…˜ ํฌ๊ธฐ๋Š” ์ด์˜ ๋ฐฐ์ˆ˜๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.
์œ„์—์„  ๋‘˜ ๋‹ค 1000์˜ ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.

SizeOfImage: PE๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ๋˜์—ˆ์„ ๋•Œ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ PE Image๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ํฌ๊ธฐ์ด๋‹ค. (00 90 00 00)

SizeOfHeaders: PE ํ—ค๋”์˜ ์ „์ฒด ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์—ญ์‹œ๋‚˜1000์˜ ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. (00 10 00 00)

Subsystem: ์‹œ์Šคํ…œ ๋“œ๋ผ์ด๋ฒ„ ํŒŒ์ผ์ธ์ง€, ์ผ๋ฐ˜ ์‹คํ–‰ํŒŒ์ผ์ธ์ง€ ๊ตฌ๋ณ„ํ•œ๋‹ค. ์œ„ ํŒŒ์ผ์€ ์ผ๋ฐ˜ ์‹คํ–‰ ํŒŒ์ผ์ด๋ฏ€๋กœ, 02์˜ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค. (02 00)

NumberofRvaAndSizes: DataDirectory ๋ฐฐ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. 10์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (10 00 00 00)

DataDirectory: IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด์˜ ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๊ฐ ํ•ญ๋ชฉ๋งˆ๋‹ค ์ •์˜๋œ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

4)SECTION Header
์•ˆ์ •์„ฑ ๋•Œ๋ฌธ์— ์„น์…˜์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ €์žฅํ•œ๋‹ค.
ํ•œ ๊ณณ์— ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ž์–ด๋†“๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋‹ค ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฎ์–ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.

์„น์…˜์˜ ์†์„ฑ์—๋Š” file-memory์—์„œ์˜ ์‹œ์ž‘ ์œ„์น˜, ํฌ๊ธฐ, ๊ถŒํ•œ ๋“ฑ์ด ์žˆ๋‹ค.
๊ฐ ์„น์…˜๋ณ„๋กœ IMAGE_SECTION_HEADER ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.


PEview ํ”„๋กœ๊ทธ๋žจ์— ํŒŒ์ผ์„ ์˜ฌ๋ ค ์•ž์˜ ๋‚ด์šฉ์„ ์ง์ ‘ ํ™•์ธํ•ด ๋ณด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.