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' 카테고리의 다른 글
06. gdb 명령어 정리 (0) | 2017.09.29 |
---|---|
05. 스택, 스택프레임 (0) | 2017.08.04 |
04. 함수 호출 규약 (0) | 2017.08.02 |
03. 패킹 & 언패킹 (0) | 2017.05.26 |
02. IAT & EAT (0) | 2017.05.24 |