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 |