01. PE (Portable Executable)
- Microsoft์ ์ด์ ์ฒด์ Window OS์์ ์ง์๋๋ ์คํ ํ์ผ์ ๊ตฌ์กฐ
- ํ์ผ์ด ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ฎ๊ฒจ์ ธ๋ ์คํ ๊ฐ๋ฅํ๋๋ก ๋ง๋ ํฌ๋งท์ผ๋ก ๋ค์ํ ์ด์์ฒด์ ์์์ ์ด์์ฑ์ ๋ณด์ฌ์ค๋ค๋ ์๋ฏธ์์ Portable Executable์ด๋ผ๊ณ ๋ถ๋ฆผ
- Window Loader๊ฐ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ์บก์ํํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ฒด
- ์ฝ๋ ์ ๋ณด, ์ ํ๋ฆฌ์ผ์ด์ ์ ํ, ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์, ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์๊ตฌ์ฌํญ ์ ๋ณด ํฌํจ
- ์ฐธ์กฐํ DLL, API import ํ ์ด๋ธ, ์์ ๊ด๋ฆฌ ๋ฐ์ดํฐ, TLS ๋ฐ์ดํฐ ํฌํจ
1.1 PE ํ์ผ ์ข ๋ฅ
- ์คํ ํ์ผ ๊ณ์ด : EXE, SCR(Screen Saver)
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณ์ด : DLL, OCX(Active X), CPL, DRV
- ๋๋ผ์ด๋ฒ ๊ณ์ด: SYS, VXD
- ์ค๋ธ์ ํธ ํ์ผ ๊ณ์ด : OBJ
1.2 ๋ถ์ ๋๊ตฌ
- PEview
- PEiD : header๋ฅผ ๊ฐ๋จํ๊ฒ ๋ณด์ฌ์ค.
- exeinfo
- pestudio
- Stud_PE
- prefram.ph
1.3 PE ํ์ผ ์์ฑ ๊ณผ์
Compile
- ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผ ํ๋ฉด ํค๋ ํ์ผ๊ณผ ์์ค ํ์ผ์ ํฉ์ณ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๊ฐ ๋ง๋ค์ด ์ง๋ค.
- ์ด ๊ณผ์ ์์ Object ํ์ผ์ด ๋ง๋ค์ด์ง๋ฉฐ ๊ธฐ๊ณ์ด ์ฝ๋, ์ฌ๋ณผ ํ ์ด๋ธ, ๋ฐ์ดํฐ ์น์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
Linking
- ๋ค์์ Object ํ์ผ์ ํ๋์ ์คํ ํ์ผ๋ก ๊ฒฐํฉํ๋ค.
- ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ(.lib, .dll)์ ์ฐธ์กฐํ์ฌ ํ๋ก๊ทธ๋จ์ด ํ์๋ก ํ๋ ์ธ๋ถ ํจ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋ค.
- ํ๋ก๊ทธ๋จ์ ์ํธ๋ฆฌ ํฌ์ธํธ๊ฐ ๊ฒฐ์ ๋๊ณ , ํ๋ก๊ทธ๋จ ๋ด์ ์ฌ๋ณผ๋ค์ด ์ฃผ์๋ก ๋ณํ๋๋ค.
PE file
- ๋งํน ๊ณผ์ ์ด ์๋ฃ๋๋ฉด, ๋ง์ปค๋ PE ํ์ผ์ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ค.
02. PE ํ์ผ ๊ตฌ์กฐ
PE ํ์ผ์ ํฌ๊ฒ PE ํค๋์ ์น์ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋ค. PE ํค๋๋ ํ์ผ์ ์คํํ๊ธฐ ์ํ ์ ๋ฐ์ ์ธ ์ ๋ณด๊ฐ ๊ตฌ์กฐ์ฒด ํ์์ผ๋ก ์ ์ฅ๋์ด ์๊ณ , ์น์ ๋ถ๋ถ์ ํ์ผ์ ์ค์ ์ฝ๋,. ๋ฐ์ดํฐ, ๋ฆฌ์์ค ๋ฑ์ ๋ด์ฉ์ด ์กด์ฌํ๋ค.
2.1 DOS Header
- “4D 5A”๋ก ์์ํ๋ฉฐ PE ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ์ผ์ธ์ง ํ๋จํ๋๋ฐ ์ฌ์ฉ๋๋ค.
- ์์ ๋ถ๋ถ๋ถํฐ 64byte๊น์ง Image Dos Header ๋ถ๋ถ์ด๋ค.
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic;
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;
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
- Image Dos Header ์ ๋ค์ด๊ฐ ๋ด์ฉ์ WinNT.H ํค๋ ํ์ผ์ ๊ตฌ์กฐ์ฒด์ ํ์์ผ๋ก ์ค์ ๋์ด ์๋ค.
- ์ด ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ฉฐ 64byte ์ด๋ค.
- e_magic : PE ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ํ์ผ์ธ์ง ํ์ธํ ๋ . ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ๊ฐ์ฅ ๋จผ์ ์ด ๋ถ๋ถ์ 2Byte๋ฅผ ์ฝ์ด์จ ํ “4D 5A”๊ฐ ๋ง๋์ง ํ์ธํ๋ค.
- e_lfanew : Image_NT_Header์ ์์ ์ฃผ์๋ฅผ ๋ํ๋ธ๋ค. ํ์ผ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ด ์ ์ฅ๋๋ค.
2.2 DOS Stub
- DOS ๋ชจ๋์์ ์คํ๋์์ ๋ ์คํํ ๋ด์ฉ์ ์ ์ฅ
- DOS ๋ชจ๋๋ก ์คํ๋์ง ์๋ ๊ฒฝ์ฐ “This program cannot be run in DOS mode”๋ผ๋ ๋ฉ์์ง๋ฅผ ๋ํ๋ธ๋ค.
2.3 NT Header
IMAGE_NT_HEADERS
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
- “50 45 00 00”(PE..) ์ผ๋ก ์์ํ๋ ์ง์ ์ด NT_Header์ ์์ ๋ถ๋ถ์ด๋ค.
- WinNT.H์ ๊ตฌ์กฐ์ฒด์์ e_lfanew์ ์ ์ฅ๋ ์ฃผ์๊ฐ์ด ๊ฐ๋ฅดํค๋ ๋ถ๋ถ์ด ์ด ๋ถ๋ถ์ด๋ค.
- ๋์ํ๋ CPU, ์น์ ์ ์, ์์ฑ ์๊ฐ ๋ฑ ํ์ผ์ ์คํ์ ํ์ํ ์ฃผ์ ์ ๋ณด๋ค์ ์ ์ฅํ๋ค.
IMAGE_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 ์ข ๋ฅ |
Number Of Sections | ์ด ํ์ผ์ด ๊ฐ์ง ์ธ์ ์ ๊ฐ์๋ฅผ ์๋ฆผ |
์ผ๋ฐ์ ์ผ๋ก .text, .rdata, .data, .rsrc 4๊ฐ ์น์ ์ด ์กด์ฌ | |
Time Data Stamp | obj → PE ํ์ผ์ ๋ง๋ ์๊ฐ์ ์๋ฆผ |
Size Of Optional Header | MAGE_OPTIONAL_HEADER32์ ๊ตฌ์กฐ์ฒด ํฌ๊ธฐ๋ฅผ ์๋ฆผ. |
์ด์์ฒด์ ๋ง๋ค ํฌ๊ธฐ๊ฐ ๋ค๋ฅผ ์ ์์ด PE๋ก๋์์๋ ์ด ๊ฐ์ ๋จผ์ ํ์ธ | |
Characteristics | ํ์ฌ ํ์ผ ํ์ |
IMAGE_OPTIONAL_HEADER
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 | 32bit → 0x10B |
64bit → 0x20B | |
Major Linker Version Minor Linker Version |
์ฌ์ฉํ ์ปดํ์ผ๋ฌ ๋ฒ์ |
Size Of Code | ์ฝ๋ ์์ ์ ์ฒด ํฌ๊ธฐ - ์ ์ฑ์ฝ๋ : ์ด ๊ฐ์ ์ฐธ๊ณ ํ์ฌ ์์ ์ ์ฝ๋๋ฅผ ๋ณต์ ํ ์์น ๊ธฐ์ค์ ์ก์ - ์๋ฃจ์ : ์ฝ๋ ์น์ ์ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ |
Address Of Entry Point | ํ์ผ์ด ๋ฉ๋ชจ๋ฆฌ์์ ์์๋๋ ์ง์ . |
Base Of Code | ์คํ ์ฝ๋ ์์น. - ImageBase ์ BaseOfCode ๋ฅผ ๋ํ ๊ฐ๋ถํฐ ์ฝ๋ ์์ |
Image Base | ๋ก๋ํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ |
Section Alignment File Alignment |
๊ฐ ์ธ์
์ ์ ๋ ฌํ๊ธฐ ์ํ ์ ๋ ฌ ๋จ์ ๊ธฐ๋ณธ๊ฐ 0x1000 |
Size Of Image | EXE/DLL์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋์ ๋ ์ ์ฒดํฌ๊ธฐ |
Size Of Headers | PEํค๋์ ํฌ๊ธฐ๋ฅผ ์๋ฆผ ๊ธฐ๋ณธ๊ฐ 0x1000 |
IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด | - VirtualAddress์ Size ํ๋ - Export, Import, Rsrc ๋๋ ํฐ๋ฆฌ์ IAT ๋ฑ์ ๊ฐ์ ์ฃผ์์ ํฌ๊ธฐ ์ ๋ณด |
2.4 SECTION_HEADER
๊ฐ ์ธ์ ์ ๋ํ ์ด๋ฆ, ์์ ์ฃผ์, ์ฌ์ด์ฆ ๋ฑ์ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๊ตฌ์กฐ์ฒด์ด๋ค.
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
๋ณ์๋ช | ์ค๋ช |
Name | ์น์ ์ ์ด๋ฆ(์: .text, .data, .rsrc ๋ฑ) |
Virtual Size | ์น์ ์ ํฌ๊ธฐ |
Virtual Address | ์น์ ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ๋์ ์ฃผ์. |
Size Of Raw Data | ํ์ผ ๋ด์์ ์น์ ์ด ์ฐจ์งํ๋ ํฌ๊ธฐ. |
Pointer To Raw Data | ํ์ผ ๋ด์์ ์น์ ๋ฐ์ดํฐ๊ฐ ์์๋๋ ์์น |
2.5 Section
PEํ์ผ ์์ ์น์ ์ ํ๋ก๊ทธ๋จ์ ์ค์ ๋ด์ฉ์ ๋ด๊ณ ์๋ ๋ธ๋ก. ๊ฐ ์น์ ์์ ๋ด๊ณ ์๋ ์ ๋ณด๋ค์ ์๋์ ๊ฐ๋ค.
Section ์ข ๋ฅ
์น์ ์ด๋ฆ ์ค๋ช
์น์ | ์ด๋ฆ | ์ค๋ช |
.text | ์ฝ๋ ์น์ | - ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํ ์ฝ๋๋ฅผ ๋ด๋ ์น์
- CPU์ ๋ช ๋ น ํฌ์ธํฐ๊ฐ ๋๋ IP ๋ ์ง์คํฐ๋ ์ด ์น์ ๋ด์ ์กด์ฌํ๋ ์ง๋ฅผ ๊ฐ์ง - 32๋นํธ์ ๊ฒฝ์ฐ VC++ 7.0๋ถํฐ ์คํ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋์์ ์ด๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ .text ์น์ ์ด ์กด์ฌ |
.data | ๋ฐ์ดํฐ ์น์ | - ์ด๊ธฐํ๋ ์ ์ญ ๋ณ์๋ค์ ๋ด๊ณ ์๋ ์ฝ๊ณ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ ์น์
- ์ด์ ์๋ ์ด๊ธฐํ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ํ ๋ฐ์ดํฐ ์น์ ์ผ๋ก .bss ์น์ ์ ์ ๊ณต. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํ๋ ๋ ๋ณดํต .data ์น์ ์ ๋ณํฉ - 64๋นํธ์์๋ PE ํ์ผ์์๋ถํฐ .bss ์น์ ๊ณผ .data ์น์ ์ ๋ณํฉ |
.rdata | ์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ ์น์ | - ๋ฌธ์์ด ์์๋ C++ ๊ฐ์ ํจ์ ํ
์ด๋ธ ๋ฑ์ ๋ฐฐ์น - ์ฝ๋ ์์ ์ฐธ์กฐํ๋ ์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ(.edata, .debug ๋ฑ)๋ ์ด ์น์ ์ ๋ณํฉ |
.reloc | ๊ธฐ์ค ์ฌ๋ฐฐ์น ์น์ | - ์คํ ํ์ผ์ ๋ํ ๊ธฐ์ค ์ฌ๋ฐฐ์น ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ์น์ |
.edata | ๋ด๋ณด๋ด๊ธฐ(export) ์น์ | - ๋ด๋ณด๋ผ ํจ์์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ์น์
- .rdata์ ๋ณํฉ๋๊ธฐ ๋๋ฌธ์ DLL์์ ๋ณ๋์ ์ธ์ ์ด ์กด์ฌํ์ง ์์ |
.idata | ๊ฐ์ ธ์ค๊ธฐ(import) ์น์ | - ๊ฐ์ ธ์ฌ dll๊ณผ ๊ทธ ํจ์ ๋ฐ ๋ณ์์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ์น์
- IAT(Import Address Table)์ด ์กด์ฌ - .rdata์ ๋ณํฉ |
.didat | ์ง์ฐ ๋ก๋ ์น์ | - ์ง์ฐ ๋ก๋ฉ(Delay-Loading)์ ์ํ ์น์ |
.tls | TLS ์น์ | _declspec(thread) ์ง์์ด์ ํจ๊ป ์ ์ธ๋๋ ์ค๋ ๋ ์ง์ญ ์ ์ฅ์(Thread Local Storage)๋ฅผ ์ํ ์น์ |
.rsrc | ๋ฆฌ์์ค ์น์ | ๋ํ์์, ์์ด์ฝ, ์ปค์, ๋ฒ์ ์ ๋ณด ๋ฑ์ ์๋์ฐ PE ํ์ผ์ด ๋ด๊ณ ์๋ ๋ฆฌ์์ค ๊ด๋ จ ๋ฐ์ดํฐ๋ค์ด ๋ฐฐ์น |
.debug | ๋๋ฒ๊น ์น์ | - ๋๋ฒ๊น
์ ๋ณด๋ฅผ ํฌํจ - MS๋ ์ค๋์ ๋ถํฐ ์ด ์น์ ์ ๋๋ฒ๊น ๊ด๋ จ ๊ธฐ์ด ์ ๋ณด๋ง์ ๋ด๊ณ , ์ค์ ์ ๋ณด๋ PDB ํ์ผ์ ๋ณ๋๋ก ๋ณด๊ด |
์น์ ์ด๋ฆ์ ๊ฒฝ์ฐ ๊ถ์ฅ๊ฐ์ด๋ฏ๋ก ์น์ ์ด๋ฆ์ผ๋ก ๋ด์ฉ์ ํ๋จํ๋ฉด ์๋๋ค. ํนํ, ๋ฆด๋ฆฌ์ฆ ์ต์ ๊ฐ์ ๊ฒฝ์ฐ, ์น์ ๋ค์ด ํฉ์ณ์ ธ์ ํ๋์ ์น์ ์ผ๋ก ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ์น์ ์ด๋ฆ์ ์ด์ฉํด์ ์ฐพ๋ ๊ฒ๋ณด๋ค IMAGE_NT_HEADER์ ์๋ Data Directory์ ๊ฐ์ ์ฐธ์กฐํด์ ์ฐพ๋๋ก ํด์ผ ํ๋ค.
์ฐธ์กฐ
https://mocharoll.tistory.com/15
'๐ฆพ ๋ณด์ ๐ฆพ > ๋ฆฌ๋ฒ์ฑ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Practical Malware Analysis] Lab01-01.exe, Lab01-01.dll ๋ถ์ (0) | 2024.09.30 |
---|---|
x86-64 ์ด์ ๋ธ๋ฆฌ์ด (0) | 2024.08.28 |
x86-64 CPU ๋ ์ง์คํฐ (0) | 2024.08.28 |
CPU ๊ตฌ์กฐ (1) | 2024.08.26 |
[๋ฆฌ๋ฒ์ฑ] kali - pwndbg ์ธํ & ๊ธฐ๋ณธ ๋ช ๋ น์ด (0) | 2024.08.22 |