@ 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)
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)로 구성되어 있다.
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 |