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