๋ณธ๋ก ์ ๋ค์ด๊ฐ๊ธฐ ์์, 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 ํ๋ก๊ทธ๋จ์ ํ์ผ์ ์ฌ๋ ค ์์ ๋ด์ฉ์ ์ง์ ํ์ธํด ๋ณด๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
'reverse engineering' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[PE ํ๋กํ ํฐ ์ ์] PE ํ์ฑํ๊ธฐ (0) | 2023.12.17 |
---|---|
[Anti-Reversing] Anti Disassembly ๊ตฌํ (0) | 2022.08.15 |
[Anti-Reversing] IsDebuggerPresent() ๊ตฌํ (4) | 2022.08.09 |
[๋ฆฌ๋ฒ์ฑ ํต์ฌ์๋ฆฌ] DLL injection ์์ ์ฝ๋ ํด์ค (0) | 2021.07.11 |
Bank Robbery ๋ฌธ์ ํ์ด ๋ณด๊ณ ์ (2) | 2021.01.23 |