Self-Improvement

PE 구조 (NT Header) 본문

리버싱 기초

PE 구조 (NT Header)

JoGeun 2018. 11. 11. 15:24

*NT Header

3개의 멤버로 구성 되어 있으며 제일 첫 번째는 Signature로 50450000로 되어 있으며 그리고 File Header와 Optional Header 구조체 멤버가 있습니다.

 

*NT Header - Signature

 

*NT Header - File Header

파일의 개략적인 속성을 나타내는 구조체 이다.

구성은 Machine, Number of Sections, Time Date Stamp, Pointer to Symbol Table, Number of Symbols, Size of Optional Header, Characteristics이다.

이중에서 가장 중요한 것은 Pointer to Symbol Table, Number of Symbols, Size of Optional Header, Characteristics 4가지 이다.

이 4가지 값이 제대로 설정되어 있지 않으면 실행이 정상적으로 이루어지지 않는다.

 

HexEditor에서 확인한 File Header

 

- Machine : CPU별로 고유한 값이며 32비트 Inter x86 호환 칩은 14C의 값을 가진다.

- Number of Sections : PE파일은 코드, 데이터, 리소스 등이 각각의 섹션에 나뉘어서 저장이 되어지는데 그의 개수를 나타낸다. 반드시 0보다 커야한다.

- Size of Optional Header : 마지막 멤버로 이름을 보듯이 뒤에 나오게 되는 IMAGE_OPTIONAL_HEADER 구조체의 크기를 나타낸다.

- Characteristics : 파일의 속성을 나타내는 값으로 실행이 가능한 형태인지 혹은 DLL 파일인지 등의 정보들이 bit OR 형식으로 조합된다.

 

*NT Header - Optional Header

PE 헤더 구조체 중에서 가장 크기가 큰 IMAGE_OPTIONAL_HEADER 32이다.

 

이들 중에서 가장 중요한 것들만 소개를 하겠다.

- Magic : Magic 넘버는 32구조체인 경우 10B, 64구조체인 경우 20B 값을 가집니다.

- Address of Entry Point : 이 멤버는 Entry Point의 RVA 값을 가지고 있습니다. 이 값이야 말로 프로그램에서 최초로 실행되는 코드의 시작 주소로 매우 중요한 값이다.

- Image Base : 프로세스의 가상 메모리는 0~FFFFFFFF 범위(32비트)입니다. ImageBase는 이렇게 광활한 메모리에서 PE 파일이 로딩되는 시작 주소를 나타낸다.

- SectionAlignment, FileAlignment : PE 파일의 Body 부분은 섹션으로 나뉘어져 있습니다. 파일에서 섹션의 최소단위를 나타내는 것이 FileAlignment이고 메모리에서 섹션의 최소 단위를 나타내는 것이 SectionAlignment 이다. 파일/메모리의 섹션 크기는 반드시 각각 FileAlignment/SectionAlignment의 배수가 되어야 합니다.

- Size of Image : PE 파일이 메모리에 로딩 되어있을 때 가상 메모리에서 PE Image가 차지하는 크기를 나타낸다. 일반적으로 파일의 크기와 메모리에 로딩된 크기는 다르다.

- Size of Header : PE 헤더의 전체 크기를 나타낸다.

- Subsystem : 이 멤버를 보고 시스템 드라이버 파일인지, 일반 실행 파일인지 구분할 수 있다. ex) 1 : 시스템 드라이버, 2 : GUI, 3 : CUI

- Number of Rva And Size : Nuber of Data Directories 배열의 개수를 나타낸다.

- Number of Data Directories : 여기서  가장 중요한 것은 IMPORT, EXXPORT 입니다.

 

HexEditor에서 확인한 IMAGE_OPTIONAL_HEADER 구조체 크기

 

'리버싱 기초' 카테고리의 다른 글

Protostar-stack0 풀이  (0) 2018.12.19
PE 구조 (섹션 헤더)  (0) 2018.11.11
PE 구조 (DOS Stub)  (0) 2018.11.11
PE 구조 (DOS 헤더)  (0) 2018.11.11
함수 호출 규약  (0) 2018.11.03