PE(Portable Executable)์ด๋?
Windows ์ด์์ฒด์ ์์ ์คํ๋๋ ์ด์ง ํ์ผ ํ์์ ์๋ฏธํ๋ค. ์ด ํ์ผ ํ์์ Windows ์ด์์ฒด์ ์์ ์คํ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ, DLL, ๋๋ผ์ด๋ฒ ๋ฑ์ ํฌํจ๋๋ค. ๋ฆฌ๋ ์ค์๋ PE์ ๋น์ทํ ํ์ผ ํ์์ด ์์ผ๋ฉฐ ELF(Executable and Linkable Format)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
PE ํ์ผ ์ข ๋ฅ
1) ์คํ ๊ณ์ด : EXE, SCR
2) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณ์ด : DLL, OCX, CPL, DRV
3) ๋๋ผ์ด๋ธ ๊ณ์ด : SYS, VXD
4) ์ค๋ธ์ ํธ ํ์ผ ๊ณ์ด : OBJ
์ฌ์ฉ ๋ชฉ์
ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฌ๊ฐ ๋์ด์ผ ํ๋ค. ์ด๋ PE์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ด๋ ์ฃผ์์ ์ ์ฌ๊ฐ ๋ ์ง์ ์คํ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ ์ ๋ณด๋ค์ด ํฌํจ๋์ด ์๋ค.
PE ํ์ผ ๊ตฌ์กฐ (Header + Sections)
PE๋ ํฌ๊ฒ ํค๋์ ์น์ (ํน์ ๋ฐ๋)์ผ๋ก ๋๋๋ค.
๋ค์์ ์น์ ์ ๊ตฌ์ฑ๋ค์ด๋ค.
IMAGE_DOS_HEADER | ์๋์ฐ ์ด์์ฒด์ ์ ํ์ ํธํ์ฑ์ ์ง์ํ๊ธฐ ์ํ ๊ฒ์ผ๋ก ์ค์ PE ํค๋ ์์น(IMAGE_NT_HEADER)๋ฅผ ๊ฐ๋ฆฌํค๋ ์ญํ ์ ํ๋ค. |
MS-DOS Stub | DOS ์ด์์ฒด์ ์์ ์๋์ฐ์ฉ PE ํ์ผ์ ์คํํ์ ๋ ๋ณด์ฌ์ค ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ณ ์๋ค. |
IMAGE_NT_HEADER | 4 ๋ฐ์ดํธ ์๊ทธ๋์ฒ(PE)์ 2๊ฐ์ IMAGE_FILE_HEADER, IMAGE_OPTION_HEADER ๊ตฌ์กฐ์ฒด๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ์ค์ PE ํ์ผ ์คํ์ ํ์ํ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ค. |
.text | ์คํ ๊ฐ๋ฅํ ์ฝ๋๊ฐ ํฌํจ๋์ด ์๋ค. (๊ธฐ๊ณ์ด) |
.data | ์ด๊ธฐํ๋ ์ ์ญ ๋ฐ ์ ์ ๋ณ์๊ฐ ํฌํจ๋์ด ์๋ค. (์ฝ๊ธฐ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ์น์ ) |
.rdata | ์ฝ๊ธฐ ์ ์ฉ(Read-Only) ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์๋ค. (์์ํ ๋ณ์, ๋ฌธ์์ด ์์) |
.bss | ์ด๊ธฐํ๋์ง ์์ ์ ์ญ ๋ฐ ์ ์ ๋ณ์๊ฐ ํฌํจ๋์ด ์๋ค. |
.rsrc | ๋ฆฌ์์ค(Resource) ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์๋ค. (๋ค์ด์ผ๋ก๊ทธ, ์์ด์ฝ, ์ปค์ ๋ฑ) |
.reloc | ์ด๋ฏธ์ง ๋ก๋ฉ ์ฃผ์๋ฅผ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์๋ค. |
.edata | ๋ด๋ณด๋ด๊ธฐ(Export) ํ ์ด๋ธ ๋ฐ์ดํฐ๊ฐ ํฌํจ |
.idata | ๊ฐ์ ธ์ค๊ธฐ(Import) ํ ์ด๋ธ ๋ฐ์ดํฐ๊ฐ ํฌํจ(์ํฌํธํ DLL๊ณผ API/ํจ์์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ์น์ , IAT๊ฐ ์กด์ฌ) |
์ฌ์ฉํ ๋ถ์ ๋๊ตฌ๋ค
x64dbg, Stud_PE, PEview
ImageBase
PE ํ์ผ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ๋ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ์ฃผ์์ด๋ค. Windows NT์์ ๊ธฐ๋ณธ ๊ฐ์ 0x00400000์ด๋ค. ImageBase๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ง์ ์ด๊ณ ์์ผ๋ก ๋์ฌ ๊ฐ์ ์ฃผ์๋ค์ ๊ธฐ์ค์ ์ด ๋๋ค.
์์ผ๋ก ๋์ค๋ ์น์ ๋ค์๋ VirtualOffset์ด๋ผ๋ ์คํ์ ์ ๊ฐ๊ฒ ๋๋๋ฐ ์ด๋ ImageBase๋ก๋ถํฐ ๋จ์ด์ง ๊ฑฐ๋ฆฌ๋ฅผ ๋ปํ๋ค.
๋ง์ฝ .text์ VirtualOffset ๊ฐ์ด 00001000์ด๊ณ ์ ๋ ์ฃผ์๋ฅผ ๊ตฌํ๊ณ ์ถ๋ค๋ฉด ImageBase + .text์ VirtualOffset์ ๊ณ์ฐํ๋ฉด ๋๋ค. 00400000 + 00001000 = 00401000
VA & RVA
VA(Virtual Address) : ํ๋ก์ธ์ค ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ ์ฃผ์
RVA(Relative Virtual Address) : ๊ธฐ์ค(ImageBase)์ผ๋ก๋ถํฐ ์๋ ์ฃผ์
ImageBase + RVA = VA
AddressOfEntryPoint
์คํ ํ์ผ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋งคํ๋ ํ ์ฝ๋ ์์ ์ฃผ์๊ฐ ๋๋ค. EP์ RVA ์ฃผ์ ๊ฐ์ ๊ฐ์ง๋ค. ์ฆ ์๋ ์ฃผ์์ด๋ค.
์๋ฅผ๋ค์ด ์ด๋ค ํ๋ก๊ทธ๋จ์ด EntryPoint๊ฐ 000014E0์ผ ๊ฒฝ์ฐ ์ฌ๊ธฐ๋ค ImageBase ๊ฐ(00400000)์ ๋ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ํ๋ก๊ทธ๋จ์ EntryPoint ์ ๋ ๊ฐ์ ์ ์ ์๋ค. ( 00400000 + 000014E0 = 004014E0 )
.text Section
.text์๋ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ ๊ธฐ๊ณ์ด ์ฝ๋๊ฐ ์ ์ฅ์ด ๋๋ค. ์ ๋ณด๋ฉด pFile์ด 00000400์ธ๋ฐ ์ด๊ฑด RawOffset์ ์๋ฏธํ๊ณ ์ค์ ๋ก ์คํ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ ๋์๋ VirtualOffset(RVA)์ ์ฌ์ฉํ๋ค.
x64dbg๋ก ์ฝ๋ ๋ถ๋ถ์ ๋งจ ์๋จ์ผ๋ก ์ฌ๋ผ๊ฐ๋ฉด ์ ๋ง 00401000(.text์ RVA์ ImageBase๊ฐ ๋ํ)์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
.rdata Section
์ฝ๊ธฐ ์ ์ฉ ๋ฐ์ดํฐ๋ค์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์ด๋ค. ํ๋ก๊ทธ๋๋ฐํ ๋ ์์ฑํ "What's your name?"์ด๋ผ๋ ์คํธ๋ง๊ณผ "%s %d" ๊ฐ์ ํฌ๋งท๋ ๋ณด์ธ๋ค.
.idata Section
Import ๋ฐ์ดํฐ๋ค์ด ์ ์ฅ๋๋ ์น์ ์ด๋ค.
.idata ์น์ ์ ๋ IDT(Import Directory Table), INT(Import Name Table), IAT(Import Address Table)๋ค๋ก ๊ตฌ๋ถ๋๋ค.
IAT์๋ ํ๋ก๊ทธ๋จ์ด ๋ถ๋ฌ์ค๋ DLL ํ์ผ๊ณผ API ํจ์๋ค์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์๋ค.
์ฐธ๊ณ :
์๋์ฐ ์คํํ์ผ ๊ตฌ์กฐ(PEํ์ผ)
1. ์๋์ฐ ์คํํ์ผ(PEํ์ผ) ๊ฐ์ 1.1 PEํ์ผ์ด๋? PE(Portable Executable)ํ์ผ์ ์๋์ฐ ์คํํ์ผ์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ ์๋์ฐOS์์ ์ฌ์ฉ๋๋ ์คํํ์ผํ์์ ์๋ฏธํ๋ฉฐ UNIX์ COFF(Common Object File Format)์ ๊ธฐ๋ฐ์ผ
rninche01.tistory.com
https://rednooby.tistory.com/33
[์ ์ฑ์ฝ๋๋ถ์] PE (portable Executable) ๊ธฐ์ด ๊ฐ๋ ์ก๊ธฐ
PEํฌ๋งท ์ด๋?์๋์ฐ ์ด์์ฒด์ ์์ ์ฌ์ฉ๋๋ ์คํํ์ผ, DLL Object์ฝ๋, FON ํฐํธํ์ผ ๋ฑ์ ์ํ ํ์ผํ์์ ๋๋ค.OEํ์ผ์ ์๋์ฐ ๋ก๋๊ฐ ์คํ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ์บก์ํํ ๋ฐ์ด
rednooby.tistory.com
https://learn.microsoft.com/ko-kr/windows/win32/debug/pe-format
PE ํ์ - Win32 apps
์ด ์ฌ์์ Windows ์ด์ ์ฒด์ ์ ํ๊ตฐ์ ์๋ ์คํ ํ์ผ(์ด๋ฏธ์ง) ํ์ผ ๋ฐ ๊ฐ์ฒด ํ์ผ์ ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ด๋ฌํ ํ์ผ์ ๊ฐ๊ฐ PE(์ด์ ๊ฐ๋ฅํ ์คํ ํ์ผ) ๋ฐ COFF(๊ณต์ฉ ๊ฐ์ฒด ํ์ผ ํ์) ํ์ผ์ด๋ผ๊ณ ํฉ
learn.microsoft.com