notepad.exe(메모장 프로그램) PE 헤더 분석하기
PE 헤더 분석 프로그램 <첫번째 파일>
http://wjradburn.com/software/
WJR Software - PEview (PE/COFF file viewer),...
Utilities (for use with Windows® XP operating system or later) PEview provides a quick and easy way to view the structure and content of 32-bit Portable Executable (PE) and Component Object File Format (COFF) files. This PE/COFF file viewer displays heade
wjradburn.com
*HxD만으로 분석하다가 찾는 것이 조금 힘들어...PE헤더를 분석해주는 'PE View'와 HxD를 함께 사용해서 분석해보았다!

Notepad(메모장) 프로그램을 HxD에 넣어보았다.

위 사진은 Notepad.exe의 시작 부분이다.
1. DOS Header
Dos Header 구조체는 IMAGE_DOS_HEADER 이다.
*WORD는 unsigned short를 typedef로 편하게 줄어서 부른 것이고, WORD는 2byte의 크기를 가질 수 있다.
Intel 계열의 CPU는 자료를 역순으로 저장하는 리틀엔디언 방식을 사용한다. 리틀엔디언 방식은 낮은 주소부터 시작해서 하위 바이트를 기록하는 것을 말한다.

파일 시작 2바이트는 4D 5A이며, e_lfanew값은 00 00 00 E0이다.
2. DOS Stub
Dos Header 밑에는 DOS Stub이 존재한는데 DOS Stub의 존재 여부는 옵션이고 크기가 일정하지 않다. 따라서 DOS Stub이 없어도 파일 실행에 문제는 없다. 코드와 데이터의 혼합으로 이루어져 있는데 .notepad에 DOS Stub이 나타나 있다.

40~4D 영역은 16bit 어셈블리 명령어다. 32bit Windows OS에서는 PE 파일로 인식하기 때문에 아예 16bit 어셈블리 명령을 무시하게 되어서 이쪽 명령어가 실행되지 않는다. notepad 파일을 DOS 환경에서 실행하거나 DOS용 디버거를 이용해서 실행하면 위 코드를 실행시킬 수 있다.
3. NT Header
1) NT Header 구조체는 IMAGE_NT_HEADERS이다.


IMAGE_NT_HEADERS 구조체는 3개의 멤버로 되어있고, 크기는 F8이다.

첫번째 Signature: 4바이트 공간, 50450000h(PE 00)값을 가진다.
그리고 FileHeader와 OptionalHeader 구조체 멤버가 있다.
2) NT Header 안에 멤버로 있는 IMAGE_FILE_HEADER



두번째 File_Header
1. Machine(CPU): 0x8664-AMD64 CPU/0x014c-Intel CPU 호환
2. 섹션의 개수: 0x0006
3. Time Data: 63F8F9C2
3) NT Header_OptionalHeader
PE 헤더 구조체 중에서 가장 크기가 큰 IMAGE_OPTIONAL_HEADER32이다.

IMAGE_OPTIONAL_HEADER32는 중요한 멤버들이 9가지 정도가 있다. 이 값들은 파일 실행에 아주 필수적인 요소들이기 때문에 잘못될 경우 파일이 정상적으로 실행이 되지 않는다.
중요한 멤버들로는 Magic, AddressOfEntryPoint, ImageBase, SectionAlignment, FileAlignment, SizeOfImage, SizeOfHeader, Subsystem, NumberOfRvaAndSizes, DataDirectory이 있다.
4. Section Header
각 세션의 속성을 정의한 것이 섹션 헤더이다. PE 파일은 code, data, resource 등을 각각의 섹션으로 나눠서 저장한다.
섹션 헤더는 각 섹션 별 IMAGE_SECTION_HEADER 구조체 배열로 구성되어 있다.


NAME: 섹션이름 .text
Vitual Size: 메모리 섹션 크기 정보
Vitual Address: 메모리 섹션의 시작 주소, RVA / Image Base가 0x1이므로 실제 주소는 0x1001
Optional Header의 Base of Code 값과 동일
Size Of Raw Data: 파일에서의 섹션 크기(File Alignment의 배수)
Pointer To Raw Data: 파일에서의 섹션의 시작 위치
Characteristics: 읽고 쓰기가 가능한 코드 섹션 정보 표시, OR 연산으로 표시
'Reversing' 카테고리의 다른 글
[Reversing] Easy ELF_WirteUp (0) | 2023.04.29 |
---|---|
[Reversing] Easy Keygen_WirteUp (0) | 2023.04.29 |
PE 구조 (0) | 2023.04.04 |
0201 메모리 구조, 스택, 스택 프레임 (0) | 2023.03.28 |
[Reversing] Easy Crack_WirteUp (0) | 2023.03.22 |