-
PE 파일 구조 (3) - PE 헤더(NT Header)IT/리버싱 핵심원리 2017. 11. 29. 16:28
공부를 시작하기에 앞서 본 글은 '리버싱핵심원리', 이승원 저자, 인사이트 를 참고했음을 밝힙니다.
또한 공부하는 입장에서 정리를 목적으로 작성하였기때문에 틀린 정보가 있을수도 있다는 것을 알려드립니다.
관련 글
PE 파일 구조 (1) - PE 기본구조, VA & RVA
PE 파일 구조 (2) - PE 헤더(DOS Header, DOS Stub)
PE 파일 구조 (3) - PE 헤더(NT Header)
계속해서 PE 헤더에 대해서 알아보도록 하겠습니다.
NT Header
NT Header 구조체 IMAGE_NT_HEADERS입니다.
IMAGE_NT_HEADERS 구조체
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
출처 : Microsoft Platform SDK - winnt.h
IMAGE_NT_HEADERS 구조체는 3개의 멤버로 이루어져 있다.
메모장(notepad.exe) 파일의 구조를 살펴보겠다.
첫번째 멤버인 Signature는 50450000 으로 PE 값을 가집니다.
그 다음 멤버인 FileHeader와 OptionalHeader 구조체는 조금더 자세히 알아보도록 하겠습니다.
NT Header - File Header
IMAGE_FILE_HEADER 구조체 입니다.
IMAGE_FILE_HEADER 구조체
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_NT_HEADER, *PIMAGE_NT_HEADER;
출처 : Microsoft Platform SDK - winnt.h
IMAGE_FILE_HEADER 구조체에서 4가지 멤버가 가장 중요하다.
1. Machine
Machine 넘버는 CPU별로 고유한 값이다. 32비트 Intel x86 호환 칩은 14C의 값을 가진다. winnt.h 파일에 정의된 Machine 넘버 값들이 있다.
Machine 넘버
출처 : Microsoft Platform SDK - winnt.h
메모장(notepad.exe) 파일의 구조를 살펴보겠다.
아래 표시된 부분이 Machine의 값이다. 전에도 이야기했듯이 Little Endian 방식으로 읽기때문에 '4C01' 이 아닌 '014C' 로 읽는다. 위의 Machine 값을 참조해보면 014C는 Intel 386을 의미한다.
2. NumberOfSections
코드, 데이터, 리소스 등이 각각의 섹션에 나뉘어서 저장되는데 그 섹션의 개수를 나타내는 멤버이다. 이 값은 반드시 0보다 커야하며, 정의된 섹션 개수와 실제 색션이 다르면 실행 에러가 발생한다.
메모장(notepad.exe) 파일의 구조를 살펴보겠다.
마찬가지로 Little Endian 방식으로 읽어 0003 이 된다. 즉, 섹션의 개수는 3개이며 PEview를 통해 확인해보면 '.text', '.data', '.rsrc'의 섹션이 존재하는 것을 확인할 수 있다.
3. SizeOfOptionalHeader
IMAGE_NT_HEADERS 구조체의 마지막 멤버는 IMAGE_OPTIONAL_HEADER32 구조체이다. SIzeOfOptionalHeader 멤버는 이 IMAGE_OPTIONAL_HEADER32 구조체의 크기를 나타낸다.
메모장(notepad.exe) 파일의 구조를 살펴보겠다.
SizeOfOptionalHeader의 값은 00E0 로 IMAGE_OPTIONAL_HEADER32 구조체의 크기는 0xE0 이다.
4. Characteristics
파일의 속성을 나타내는 값이다. 속성의 값을 bit OR 형식으로 조합하여 나타낸다.
아래는 Characteristics 값들이다.
Characteristics
출처 : Microsoft Platform SDK - winnt.h
메모장(notepad.exe) 파일의 구조를 살펴보겠다.
Characteristics의 값이 010F 이다. 즉, 위의 속성의 값들을 bit OR했을 때 0x010F 가 나오면 되는 것이다. 이를 풀어보면 32BIT_MACHINE에 LOCAL_SYMS_STRIPPED, LINE_NUMS_STRIPPED, EXECUTABLE_IMAGE, RELOCS_STRIPPED 속성을 가지는 프로그램임을 알 수 있다.
다음 포스팅에서는 NT Header의 Optional Header에 대해서 알아보도록 하겠습니다.
'IT > 리버싱 핵심원리' 카테고리의 다른 글
PE 파일 구조 (2) - PE 헤더(DOS Header, DOS Stub) (2) 2017.11.29 PE 파일 구조 (1) - PE 기본구조, VA & RVA (0) 2017.11.28 함수 호출 규약(Calling Convention) (0) 2017.11.24 스택 프레임(Stack Frame) 실습 - stackframe.exe (0) 2017.11.23 스택 프레임(Stack Frame) 에 대해 알아보자 (0) 2017.11.23 댓글