PE์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
์น์ ํค๋
์น์ ํค๋: ๊ฐ ์น์ ์ ์์ฑ(property)์ ์ ์ํ ๊ฒ
- ์น์
์ ๋๋ ๋ ์ด์ ?
- ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ์ํด
- ๋ฐ๋ผ์ ๊ฐ ์น์ ์ ์์ฑ์ ๊ธฐ์ ํ ์น์ ํค๋๊ฐ ํ์ํด์ง.
- code, data, resource ๋ง๋ค ๊ฐ์์ ํน์ฑ, ์ ๊ทผ ๊ดํ ๋ฑ์ ๋ค๋ฅด๊ฒ ์ค์ ํ ํ์๊ฐ ์์.
- ํ์ผ/๋ฉ๋ชจ๋ฆฌ์์ ์์ ์์น, ํฌ๊ธฐ, ์์ธ์ค ๊ถํ ๋ฑ ๊ฐ ์น์ ์ ์ ๋ณด์ ์์ฑ, ์ ๊ทผ ๊ถํ์ ์ ๋ฆฌํด์ ์น์ ํค๋์ ๋ฃ์ด๋ .
- ์น์ ํค๋๋ ๊ฐ ์น์ ๋ณ IMAGE_SECTION_HEADER์ ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด๋ก ์ด๋ฃจ์ด์ง
- Virtual Size: ๋ฉ๋ชจ๋ฆฌ์์ ์น์ ์ด ์ฐจ์งํ๋ ํฌ๊ธฐ
- Virtual Address: ๋ฉ๋ชจ๋ฆฌ์์ ์น์ ์ ์์ ์ฃผ์(RVA)
- SizeOfRawData: ํ์ผ์์ ์น์ ์ด ์ฐจ์งํ๋ ํฌ๊ธฐ
- PointerToRawData: ํ์ผ์์ ์น์ ์ ์์ ์์น
- Characteristics: ์น์ ์ ์์ฑ(bit OR)
→ VirtualAddress์ PointerToRawData๋ ์๋ฌด ๊ฐ์ด ์๋๋ผ ์์ ์ ์๋ SectionAlignment์ FileAlignment์ ๋ง๊ฒ ๊ฒฐ์ .
์ผ๋ฐ์ ์ผ๋ก VirtualSize์ SizeOfRawData๋ ์๋ก ๋ค๋ฅธ ๊ฐ
(ํ์ผ์์ ์น์ ์ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋ ์น์ ์ ํฌ๊ธฐ๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์)
- NT HEADER์ Characterisitc ํญ๋ชฉ์ฒ๋ผ ๋ค ๋ํด์ ๋ํ๋ธ๋ค.
- PE ์คํ์๋ Name์ ์ง์ ๋ ๊ท์น์ด ์๋ค.
- ๋ฐ์ดํฐ ์น์ ์ด๋ฆ์ .code๋ก ํด๋ ์คํ์ด ๋๋ค.
- ๋ฐ๋ผ์ ์ ๋ณด๊ฐ ์๋๋ผ ๊ทธ๋ฅ ์ฐธ๊ณ ์ฉ์ผ๋ก ๋ด์ผ ํ๋ค.
- ์ฌ๊ธฐ์ 'IMAGE'๋ ํ์ผ์์ PE์ ๋ฉ๋ชจ๋ฆฌ์์ PE๊ฐ ๋ชจ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, '๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋ PE์ ์ํ'๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- ๊ทธ๋์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋ PE๊ฐ ์์ํ๋ ์ง์ = ImageBase
- ๊ฐ ์น์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ก๋ฉ ์ดํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ํ์ผ ์คํ์ ์ ์ ๋งค์นญ์ํฌ ์ ์๋ค๋ฉด ๋์์ด ๋จ!
RVA to RAW
- RVA to RAW: RVA๊ฐ ์ํ ์น์ ์ ์ฐพ์์ RAW๋ฅผ ์์ ๋น๋ก์์ผ๋ก ๊ณ์ฐ
- ๋จผ์ ํด๋น RAV๊ฐ์ด ์ํ ์น์
์ ์ฐพ์์ผ ํ๋ค.
- RVA 5000 → ์ฒซ๋ฒ์งธ ํ ์คํธ ์น์ ์ ์ํด์๋ค. (ImageBase 01000000์ ๊ณ ๋ คํด์ VA๋ฅผ ๊ตฌํ ์ ์์)
- ๋น๋ก์์ ๋ฐ๋ผ ๊ณ์ฐ
- RAW = 5000(RVA) - 1000(VirtualAddress, ๋ฉ๋ชจ๋ฆฌ์์ ํค๋-ํ ์คํธ ์น์ ๊น์ง์ ๊ฑฐ๋ฆฌ)+400(PointerToRawData) = 4400
- VirtualAddress๊ฐ 1000์ธ ์ด์ ๋ Memory์์ ์ฒซ ๋ฒ์งธ Section์ด 01001000์์ ์์ํ๋ฏ๋ก 1000์ด๋ค. (ImageBase ๊ฐ์ ๋นผ๋ฉด) PointerToRawData ๊ฐ์ด 400์ธ ์ด์ ๋ File์์ ์ฒซ ๋ฒ์งธ Section์ด 00000400์์ ์์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์น์
- ์น์ ํค๋๋ค์ด ์น์ ํ ์ด๋ธ์ ์ ๋ฆฌ๋์ด ์๊ณ , ํ๋ก๊ทธ๋จ ์คํ ์ ๋ก๋๊ฐ ๊ฐ ์น์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ณ ์์ฑ์ ์ค์ ํ ๋ ํ์ํ ์ ๋ณด๋ค์ด ๋ด๊ฒจ์๋ค.
- ํ๋ก๊ทธ๋จ๋ง๋ค ์๋ ์น์ ๋ ์๊ณ ์๋ ์น์ ๋ ์๋๋ฐ .text ์น์ ์ ๋ชจ๋ ํฌํจํ๊ณ ์๋ค.
IAT์ EAT
- IAT(Import Address Table): ํ๋ก๊ทธ๋จ์ด ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด๋ค ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง๋ฅผ ๊ธฐ์ ํ ํ ์ด๋ธ
- DLL(Dynamic Linked Library): ๋์ ์ฐ๊ฒฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ค๋ง
- ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
- 16๋นํธ DOS์์๋ ์คํํ์ผ์ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์์์.
- 32๋นํธ ์๋์ฐ ํ๊ฒฝ์ ์ ๋๋ก ์ง์ํ๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋งค์ฐ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์(process, memory, window, message)๊ฐ ์ฌ์ฉ๋จ.
- ์ด๊ฒ์ด ๋ฉํฐํ์คํน์ ์ง์ํ๋ Windoes OS์์๋ ์ฌ๊ฐํ ๋ฉ๋ชจ๋ฆฌ/๋์คํฌ ๋ญ๋น๊ฐ ๋จ.
- ๊ทธ๋์ ํ๋ฒ ๋ก๋ฉ๋ DLL์ ์ฝ๋, ๋ฆฌ์์ค๋ฅผ Memory mapping ๊ธฐ์ ๋ก ์ฌ๋ฌ ํ๋ก์ธ์ค์์ ๊ณต์ ํด์ ์ฌ์ฉํ๋ DLL ๊ฐ๋ ๋ฑ์ฅ
→ ํ๋ก๊ทธ๋จ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจ์ํค์ง ์๊ณ , ๋ณ๋์ ํ์ผ(DLL)๋ก ๊ตฌ์ฑํด ํ์ํ ๋ ์ฐ๋ DLL ๊ฐ๋ ์ด ๋ฑ์ฅํจ.
์ด๋ฌ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๋ฐ์ดํธ๋์ด๋ ํด๋น DLL ํ์ผ๋ง ๊ต์ฒดํ๋ฉด ๋๋ฏ๋ก ๋งค์ฐ ํธํ๋ค.
DLL ๋ก๋ฉ ๋ฐฉ์
- Explicit Linking(๋ช ์์ ๋งํน): ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋๋ ์๊ฐ ๋ก๋ฉ๋๊ณ ์ฌ์ฉ์ด ๋๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ ๋ฐฉ๋ฒ
- Implicit Linking(๋ฌต์์ ๋งํน): ํ๋ก๊ทธ๋จ ์์ ์ ๋ก๋ฉ๋์ด ํ๋ก๊ทธ๋จ ์ข ๋ฃํ ๋ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋จ
→ IAT๋ Implicit Linking์ ๋ํ ๋ฉ์ปค๋์ฆ์ ์ ์ฅํ ํํ
Explicit Linking์ด ์ธ ๋๋ง ์ฐ๊ฒฐํ๋๊น ๋ณด์์ ์ผ๋ก ํจ์ฌ ์์ ํ๊ธฐ ํ์ง๋ง, ์ค๋นํด์ผ ํ ๊ฒ์ด๋ ์๊ฑด์ด ๋ง์์ ๋์ด๋๊ฐ ๋๋ค.
- CreateFileW๋ฅผ ํธ์ถํจ
- 01001104์ ๊ฐ์ ๊ฐ์ ธ์์ ํธ์ถํจ
- .text ์น์ ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์์นํ 01001104 ์ฃผ์์๋ 7C8107F0์ด ์ ์ฅ๋์ด ์์
- 7C8107F0 ์ฃผ์์๋ notepad.exe์ ํ๋ก์ธ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉ๋ kernel32.dll์ CreateFileW ํจ์๊ฐ ๋ค์ด์์
Call 7C8107F0์ด๋ผ๊ณ ์ํ๊ณ ์ด๋ฐ ๊ท์ฐฎ์ ํํ๋ฅผ ์ทจํ๋ ์ด์ :
์ฌ๋ฐฐ์น ๋ฌธ์ ๋ ์๊ณ ํ๋ก๊ทธ๋จ ์คํ ํ๊ฒฝ์ ๋ฐ๋ผ kernel32.dll์ ๋ฒ์ ์ด ๋ฌ๋ผ์ง๊ณ , CreateFileW์ ์ฃผ์๋ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์ค์ ์ฃผ์๊ฐ ์ ์ฅ๋ ์์น(01001104)๋ฅผ ์ค๋นํ๊ณ , ๋ช ๋ น์ด์ ๋ณ์๋ก ์ด ์ฃผ์๋ฅผ ๋ฃ์ด๋ .
๊ทธ๋ฆฌ๊ณ ํ์ผ์ด ์คํ๋๋ ์๊ฐ, PE ๋ก๋๊ฐ 01001104 ์์น์ CreateFileW์ ์์น๋ฅผ ์ ๋ ฅํด ์ฃผ๋ ๊ฒ.
cf) dll์ ์์น๊ฐ ๋ฌ๋ผ์ง๊ณ , exe๋ imagebase๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ํํ ๋ก๋ฉ๋๋ค.
IMAGE_IMPORT_DESCRIPTOR
- IMPORT_DATA_DESCRIPTOR ์๋ฃ๊ตฌ์กฐ์๋ ์คํํ์ผ์ด ์ฐธ์กฐํ๋ DLL(Dynamic Link Library), API์ ๊ด๋ จ๋ ์ ๋ณด๋ค์ด ๋ช ์๋์ด ์์.
- Import๋ library์๊ฒ ์๋น์ค(ํจ์)๋ฅผ ์ ๊ณต๋ฐ๋ ์ผ์ด๊ณ , Export๋ library ์ ์ฅ์์ ๋ค๋ฅธ PE์๊ฒ ์๋น์ค(ํจ์)๋ฅผ ์ ๊ณตํ๋ ์ผ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ง๋ค ์ด ๊ตฌ์กฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ณ , ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ import ํ๋ ํ๋ก๊ทธ๋จ์ import ํ ์ด๋ธ์ ์ด ๊ตฌ์กฐ์ฒด๊ฐ ์ํจ.
- ๋ณดํต ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ import ํ๋ฏ๋ก, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์๋งํผ ์ด ๊ตฌ์กฐ์ฒด๊ฐ ๋ฐฐ์ด์ ๋ค์ด์๊ณ , ์ด ๋ฐฐ์ด์ ๋ง์ง๋ง์ NULL ๊ตฌ์กฐ์ฒด๋ก ๋๋จ.
- ๋ฐ๋ผ์ import ํ ์ด๋ธ์ ์ ์ฒด ์ํธ๋ฆฌ ๊ฐ์๋ import ํ DLL+1
์ํฌํธ ํจ์ ์ฃผ์๋ฅผ IAT์ ์ ๋ ฅ
<PE๋ก๋๊ฐ ์ํฌํธ ํจ์ ์ฃผ์๋ฅผ IAT์ ์ ๋ ฅํ๋ ๊ธฐ๋ณธ์ ์ธ ์์>
- IID์ Name ๋ฉค๋ฒ๋ฅผ ์ฝ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฆ ๋ฌธ์์ด(kernel32.dll)์ ์ป์
- ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๋ฉํจ → LoadLibrary("kernel32.dll")
- IID์ OriginalFirstThunk ๋ฉค๋ฒ๋ฅผ ์ฝ์ด์ INT ์ฃผ์๋ฅผ ์ป์
- INT์์ ๋ฐฐ์ด์ ๊ฐ์ ์ฝ์ด์์ ํด๋น IMAGE_IMPORT_BY_NAME ์ฃผ์(RVA)๋ฅผ ์ป์
- IMAGE_IMPORT_BY_NAME์ Hint(Original)๋ Name ํญ๋ชฉ์ ์ด์ฉํด์ ํด๋น ํจ์์ ์์ ์ฃผ์๋ฅผ ์ป์ → GetProcAddress("GetCurrentThreadld")
- IID์ FirstThunk(IAT) ๋ฉค๋ฒ๋ฅผ ์ฝ์ด์ IAT ์ฃผ์๋ฅผ ์ป์
- ํด๋น IAT ๋ฐฐ์ด ๊ฐ์ ์์์ ๊ตฌํ ํจ์ ์ฃผ์๋ฅผ ์ ๋ ฅํจ
- INT๊ฐ ๋๋ ๋๊น์ง (NULL์ ๋ง๋ ๋๊น์ง ์ ๊ณผ์ ์ ๋ฐ๋ณตํจ)
์๋ INT์ IAT์ ๋ด์ฉ๋ฌผ์ ์์ ํ ๋๊ฐ์.
PE๋ก๋๊ฐ IID์ OriginalFirstThunk๋ฅผ ํ๊ณ INT ์ฃผ์๋ฅผ ์์๋ด๊ณ , INT์์ IMAGE_IMPORT_BY_NAME์ ์ฃผ์๋ฅผ ์์์ค๊ณ , GetProcAddress(“GetCurrentThreadId”) ํจ์๋ฅผ ์ด์ฉํด์ ํจ์์ ์ค์ ์ฃผ์(๋ก๋ฉ๋ ์ฃผ์)๋ฅผ ์์์ด.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ IAT์ ์ ๋ ฅํจ. ๊ทธ๋์ INT๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฉค๋ฒ๋ originalfirstthunk์ธ๊ฑฐ๊ณ , IAT๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฉค๋ฒ๋ ๊ทธ๋ฅ firstthunk ๋ฉค๋ฒ์ธ ๊ฒ.
- lMAGE_OPTIONAL_HEADER32.DataDirectory[1].Virtual Address๊ฐ์ด ์ค์ lMAGE_IMPORT _DESCRIPTOR์ ์์์ฃผ์
- IMAGE_IMPORT_DESCRIPTOR ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด์ ๋ค๋ฅธ ๋ง๋ก IMPORT directory table์ด๋ผ๊ณ ๋ ํจ.
- ์ด ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด์ PEํค๋๊ฐ ์๋๋ผ ๋ฐ๋์ ์์นํจ. ์ง๋๋ฒ์ ๋ฐฐ์ด optional header์ datadirectory ์ค import table์ ๊ฐ์ด ์ฌ๊ธฐ์ IMAGE_IMPORT_DESCRIPTOR๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฒ!
https://jamielim.tistory.com/54
[Reversing] IAT์ EAT ๋ก๋ฉ ๊ณผ์
IAT ๋ก๋ฉ ๊ณผ์ DLL์ด๋? Dynamic Link Library, ๋์ ๋งํฌ๋ก ์คํํ์ผ์์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฅ์ ์ฌ์ฉ์์๋ง ์ฐธ์กฐํด ๊ธฐ๋ฅ์ ํธ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค. ์ฌ๋ฌ ํ๋ก์ธ์ค์์ ๊ณต์ ํ๋ฉฐ ์ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก
jamielim.tistory.com
'EVI$ION > ์ธ๊ณต์ง๋ฅ ์ ์ฑ์ฝ๋ ๋ถ๋ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฆฌ๋ฒ์ฑ ์ด ์ ๋๋ ์์์ผ์ง] #3. Windows ๋ฆฌ๋ฒ์ฑ ๊ธฐ๋ฅ ๋ถ์(1) (1) | 2024.11.21 |
---|---|
[STUDY] #WEEK3 - QUIZ (0) | 2024.10.04 |
[STUDY] #WEEK2 - QUIZ (0) | 2024.09.24 |
[SESSION] 2. PEํ์ผ (0) | 2024.09.24 |
[SESSION] 1. ๋ฆฌ๋ฒ์ฑ ๊ธฐ์ด (0) | 2024.09.22 |