*PE ํ์ผ์ Windows ์ด์์ฒด์ ์์ ์ฌ์ฉ๋๋ ์คํ ํ์ผ ํ์์ด๋ค.
- PE ํ์ผ์ 32๋นํธ ํํ์ ์คํ ํ์ผ์ ์๋ฏธํ๋ฉฐ PE32๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
-> 64๋นํธ ํํ์ ์คํํ์ผ์ PE+ ๋๋ PE32+๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, PEํ์ผ์ ํ์ฅ ํํ์ด๋ค,
// PE64 ์๋!
1. PE File Format
(1) PE ํ์ผ์ ์ข ๋ฅ
์ข ๋ฅ | ์ฃผ์ ํ์ฅ์ |
์คํ ๊ณ์ด | EXE, SCR |
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณ์ด | DLL, OCX, CPL, DRV |
๋๋ผ์ด๋ฒ ๊ณ์ด | SYS, VXD |
์ค๋ธ์ ํธ ํ์ผ ๊ณ์ด | OBJ |
- ์๋ฐํ ์ด์ผ๊ธฐํ๋ฉด, OBJ ํ์ผ์ ์ ์ธํ ๋ชจ๋ ๊ฒ์ ์คํ ๊ฐ๋ฅํ ํ์ผ์ด๋ค.
-> DLL, SYS ํ์ผ ๋ฑ์ ์ ธ(Explorer.exe)์์ ์ง์ ์คํX But, ๋ค๋ฅธ ํํ์ ๋ฐฉ๋ฒ(๋๋ฒ๊ฑฐ, ์๋น์ค, ๊ธฐํ)๋ฅผ ์ด์ฉํ์ฌ ์คํ์ด ๊ฐ๋ฅํ ํ์ผ์
- ํด๋น ๋ถ๋ถ์ notepad.exe์ ์์ ๋ถ๋ถ์ด๋ค.
- PE ํ์ผ์ ํค๋ (PE header) ๋ถ๋ถ
- > ๋ฐ๋ก ์ด ํค๋์ ํ์ผ์ด ์คํ๋๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ์ ๋ณด๊ฐ ์ ํ์๋ค.
- ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋๋์ง
- ์ด๋์๋ถํฐ ์คํ๋์ด์ผ ํ๋์ง
- ์คํ์ ํ์ํ DLL์ด ์ด๋ค ๊ฒ์ด ์๋์ง
- ํ์ํ stack/heap ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ์ผ๋ง๋ก ํ ์ง ๋ฑ,,
์ฆ, PE File Format์ ๊ณต๋ถํ๋ค๋ ๊ฒ์ PE ํค๋์ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ณต๋ถํ๋ ๊ฒ์ด๋ผ๊ณ ํ ์ ์๋ค.
2. ๊ธฐ๋ณธ ๊ตฌ์กฐ
- notepad.exe๋ ์ผ๋ฐ์ ์ธ PE ํ์ผ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ(Basic Structure)๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ์๋ ๊ทธ๋ฆผ์ notepad.exe ํ์ผ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ(loading ๋๋ mapping)๋ ๋์ ๋ชจ์ต์ ๋ํ๋ธ ๊ฒ์ด๋ค.
- PE ํค๋: DOS header ~ Section header ๋ถ๋ถ
- PE ๋ฐ๋ : ๊ทธ ๋ฐ์ Section
- ํ์ผ์์๋ offset(์๋์ ์ธ ๊ฑฐ๋ฆฌ)์ผ๋ก, ๋ฉ๋ชจ๋ฆฌ์์๋ VA(Virtual Address, ์ ๋์ฃผ์)๋ก ์์น๋ฅผ ํํํ๋ค.
- ํ์ผ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋๋ฉด ๋ชจ์์ด ๋ฌ๋ผ์ง๋ค (Section์ ํฌ๊ธฐ, ์์น ๋ฑ)
- ํ์ผ์ ๋ด์ฉ์ ๋ณดํต ์ฝ๋(.text), ๋ฐ์ดํฐ(.data), ๋ฆฌ์์ค(.rsc)์น์ ์ ๋๋์ด ์ ์ฅ๋๋ค.
*๊ฐ๋ฐ๋๊ตฌ(VB/VC++/Delphi/..)์ ๋น๋์ต์ ์ ๋ฐ๋ผ ์น์ ์ ์ด๋ฆ, ํฌ๊ธฐ, ๊ฐ์, ์ ์ฅ ๋ด์ฉ์ด ๋ฌ๋ผ์ง๋ค.
์ถ์ฒ: https://rednooby.tistory.com/33
- ์น์ ํค๋์ ๊ฐ Section์ ๋ํ ํ์ผ/ ๋ฉ๋ชจ๋ฆฌ์์์ ํฌ๊ธฐ, ์์น, ์์ฑ ๋ฑ์ด ์ ์๋์ด ์๋ค.
- PE ํค๋์ ๋๋ถ๋ถ๊ณผ ๊ฐ ์น์
์ ๋์๋ NULL(=padding)์ด ์กด์ฌํ๋ค. (NULL Padding)
- ์ปดํจํฐ์์ ํ์ผ, ๋ฉ๋ชจ๋ฆฌ, ๋คํธ์ํฌ ํจํท ๋ฑ์ ์ฒ๋ฆฌํ ๋ ํจ์จ์ ๋์ด๊ธฐ ์ํด ์ต์ ๊ธฐ๋ณธ ๋จ์ ๊ฐ๋ ์ ์ฌ์ฉํ๋๋ฐ, PE ํ์ผ์๋ ๊ฐ์ ๊ฐ๋ ์ด ์ ์ฉ๋ ๊ฒ์ด๋ค.
- ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๊ฐ ์น์ ์ ์์ ์ฃผ์๊ฐ ์ด๋ค ๊ท์น์ ์ํด ๋ฑ๋ฑ ๋์ด์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
=> ํ์ผ/๋ฉ๋ชจ๋ฆฌ์์ ์น์ ์ ์์ ์์น๋ ๊ฐ ํ์ผ/๋ฉ๋ชจ๋ฆฌ์ ์ต์ ๊ธฐ๋ณธ ๋จ์์ ๋ฐฐ์์ ํด๋นํ๋ ์์น์ฌ์ผ ํ๊ณ , ๋น ๊ณต๊ฐ์ NULL๋ก ์ฑ์๋ฒ๋ฆฐ๋ค.
์ถ์ฒ: https://rednooby.tistory.com/33
3. VA & RVA
- VA(Virtual Address)๋ ํ๋ก์ธ์ค ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ ์ฃผ์๋ฅผ ๋งํ๋ค.
- RVA(Relative Virtual Address)๋ ์ด๋ ๊ธฐ์ค ์์น(ImageBase)์์๋ถํฐ์ ์๋์ฃผ์๋ฅผ ๋งํ๋ค.
- VA์ RVA์ ๊ด๊ณ
- RVA + ImageBase = VA
- PE ํค๋ ๋ด์ ์ ๋ณด๋ RVA ํํ๋ก ๋ ๊ฒ์ด ๋ง๋ค.
- PEํ์ผ(์ฃผ๋ก DLL)์ด ํ๋ก์ธ์ค ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ํน์ ์์น์ ๋ก๋ฉ๋๋ ์๊ฐ ์ด๋ฏธ ๊ทธ ์์น์ ๋ค๋ฅธ PE ํ์ผ(DLL)์ด ๋ก๋ฉ๋์ด ์์ ์ ์๋๋ฐ, ๊ทธ ๋ ์ฌ๋ฐฐ์น(Relocation) ๊ณผ์ ์ ํตํด ๋น์ด์๋ ๋ค๋ฅธ ์์น์ ๋ก๋ฉ๋์ด์ผ ํ๋ค. ํ์ง๋ง ๋ง์ฝ, PE ํค๋ ์ ๋ณด๋ค์ด VA(์ ๋์ฃผ์)๋ก ๋์ด์๋ค๋ฉด ์ ์์ ์ธ ์์ธ์ค๊ฐ ์ด๋ฃจ์ด์ง์ง ์์ ๊ฒ์ด๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก, ์ ๋ณด๋ฅผ RVA๋ก ํด๋๋ฉด Reloacation์ด ๋ฐ์ํด๋ ๊ธฐ์ค ์์น(ImageBase)์ ๋ํ ์๋์ฃผ์๊ฐ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์์ด ์ํ๋ ์ ๋ณด์ ์์ธ์คํ ์ ์๋ค.
ex. game.dll๊ฐ 00000000์ด๋ผ๋ ์์น์ ๋ก๋ฉ๋๋์๊ฐ notepad.dll์ด ๋จผ์ ๋ก๋ฉ์ด ๋์ด๋ฒ๋ ธ์ ๊ฒฝ์ฐ)
- ํ๋์ ์์น์ 2๊ฐ์ dllํ์ผ์ด ์ฌ๋ผ๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ์ฌ๋ฐฐ์น(Relocation)์ ํด์ค์ผ ํ๋ ์ํฉ ๋ฐ์
- ์ด๋ PEํค๋ ์ ๋ณด๋ค์ด VA(์ ๋์ฃผ์)๋ก ๋์ด์๋ค๋ฉด ์ ์์ ์ธ ์์ธ์ค๊ฐ ์ด๋ฃจ์ด ์ง์ง ์์
- ๋ฐ๋ผ์, RVA(์๋์ฃผ์)๋ก ํด์ ์ฌ๋ฐฐ์น๊ฐ ๋ฐ์ํด๋ ๊ธฐ์ค์ ๋ํ ์๋์ฃผ์๋ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์์ด ์ํ๋ ์ ๋ณด์ ์์ธ์ค ํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ถ์ฒ: https://rednooby.tistory.com/33
4. PE ํค๋
- PE ํค๋๋ ๋ง์ ๊ตฌ์กฐ์ฒด๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
(1) DOS Header
- microsoft๋ PEํ์ผ ํฌ๋งท์ ๋ง๋ค๋ DOSํ์ผ์ ๋ํ ํ์ ํธํ์ฑ์ ๊ณ ๋ คํด์ ๋ง๋ค์๋ค.
- ๊ทธ ๊ฒฐ๊ณผ๋ก PEํค๋ ์ ์ผ ์๋ถ๋ถ์๋ ๊ธฐ์กด DOS EXE Header๋ฅผ ํ์ฅ์ํจ IMAGE_DOS_HEADER๊ตฌ์กฐ์ฒด๊ฐ ์กด์ฌ
- ์ฆ IMAGE_DOS_HEADER๋ DOS EXE Header๋ฅผ ํ์ฅ์ํจ๊ฒ
- IMAGE_DOS_HEADER ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ = 40
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; // DOS signature : 4D5A ("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; // offset to NT header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
- ์ค์ํ ๋ฉค๋ฒ
- e_magic
- DOS signature (4D5A => ์์คํค๊ฐ:"MZ")
- e_Ifanew
- NT header์ offset์ ํ์ (ํ์ผ์ ๋ฐ๋ผ ๊ฐ๋ณ์ ์ธ ๊ฐ์ ๊ฐ์ง)
- ์ฆ, NT header์ ์์์์น๋ฅผ ์ ์ฅํจ
- ๋ชจ๋ PEํ์ผ์ ์์๋ถ๋ถ(e_magic)์ DOS signature(MZ)๊ฐ ์กด์ฌํ๊ณ e_lfanew๊ฐ์ด ๊ฐ๋ฆฌํค๋ ์์น์ NT header ๊ตฌ์กฐ์ฒด๊ฐ ์กด์ฌํด์ผ ํ๋ค.
- PE ์คํ์ ๋ง๊ฒ ํ์ผ ์์ 2๋ฐ์ดํธ๋ 5A4D์ด๋ฉฐ, e_Ifanew ๊ฐ์ 000000E0 ์ด๋ค.
- ์ฆ, ๋ฆฌํ์๋์์ ๊ณ ๋ คํ์ฌ ์ฃผ์๋ E0000000๊ฐ ์๋ 000000E0์ด๋ค.
๋ง์ฝ ํด๋น ๊ฐ๋ค์ ๋ณ๊ฒฝํ ํ ์ ์ฅํด์ ์คํํ ๊ฒฝ์ฐ, ์ ์ ์คํ๋์ง ์์ ๊ฒ์ด๋ค. PE ์คํ์ ๋ฐ๋ผ์ ๋ ์ด์ PE ํ์ผ์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
(2) DOS Stub
- DOS Header ๋ฐ์๋ DOS Stub์ด ์กด์ฌํ๋ค.
- DOS Stub์ ์กด์ฌ ์ฌ๋ถ๋ ์ต์ ์ด๋ฉฐ, ํฌ๊ธฐ๋ ์ผ์ ํ์ง ์๋ค. (์์ด๋ ์คํ์ ๋ฌธ์ X)
- DOS Stub์ ์ฝ๋์ ๋ฐ์ดํฐ์ ํผํฉ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- ํด๋น ๋ถ๋ถ์ 16๋นํธ ์ด์
๋ธ๋ฆฌ ๋ช
๋ น์ด์ด๋ฏ๋ก 32๋นํธ Windows OS์์๋ ์คํํ ์ ์๋ค.
- PE ํ์ผ๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ ์์ ํด๋น ๋ถ๋ถ์ ์ฝ๋๋ฅผ ๋ฌด์
- ํด๋น exe ํ์ผ์ DOS ํ๊ฒฝ์์ ์คํํ๊ฑฐ๋, DOS์ฉ ๋๋ฒ๊ฑฐ(debug.exe)๋ฅผ ์ด์ฉํด์ ์คํํ๋ฉด ํด๋น ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค.
- DOS EXE ํ์ผ๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ (์๋ํ๋ฉด ํด๋น ํ์ผ์ด PE File Format์ ๋ฐ๋ฅด๊ณ ์๋ ๊ฒ์ ๋ชจ๋ฆ)
- ๋ฐ๋ผ์, ์คํ์ ์ํด Windows XP ํ๊ฒฝ์์ "debug C:\Windows\notepad.exe" ์
๋ ฅ ํ ์ปค์ 'u' ๋ช
๋ น์ด ์
๋ ฅ
- ํ๋ฉด์ ๋ฌธ์์ด "This program cannot be run in DOS mode"์ ์ถ๋ ฅํ๊ณ ์ข ๋ฃ
- ์ด๋ฌํ ํน์ฑ์ ์ ํ์ฉํ๋ฉด DOS ํ๊ฒฝ๊ณผ Windowsํ๊ฒฝ ๋ชจ๋์์ ์คํ ๊ฐ๋ฅํ ํ๋์ ์คํ ํ์ผ(exe)๋ฅผ ๋ง๋ค ์ ์๋ค.
(3) NT Header
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; // PE Signature : 50450000 ("PE"00)
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
- IMAGE_NT_HEADERS ๊ตฌ์กฐ์ฒด์ ๋ฉค๋ฒ
- Signature -> 50450000 ("PE"00)
- FileHeader
- Optinal Header
- File Header
IMAGE_FILE_HEADERS ๊ตฌ์กฐ์ฒด (ํ์ผ์ ๊ฐ๋ต์ ์ธ ์์ฑ์ ๋ํ๋)
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;
IMAGE_FILE_HEADERS ๊ตฌ์กฐ์ฒด์ ์ค์ํ ๋ฉค๋ฒ
- Machine
- ์คํ ํ์ผ์ด ๋์ํ๋ ๋จธ์ ์ ์ํคํ ์ฒ
- Machine ๋๋ฒ๋ CPU ๋ณ๋ก ๊ณ ์ ํ ๊ฐ์ด๋ฉฐ, 32๋นํธ Intel x86 ํธํ ์นฉ์ 14C์ ๊ฐ์ ๊ฐ์ง๋ค.
- IA-32ํธํCPU = 14Ch
- IA-64ํธํCPU = 200h
- NumberOfSections
- ์น์
์ ๊ฐ์๋ฅผ ๋ํ๋ธ๋ค.
- PE ํ์ผ์ ์ฝ๋, ๋ฐ์ดํฐ, ๋ฆฌ์์ค ๋ฑ์ด ๊ฐ๊ฐ์ ์น์ ์ ๋๋์ด ์ ์ฅ๋จ. ์ด ์น์ ์ ๊ฐ์๋ฅผ ์๋ฏธํจ
- ์ด ๊ฐ์ ๋ฐ๋์ 0๋ณด๋ค ์ปค์ผ ํ๋ค
- ์ ์๋ ์น์ ๊ฐ์์ ์ค์ ์น์ ์ด ๋ค๋ฅด๋ฉด ์คํ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- ์น์
์ ๊ฐ์๋ฅผ ๋ํ๋ธ๋ค.
- SizeOfOptionalHeader
- IMAGE_OPTIONAL_HEADER32 ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค
- IMAGE_OPTIONAL_HEADER32 ๊ตฌ์กฐ์ฒด๋ C์ธ์ด์ ๊ตฌ์กฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ทธ ํฌ๊ธฐ๊ฐ ์ด๋ฏธ ๊ฒฐ์ ๋์ด ์๋ค. ํ์ง๋ง, PE ๋ก๋๋ IMAGE_FILE_HEADER์ SizeOfOptionalHeader ๊ฐ์ ๋ณด๊ณ ๊ทธ ํฌ๊ธฐ๋ฅผ ์ธ์ํ๋ค.
- PE32+ ์ ๊ฒฝ์ฐ, IMAGE_OPTIONAL_HEADER64 ๊ตฌ์กฐ์ฒด ์ฌ์ฉ
- ๋ฐ๋ผ์, ๋ ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ SizeOfOptionalHeader ๋ฉค๋ฒ์ ๊ตฌ์กฐ์ฒด ํฌ๊ธฐ๋ฅผ ๋ช ์ํ๋ ๊ฒ์ด๋ค.
IMAGE_DOS_HEADER์ e_Ifanew ๋ฉค๋ฒ์ IMAGE_FILE_HEADER์ SizeOfOptionalHeader ๋ฉค๋ฒ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ PE ํ์ผ ํ์์ ๋ฒ์ด๋๋ ์ผ๋ช '๊ฝ๋ฐฐ๊ธฐ' PE ํ์ผ (PE Patch)๋ฅผ ๋ง๋ค ์ ์๋ค.
- Characteristics
- ํ์ผ์ ์์ฑ์ ๋ํ๋ด๋ ๊ฐ
- ์คํ์ด ๊ฐ๋ฅํ ํํ์ธ์ง (executable or not) ํน์ DLL ํ์ผ์ธ์ง ๋ฑ์ ์ ๋ณด๋ค์ด bit OR ํ์์ผ๋ก ์กฐํฉ๋๋ค.
- TimeDateStamp
- ํ์ผ์ ๋น๋ ์๊ฐ
- ํ์ผ์ ์คํ์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ฐ
- Optional Header
- PE ํค๋์ ๊ตฌ์กฐ์ฒด์ค ๊ฐ์ฅ ํฌ๊ธฐ๊ฐ ํฐ IMAGE_OPTIONAL_HEADER32 ๊ตฌ์กฐ์ฒด๋ค.
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;
IMAGE_OPTIONAL_HEADER32 ๊ตฌ์กฐ์ฒด์์ ์ค์ํ ๋ฉค๋ฒ (ํ์์ ์ด๊ณ , ์๋ชป ์ธํ ๋๋ฉด ํ์ผ ์คํ ๋ถ๊ฐ)
- Magic
- IMAGE_OPTIONAL_HEADER32 ๊ตฌ์กฐ์ฒด์ธ ๊ฒฝ์ฐ, 10B
- IMAGE_OPTIONAL_ HEADER64 ๊ตฌ์กฐ์ฒด์ธ ๊ฒฝ์ฐ, 20B
- AddressOfEntryPoint
- EP(EntryPoint)์ RVA ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค.
- ์ต์ด๋ก ์คํ๋๋ ์ฝ๋์ ์์ ์ฃผ์๋ก, ๋งค์ฐ ์ค์ํ ๊ฐ์ด๋ค.
- SizeOfCode : ์ฝ๋ ์์ญ ํฌ๊ธฐ
- BaseOfCode: ์ฝ๋ ์์ญ์ด Image Base + Base Of Code ๋ถํฐ ์์
- ImageBase
- PEํ์ผ์ด ๋ก๋ฉ๋๋ ์์์ฃผ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค
- EXE, DLL๊ณผ ๊ฐ์ ํ์ผ์ ๋ณดํต 00000000~7FFFFFFF ์ฌ์ด์ ๋ก๋ฉ๋๋ค.
- SYSํ์ผ์ 80000000~FFFFFFFF(์ปค๋ ๋ฉ๋ชจ๋ฆฌ) ์์ญ์ ๋ก๋ฉ๋๋ค.
- ์ผ๋ฐ์ ์ธ VC++/VB๋ฑ์ ๋๊ตฌ๋ก ๋ง๋ค์ด์ง EXE ํ์ผ์ ImageBase๊ฐ์ 10000000์ ๊ฐ์ง๋ค. (๋น์ฐํ ๋ค๋ฅธ ๊ฐ ์ง์ ๊ฐ๋ฅ)
- ๋ก๋๊ฐ PEํ์ผ์ ์คํํ ๋ ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉํํ EIP ๋ ์ง์คํฐ๋ฅผ ImageBase + AddressOfEntryPoint ๊ฐ์ผ๋ก ์ธํ ํ๋ค.
- SectionAlignment, FileAlignment
- PE ํ์ผ์ body ๋ถ๋ถ์ ์น์
์ผ๋ก ๋๋์ด์ ธ ์๋๋ฐ, ์ด๋
- ํ์ผ์์ ์น์ ์ ์ต์ ๋จ์ - FileAlignment
- ๋ฉ๋ชจ๋ฆฌ์์ ์น์
์ ์ต์ ๋จ์ - SectionAlignment
- ๋ ๊ฐ์ ๊ฐ์ ์๋ ์๊ณ , ๋ค๋ฅผ ์๋ ์๋ค.
- ํ์ผ/๋ฉ๋ชจ๋ฆฌ์ ์น์ ํฌ๊ธฐ๋ ๋ฐ๋์ ๊ฐ๊ฐ FileAlignment/SectionAlignment์ ๋ฐฐ์๊ฐ ๋์ด์ผ ํ๋ค.
- PE ํ์ผ์ body ๋ถ๋ถ์ ์น์
์ผ๋ก ๋๋์ด์ ธ ์๋๋ฐ, ์ด๋
- SizeofImage
- PEํ์ผ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋์์ ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ PE Image๊ฐ ์ฐจ์งํ๋ ํฌ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ํ์ผ์ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋ ํฌ๊ธฐ๋ ๋ค๋ฅด๋ค,
- ๊ฐ ์น์ ๋ณ ๋ก๋ฉ ์์น์ ํฌ๊ธฐ๋ ์น์ ํค๋์ ์ ์๋์ด ์์
- SizeOfHeader
- PEํค๋์ ์ ์ฒด ํฌ๊ธฐ๋ฅผ ๋ํ๋ธ๋ค.
- FileAlignment์ ๋ฐฐ์์ฌ์ผ ํ๋ค.
- PE ํค๋ ๋ค์์ ์น์ ์ด ์์นํ๋ฏ๋ก ํ์ผ์ ์์ ์ฃผ์(offset)์์ SizeOfHeader๊ฐ ๋งํผ ์ฐจ์ด๋๋ ์์น์ ์ฒซ ๋ฒ์งธ ์น์ ์ด ์์นํ๋ค๋ ์๊ธฐ๋ค.
- Subsystem
- ์ด Subsystem ๊ฐ์ ํตํด ์ด ํ์ผ์ด ์์คํ ๋๋ผ์ด๋ฒ ํ์ผ(*.sys)์ธ์ง, ์๋๋ฉด ๊ทธ๋ฅ ์คํ ํ์ผ(*.exe, *.dll)์ธ์ง ๊ตฌ๋ถํ ์ ์๋ค.
๊ฐ | ์๋ฏธ | ๋น๊ณ |
1 | Driver file | ์์คํ ๋๋ผ์ด๋ฒ (ex. ntfs.sys) |
2 | GUI (Graphic User Interface) ํ์ผ | ์ฐฝ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ (ex. notepad.exe) |
3 | CUI (Console User Interface) ํ์ผ | ์ฝ์ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ (ex. cmd.exe) |
- NumberofRvaAndSizes
- IMAGE_OPTIONAL_HEADER ๊ตฌ์กฐ์ฒด์ ๋ง์ง๋ง ๋ฉค๋ฒ๋ DataDirectory ๋ฐฐ์ด์ ๊ฐ์๋ฅผ ๋ํ๋ธ๋ค.
- ๊ตฌ์กฐ์ฒด ์ ์์ ๋ฐฐ์ด์ ๊ฐ์๊ฐ 16์ด๋ผ๊ณ ๋ช
์๋์ด ์์ง๋ง, PE ๋ก๋๋ NumberofRvaAndSizes ๊ฐ์ ๋ณด๊ณ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ธ์ํ๋ค.
- ๋ฐ๋ผ์, 16์ด ์๋์๋ ์์
- DataDiretory
- IMAGE_DATA_DIRECTORY ๊ตฌ์กฐ์ฒด์ ๋ฐฐ์ด
(4) IMAGE_OPTIONAL_HEADER ์ ์ฒด
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sol9501&logNo=70101390393 ์ฐธ๊ณ
(4) ์น์ ํค๋
- ๊ฐ ์น์ ์ ์์ฑ(Property)์ ์ ์ํ ๊ฒ
- ํ๋ก๊ทธ๋จ์ ์์ ์ฑ
- PE ํ์ผ์ Code, Data, Resource ๋ฑ์ ์น์
๋ณ๋ก ๊ตฌ๋ถํด์ ์ ์ฅํ๋ค.
- ์น์ ๋ณ๋ก ๊ตฌ๋ถ -> ์์ ์ฑ ํฅ์
- ์น์
๋ง๋ค ๊ทธ ์ฉ๋์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๊ธฐ์ ์์ฑ๋ค์ด ์ ๊ทผ ๊ถํ, ํน์ฑ ๋ฑ์ ๋ค๋ฅด๊ฒ ์ค์ ํ๊ธฐ ์ํด Section Header๊ฐ ์กด์ฌํ๋ค.
- file/memory์์์ ์์ ์์น, ํฌ๊ธฐ, ์์ธ์ค ๊ถํ ๋ฑ
์ข ๋ฅ | ์์ธ์ค ๊ถํ |
code | ์คํ, ์ฝ๊ธฐ ๊ถํ |
data | ๋น์คํ, ์ฝ๊ธฐ, ์ฐ๊ธฐ ๊ถํ |
resource | ๋น์คํ, ์ฝ๊ธฐ ๊ถํ |
IMAGE_SECTION_HEADER
์น์ ๋ช | ์ฉ๋ |
.text | ์คํ ์ฝ๋ |
.data | ์ด๊ธฐํ๋ ์ ์ญ ๋ณ์, static ๋ณ์ |
.rdata | Const ๋ณ์, ๋ฌธ์์ด ์์ |
.bss | ์ด๊ธฐํ ๋ณ์, static ๋ณ์, ๋ฌด์ง์ญ, ๊ธฐํ ์์ |
.edata | EAT์ ๊ด๋ จ๋ ์ ๋ณด |
.idata | IAT์ ๊ด๋ จ๋ ์ ๋ณด |
.rsrc | ๋ฆฌ์์ค ์ ๋ณด |
#defome IMAGE_SECTION_HEADER 8
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;
- IMAGE_SECTION_HEADER ๊ตฌ์กฐ์ฒด์ ์ค์ ๋ฉค๋ฒ
ํญ๋ชฉ | ์๋ฏธ |
VirtualSize | ๋ฉ๋ชจ๋ฆฌ์์ ์น์ ์ด ์ฐจ์งํ๋ ํฌ๊ธฐ |
VirtualAddress | ๋ฉ๋ชจ๋ฆฌ์์ ์น์ ์ ์์ ์ฃผ์ (RVA) |
SizeOfRawData | ํ์ผ์์ ์น์ ์ด ์ฐจ์งํ๋ ํฌ๊ธฐ |
PointerToRawData | ํ์ผ์์ ์น์ ์ด ์์์์น |
Characteristics | ์น์ ์ด ์์ฑ(bit OR) |
- VirtualAddress์ PointerToRawData๋ ์๋ฌด๊ฐ์ด๋ ๊ฐ์ง ์ ์๊ณ , ๊ฐ๊ฐ SectionAlignment์ FileAlingment์ ๋ง๊ฒ ๊ฒฐ์ ๋จ
- VirtualSize์ SizeofRawData๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง๋ค.
- ์ฆ, ํ์ผ์์์ ์น์ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋ ์น์ ์ ํฌ๊ธฐ๋ ๋ค๋ฆ
- Name ํญ๋ชฉ
- Name ํญ๋ชฉ์ C์ธ์ด์ ๋ฌธ์์ด์ฒ๋ผ NULL๋ก ๋๋์ง ์๋๋ค,
- ๋ํ ์์คํค ๊ฐ๋ง ์์ผํ๋ค๋ ์ ํ๋ ์๋ค.
- PE ์คํ์๋ ์น์ Name์ ๋ํ ์ด๋ํ ๋ช ์์ ์ธ ๊ท์น์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ป๋ ๊ฐ์ ๋ฃ์ด๋ ๋๊ณ , ์ฌ์ง์ด NULL์ ์ฑ์๋ ๋๋ค.
- ๋ฐ๋ผ์, ์น์ ์ Name์ ๊ทธ๋ฅ ์ฐธ๊ณ ์ฉ์ผ ๋ฟ, ์ด๋ค ์ ๋ณด๋ก์จ ํ์ฉํ๊ธฐ์๋ 100% ์ฅ๋ดํ ์ ์๋ค.
5. RVA to RAW
- PE ํ์ผ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋์์ ๋, ๊ฐ ์น์ ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์(RVA)์ ํ์ผ offset์ ์ ๋งคํํ ์ ์์ด์ผ ํจ
=> 'RVA to RAW'
- RVA๊ฐ ์ํด์๋ ์น์ ์ ์ฐพ๋๋ค
- ๊ฐ๋จํ ๋น๋ก์์ ์ฌ์ฉํด์ ํ์ผ offset(RAW)์ ๊ณ์ฐํ๋ค.
**๋น๋ก์**
RAW - PointerToRawData = RVA - VirtualAddress