와븨 2024. 3. 29. 18:25

PE (Portable Excutable) 파일

  • Win32 기본파일 형식
  • exe, scr, sys, dll, ocx 등
  • Process : EXE + DLL
  • 실행과정
    • PE 파일 실행
    • PE 헤더 정보를 메모리에 매핑
      • 실제 프로세스를 위한 메모리 할당
      • 섹션 정보를 메모리에 복사
      • Import 정보 처리
      • 기준 재배치 처리
    • 실제 프로그램 코드로 분기

https://learn.microsoft.com/ko-kr/windows/win32/debug/pe-format

 

PE 형식 - Win32 apps

이 사양은 Windows 운영 체제 제품군에 있는 실행 파일(이미지) 파일 및 개체 파일의 구조를 설명합니다. 이러한 파일은 각각 PE(이식 가능한 실행 파일) 및 COFF(공용 개체 파일 형식) 파일이라고 합

learn.microsoft.com

 

 

Notepad.exe(win7) 분석

실행 파일을 PEview에서 열면 위와 같다.

 

 

VA, RVA

  • VA(Virtual Address) : 가상 메모리 주소
  • RVA(Relative Virtual Address)
    • 가상 메모리 상대 주소
    • PE 파일(DLL)이 메모리 상의 어떤 위치에 올라갈지 알 수 없음
    • 기준점을 놓고 그 곳으로부터 위치를 계산함
      • 기준점이 바뀌더라도 정보 접근이 가능하도록 함
  • VA = ImageBase + RVA

 

IMAGE_DOS_HEADER

IMAGE_DOS_HEADER

이는 winnt.h를 보면 쉽게 분석할 수 있다.

 

e_magic

  • 4D 5A(MZ) : PE 파일 구조
  • DO CF 11 E0(OLE), 50 4B(ZIP), 25 50 44 46(PDF), 89 50 4E 47(PNG)

e_lfanew

  • 000000E8 : IMAGE_NT_HEADER 시작 주소

notepad.exe는 4D 5A로 PE 파일 구조이며, IMAGE_NT_HEADER  시작 주소가 000000E8임을 알 수 있다.

 

DOS Stub Code

프로그램이 DOS 모드에서는 실행할 수 없는 파일이므로, 윈도우에서 실행해야 함을 알 수 있다.

 

 

NT_HEADER

File_Header

  • Machine(CPU) : 0x8664 - AMD64 CPU 호환(0X014c intel CPU)
  • 섹션의 개수 : 0x0006
  • Time Data : 0x4A5BC9B3 → 1247529395
    • 2009년 7월 13일 23시 56분 35초
  • Pointer To Symble Table, Number of Symbols
  • Size Of Optional Header : 0xE0(32bit), 0xF0(64bit), 0x00(obj)
  • Characteristics : 파일형식 정보, OR 연산

이 중, Chracteristics를 winnt.h 보면 다음과 같다.

Characteristics

 

 

Optinal_Header

이를 정리하면 밑의 표와 같다.

 


(notepad.exe)
이름 의미
0x010b Magic 0x10B(32구조체), Ox20B(64구조체)
0xa800 Size Of Code 코드영역(.text)의 크기
0x3689 Address Of Entry Point 프로그램 시작되는 코드의 주소 RVA값으로 저장
OllyDbg에서 처음 실행되는 주소(악성코드 시작 지점으로 지정할 수 있음)
0x1000  Base Of Code 코드영역이 시작되는 상대 주소(RVA)
0x1000000 Image Base PE파일이 메모리에 로드되는 시작 주소
일반적으로 EXE(0x400000), DLL(0x10000000)번지로 설정(변경가능), RVA
기준
0x1000 Section Alignment 메모리에서 섹션의 최소 단위, 시작주소는 이 값의 배수
0x200  File Alignment 파일에서 섹션의 최소 단위, 시작주소는 이 값의 배수
0x30000 Size Of Image PE 파일이 메모리에 로딩될 때 전체 크기
0x400 Size Of Header 모든 헤더의 크기
0x2  Sub System 1(System Driver), 2(GUI), 3(CUI)
0x10  Number of RvaAndSizes Data Directory의 구조체 멤버 개수
  Data Directory PE파일에서 중요한 역할을 하는 개체들의 위치 및 크기

 

 

Section_Header

Section Header의 종류

종류 용도
.text 실행 코드
.data 초기화된 전역 변수, static 변수
.rdata Const 변수, 문자열 상수
.bss 전역 변수, static 변수, 문자열, 기타 상수
.edata EAT와 관련된 정보
.idata IAT와 관련된 정보
.rsrc 리소스 정보

 

 

주요 내용


(notepad.exe)
멤버 의미
0x747865742E Name 섹션 이름 .text
0xA770  Virtual Size 메모리 섹션 크기 정보
0x1000  Virtual Address  메모리 섹션의 시작 주소.
- Image Base가 0x1이므로 실제 주소는 0x1001이 됨, Optional Header의 Base of  Code 값과 동일
0xA800  Size Of Raw Data  파일에서의 섹션 크기
0x600 Pointer To Raw Data  파일에서의 섹션의 시작 위치
0x60000020 Characteristics  읽고 쓰기가 가능한 코드 섹션