본문으로 바로가기

PE 헤더 구조체

category Study/reversing 2017. 10. 12. 20:00

PE Header 구조체에 대해 알아보자



먼저 DOS EXE header를 확장시킨 IMAGE_DOS_HEADER 구조체부터 차례대로 보자


구조체의 크기는 40h이며, 강조된 부분을 알아보자


e_magic : 파일 헤더 시그니처. 포멧 정보를 가지고 있다.

e_lfanew : NT header의 오프셋 값을 가지고 있다.



맨 첫 번째로 색칠된 부분이 e_magic 이고, 두 번째로 색칠된 부분이 e_lfanew이다.






이번에는 MS-DOS Stub Program에 대해 알아보자



위 부분은 DOS 모드에서 실행시에만 구동되는 부분이다.


이를 통해 DOS모드와 Windows에서 동시에 실행 가능하게 만들 수 있다.







IMAGE_NT_HEADERS 구조체를 살펴보자



크기는 F8h으로 상당히 크며, 3개의 멤버로 로 세분화 되어있다


Signature


50450000h(PE00)의 값을 가지며, 변경할 수 없다.


IMAGE_FILE_HEADER




Machine


머신넘버는 cpu별로 고유한 값이다.

32bit 인텔 호환 칩은 14ch의 값을 가지며,

64bit 인텔 호환 칩은 200h의 값을 가진다.


Number Of Sections


실행파일이 가지고 있는 섹션의 개수


Time Data Stamp


실행파일이 컴파일된 시간


Pointer To Symbol Table


심볼 파일의 오프셋을 값으로 가지고 있으며, 컴파일러에 의해 생성된 obj 파일에서 사용된다


Number Of Symbols


심볼의 개수


Size Of Optional Header


Optional Header의 크기를 값으로 가진다.

(실행파일에서만 필요)


Characteristics


파일의 속성값을 가짐

실행 가능 파일은 2h의 값을 가지며

DLL파일은 2000h의 값을 가진다



IMAGE_OPTIONAL_HEADER


위의 구조체의 멤버중 중요한것만 알아보자


Magic


32비트에서는 10Bh

64비트에서는 20Bh

의 값을 가진다


AddressOfEntryPoint


Entry Point의 RVA값을 가지고 있다


ImageBase


PE파일이 로딩되는 시작주소를 나타낸다

일반적으로 EXE는 400000h

DLL은 1000000h를 가진다.


SectionAlignment, FileAlignment


각각 메모리과 파일에서의 섹션 최소단위를 나타낸다.

(같을수도 있고 다를수도 있다.)


SizeOfImage


PE 파일이 메모리에 로딩되었을 때 메모리에서 PE이미지가 차지하는 크기


SizeOfHeader


PE헤더의 전체크기(FileAlignment의 배수)


Subsystem


1 = .sys

2 = GUI

3 = CUI


NumberOfRvaAndSizes


DataDirectory 배열의 개수


DataDirectory


IMAGE_DATA_DIRECTORY 구조체의 배열







마지막으로 IMAGE_SECTION_HEADER 에 대해 알아보자


우선 왜 아래와 같이 여러개의 영역으로 나누어졌는지에 대해 생각해보자



하나의 영역에 모두 넣어 만드는 것이 불가능 한것은 아니지만


프로그램의 안정성을 위해 섹션을 나눈것이다.


나누지 않는다면 어떤 부분에서 안정성을 침해하게 되는지 생각해보면


오버플로우를 쉽게 떠올릴 수 있다.


이를 방지하기 위해 각각의 영역에 권한을 다르게 주어져 있다고 한다.


text 읽기,실행

data 읽기,쓰기

*data 읽기

rsrc 읽기

reloc 읽기


이러한 섹션의 속성을 기술한 곳이 바로 Section_Header이다!!!!




그런거였구나....




이제 섹션헤더의 구성을 살펴보자



Virtual Size


메모리에서 섹션이 차지하는 크기


RVA


메모리에서 섹션의 시작주소


SizeOfRawData


파일에서 섹션이 차지하는 크기


PointerToRawData


파일에서 섹션의 시작위치



'Study > reversing' 카테고리의 다른 글

라이브러리  (0) 2017.10.16
IAT & EAT  (0) 2017.10.12
PE란?  (0) 2017.10.11
prob3.c 핸드레이  (0) 2017.09.21
prob2.c 핸드레이  (0) 2017.09.20