λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”’μ •λ³΄λ³΄μ•ˆ/μ‹œμŠ€ν…œ λ³΄μ•ˆ

μ‹œμŠ€ν…œ λ³΄μ•ˆ - EXE 파일 PE(Portable Executable) ꡬ쑰 λΆ„μ„ν•˜κΈ°

by Janger 2023. 10. 7.
728x90
λ°˜μ‘ν˜•
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)

https://www.researchgate.net/figure/Portable-executable-file-format_fig6_338355873

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 ν•¨μˆ˜λ“€μ˜ 데이터가 ν¬ν•¨λ˜μ–΄ μžˆλ‹€. 

 

 

 

μ°Έκ³ : 

https://rninche01.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%8B%A4%ED%96%89%ED%8C%8C%EC%9D%BC-%EA%B5%AC%EC%A1%B0PE%ED%8C%8C%EC%9D%BC

 

μœˆλ„μš° μ‹€ν–‰νŒŒμΌ ꡬ쑰(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

 

728x90
λ°˜μ‘ν˜•