-
PE 파일 구조 (2) - PE 헤더(DOS Header, DOS Stub)IT/리버싱 핵심원리 2017. 11. 29. 15:51
공부를 시작하기에 앞서 본 글은 '리버싱핵심원리', 이승원 저자, 인사이트 를 참고했음을 밝힙니다.
또한 공부하는 입장에서 정리를 목적으로 작성하였기때문에 틀린 정보가 있을수도 있다는 것을 알려드립니다.
관련 글
PE 파일 구조 (1) - PE 기본구조, VA & RVA
PE 파일 구조 (2) - PE 헤더(DOS Header, DOS Stub)
PE 파일 구조 (3) - PE 헤더(NT Header)
1. PE 헤더
- PE 헤더는 많은 구조체로 이루어져 있다.
DOS Header
IMAGE_DOS_HEADER 구조체
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic;
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
LONG e_lfanew; // offset to NT header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
출처 : Microsoft Platform SDK - winnt.h
IMAGE_DOS_HEADER 구조체의 크기는 40이다.
이 구조체에서 중요한 멤버는 e_magic과 e_lfanew 이다.
모든 PE 파일은 시작 부분에 DOS signature인 "MZ"가 존재하고, e_lfanew 값이 가리키는 위치에 NT Header 구조체가 존재해야 한다.
notepad.exe를 예제로 DOS Header를 살펴보겠다.
PE 스펙과 비교해 보면 첫 2바이트 4D5A이며, e_lfanew 값은 000000E0 이다.
왜 e_lfanew 값이 E0000000이 아니라 000000E0 인것일까?
Intel 계열의 CPU는 자료를 역순으로 저장하며, 이를 리틀 엔디언(Little Endian) 표기법이라고 합니다.
DOS Stub
DOS Stub은 IMAGE_DOS_HEADER 다음부터 NT Header 구조체 전까지입니다.
DOS Stub의 존재 여부는 옵션이며 크기도 일정하지 않습니다.
아래 그림은 DOS Stub 부분입니다.
Notepad.exe 파일을 DOS 환경에서 실행하거나, DOS용 디버거를 이용해서 실행하면 DOS Stub에 있는 코드를 실행시킬 수 있습니다.
하지만 DOS Stub은 중요한 부분은 아니므로 내용을 지우더라도 프로그램을 실행하는데는 지장이 없습니다.
다음 포스팅에서는 NT Header 구조체에 대해서 알아보도록하겠습니다.
도움이 되었다면 아래
공감 버튼 한번씩 눌러주세요.^^
'IT > 리버싱 핵심원리' 카테고리의 다른 글
PE 파일 구조 (3) - PE 헤더(NT Header) (0) 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 댓글