@ 02_PE 파일 분석(PE 헤더)

 - 분석 환경 : Windows7(32bit)
 - 분석 파일 : calc.exe
 - 분석 도구 : PEview, HxD, CFF Explorer, OllyDbg


1. PE 구조

 - PE 헤더 : IMAGE_DOS_HEADER, MS-DOS Stub Program, IMAGE_NT_HEADERS, IMAGE_SECTION_HEADER
 - PE 바디 : 실제 데이터 정보가 있는 영역(text, data, rsrc, reloc)

PE 헤더

 

PE 바디



2. IMAGE_DOS_HEADER

 - 64Byte(0x40)로 구성되어 있으며, 19개 필드로 구성되어 있다.
 - PE 파일 시그니처와 IMAGE_NT_HEADERS의 위치 정보를 갖고 있다.
 - e_magic : '5A4D' -> MZ -> PE 파일 시그니처를 의미한다.
 - e_ifanew : IMAGE_NT_HEADERS의 위치를 의미한다. (0x000000D8)
                0x000000D8에 5045(PE 파일 시그니처)를 확인할 수 있다.




3. MS-DOS Stub Program

 - 152Byte(0x98)로 구성되어 있다.
 - MS-DOS, Windows 3.1에서 실행하면 'This program cannot be run in DOS mode'를 출력하는 문자열이 있는 영역이다

 - 쓸모없는 영역이다...




4. IMAGE_NT_HEADERS

 - 248byte(0xF8)로 구성되어 있다.

IMAGE_NT_HEADERS


 1) Signature

 - 4Byte(0x04)
 - PE 파일 시그니처
 - 50 45 00 00



 2) IMAGE_FILE_HEADER

 - 20Byte(0x14)
 - CPU 정보, 섹션 수, 파일 생성/컴파일 시간, IMAGE_OPTIONAL_HEADER 크기, 파일 특성 정보들이 포함되어 있다.

 Machine : CPU 별 고유 값(Inter 386/x86 : 0x014C, Inter 64 : 0x0200, AMD64 : 0x8664)
 Number of Sections : 실행 파일이 갖고 있는 총 섹션 개수
 Time Date Stamp : 파일 생성/컴파일된 시간
 Size of Optional Header : IMAGE_OPTIONAL_HEADER의 크기(0x00E0 -> 224Byte)
 Characteristics : PE 파일에 대한 특정 정보를 나타내는 플래그


0x0002          IMAGE_FILE_EXECUTABLE_IMAGE PE 파일을 의미한다.
0x0100          IMAGE_FILE_32BIT_MACHINE 32bit PE 파일을 의미한다.
0x2000          IMAGE_FILE_DLL DLL 파일을 의미한다.



 3) IMAGE_OPTIONAL_HEADER

 - 224Byte(0xE0)
 - 표준 필드, NT 추가 필드, DataDirectory 배열 정보들이 포함되어 있다.

 - 표준 필드 : 실행 파일 로드 및 실행에 사용되는 정보이다.
 - 표준 필드 영역 : Magic ~ Base of Code

 - NT 추가 필드 : 윈도우 링커/로더가 요구하는 정보이다.
 - NT 추가 필드 영역 : Base of Data ~ Loader Flags 

 - DataDirectory 배열 영역 : Number of Data Directories

 Magic : IMAGE_OPTIONAL_HEADER 시그니처

0x010B : 32bit PE 파일
0x020B : 64bit PE 파일

 Size of Code : text 섹션의 크기(0x52E00)
 Address of Entry Point : 파일이 메모리에서 시작되는 주소(0x12D6C)

PE 로더가 실행을 개시할때 사용하는 RVA 주소이며, text 섹션 내의 특정 번지 주소가 된다.
이 필드의 값은 프로그램이 처음으로 실행될 코드를 담고 있는 EP(entry Point) RVA 주소이다.


[참고] RVA, VA

1. RVA

 - PE 파일이 가상 주소 공간 내에서 로드된 후 이미지의 시작 주소에 대한 상대 주소이다.
 - PE 시작 주소에서 어느정도 떨어져 있는지를 계산할 수 있다.

2. VA

 - 가상 메모리 주소 공간에서 프로세스의 절대 주소이다.

3. VA 계산식

 - VA = ImageBase 주소 + RVA 주소
 - VA = 0x01000000 + 0x00012D6C = 0x01012D6C


 Base of Code : test 섹션이 메모리 올라갈때 시작되는 주소이다.(RVA)
 Base of Data : 첫번째 데이터 섹션이 시작되는 RVA 주소이다.
 Image Base : PE 파일이 로드되는 가상 메모리의 주소이다.

DLL/EXE 파일  -> User 메모리 영역인 '0x00000000 ~ 0x7FFFFFFF'에 로드
SYS 파일          -> 커널 메모리 영역인 '0x80000000 ~ 0xFFFFFFFF'에 로드

DLL 파일/윈도우 제공 EXE 파일 : 0x01000000
그 외 EXE 파일 : 0x00400000


 Section Alignment : 메모리 상에서 섹션의 최소 단위(File Alignment 보다 커야한다.)
  0x1000 -> 4096byte

Ex1) text 섹션의 데이터가 512byte인 경우

 - 섹션 얼라이먼트에 의해서 4096Byte 할당


Ex2) text 섹션의 데이터가 6000Byte인 경우

 - 섹션 얼라이먼트에 의해서 8192Byte 할당


 File Alignment : 파일의 최소 단위(0x200 -> 512byte)

 Size Of Image : PE 파일이 메모리에 로드되었을 때, 가상 메모리 상에 PE 이미지 크기
         0xC0000 -> 786432Byte
         Section Alignment 보다 커야한다.

 Size of Headers : PE 헤더 전체 크기
                       0x400 -> 1024Byte
          File Alignment 보다 커야한다.

 
 Subsystem : 프로그램 파일 유형

1 : SYS 파일과 같은 디바이스 파일
2 : Windows GUI 환경 프로그램
3 : CMD 기반 콘솔 프로그램


 DLL Characteristics : 시스템 보호 기능(ASLR, DEP, SHE...) 사용 유무 플래그
 
ASLR 기능 : 0x0040 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE


 Number of Data Directories : IMAGE_DATA_DIRECTORY 구조체 배열

 각각의 배열 항목(16개)마다 RVA(4byte), Size(4byte)로 구성되어 있다.
 
EXPORT Table : Export 섹션 시작 주소 및 크기 정보
IMPORT Table : Import 섹션 시작 주소 및 크기 정보
RESOURCE Table : Resource 섹션 시작 주소 및 크기 정보
BASE RELOCATION Table : Relocation 섹션 시작 주소 및 크기 정보

 

 

[참고]

 

섹션은 파일마다 개수가 다르다.

 

IMPORT Directory Table - 프로그램이 사용하는 dll 파일

'레나 튜토리얼' 카테고리의 다른 글

Ollydbg 패치  (0) 2022.07.30
Ollydbg 설명  (0) 2022.07.30
32_패킹&언패킹  (0) 2022.07.28
MOV, LEA, ADD, SUB, IMUL, IDIV  (0) 2022.07.28
01_리버싱 선수 지식  (0) 2022.07.26