본문 바로가기

Reversing

01. PE File Format

PE(Portable Executable) 파일


이름 그대로 옮겨다니면서 실행시킬 수 있는 파일을 말한다.

초기 목적은 Microsoft사에서 윈도우와 기타 다른 운영체제(리눅스, Mac)와 이식성을 좋게 하기 위해서 만든 파일구조이다. 하지만 현재는 윈도우 운영체제 간 이식성이 좋은 파일로 사용된다.


종류?


실행 계열 : EXE, SCR

드라이버 계열 : SYS, VXD

라이브러리 계열 : DLL, OCX, CPL, DRV

오브젝트 파일 계열 : OBJ


PE 파일의 종류에 대해 더 깊게 살펴보자


EXE : 그렇다. 윈도우를 쓰는 사람에겐 굉장히 익숙한 실행파일 바로 그것

SCR : 화면 보호기 확장자. 윈도우에서 오랜시간 동작 X 시 나오는 화면 보호기 바로 그 파일의 확장자.

SYS : 시스템 파일 확장자. 시스템을 구성하는데 필요한 파일들의 확장자

VXD : Virtual X Driver. 무언가의 가상 드라이버 확장자

DLL : Dynamic Link Library. 동적 링크 라이브러리이다.

OCX : 복합 문서를 지원하는 파일. 소리 그림 등등

OBJ : 오브젝트 파일 확장자.


이 가운데서 OBJ를 제외하곤 간접, 직접적으로 실행가능하다.


1. PE 헤더


PE 파일 구조 중 DOS header ~ Section header 까지를 PE 헤더라고 한다.


2. DOS header


중요한 값은 e_magic, e_lfanew 라고 "리버싱 핵심원리"에서 말한다

e_magic : DOS signature로 MZ라는 문자열이다. (만든 사람의 이니셜)

e_lfanew : NT header의 RVA 형태의 주소값을 가지고 있다.


3. DOS stub


DOS 상태에서 돌아갈 명령어가 16bit 명령어 형태로 저장되어 있다

사실, 있어도 상관없고 없어도 상관 없으며 크기도 안정해져있다.


4. NT headers


이 부분에서 Signature 은 PE 라는 문자를 나타낸다. 이 PE 라는 문자가 있는 파일은 PE 파일이라고 생각하면 된다.


5. IMAGE_FILE_HEADER


Machine : CPU별로 고유한 값을 가진다. IA-32는 14Ch, IA-64는 200h


NumberOfSections : 다음에 나오는 Section들의 갯수이다. 최소 1개 이상이어야한다 ( 없으면 섹션이 없는거니까.. )


SizeOfOptionalHeader : IMAGE_NT_HEADERS 구조체의 마지막 구조체인 IMAGE_OPTIONAL_HEADERS32 구조체의 크기를 나타낸다.


Characteristics : 파일의 속성에 대한 부분이다. 많은 속성들 중에 파일에 해당하는 부분만 bit OR형식으로 조합되어 이 곳에 저장된다.


6. IMAGE_OPTIONAL_HEADER32


Magic : 이 값은 32bit용 컴퓨터에선 10Bh, 64bit용 컴퓨터에선 20Bh로 저장된다.


AddressOfEntryPoint : EP의 RVA 주소값이 들어있다. RVA 이므로 실제 EP는 AddressOfEntryPoint + ImageBase 이다.


ImageBase : PE파일이 맵핑되는 시작 주소를 가리킨다.


SectionAlignment : 메모리에서 섹션의 최소 단위


FileAlignment : 파일에서 섹션의 최소 단위

(SetionAlignment와 FileAlignment의 최소단위를 맞추기 위해서 부족한 부분은 section들이 끝날때 NULL로 패딩해준다)


SizeOfImage : 메모리에서의 PE구조의 크기


SizeOfHeader : PE header의 크기


Subsystem : 1 == 드라이버 파일

2 == GUI 파일

3 == CUI 파일


NumberOfRvaAndSizes : IMAGE_DATA_DIRECTORY 구조체의 배열 크기를 정함


VirtualSize : 메모리에서 Section의 크기 저장


VirtualAddress : 메모리에서 Section의 시작주소가 RVA값으로 저장


SizeOfRawData : 파일에서 Section의 크기 저장


PointerToRawData : 파일에서 Section의 시작주소가 RVA값으로 저장


Characteristics : 파일의 속성에 대한 부분


* Section header


Section을 구분짓고 Section들의 속성, 크기, 시작 위치 등을 정함


'Reversing' 카테고리의 다른 글

07. arm 어셈블리어 정리  (0) 2017.10.27
06. gdb 명령어 정리  (0) 2017.09.29
05. 스택, 스택프레임  (0) 2017.08.04
04. 함수 호출 규약  (0) 2017.08.02
02. IAT & EAT  (0) 2017.05.24
01. PE File Format  (0) 2017.05.24