[윈도우스터디]이승현, PEstructure

Download Report

Transcript [윈도우스터디]이승현, PEstructure

PE
STRUCTURE
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
PE(Portable Executable)
-
-
유닉스의 COFF기반으로 제작된 윈도우 실행파일의 기본 구조.
프로그램과 관련된 정보가 PE 구조에 저장되어 있음.
- 파일의 아이콘
- 프로그램의 시작위치
- 호출하는 함수의 정보
EXE, DLL, OBJ 등의 파일이 PE구조를 갖고 있음.
운영체제의 내부적인 동작을 엿볼 수 있음.
PE생성 결과는 컴파일러마다 조금씩 다르게 나타남.
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
PE header
-
Dos Header(IMAGE_DOS_HEADER)
- 도스와의 호환성을 위한 존재
-
Dos Stub
- Dos환경에서의 실행 시 문자열
-
NT Header
- PE파일의 주요,세부속성 정의
-
Section Header
- 각 섹션에 대한 정보
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
1.DOS HEADER
도스와의 호환성을 위한 존재. 밑과 같은 많은 정보를 필
요로 하지만, 윈도우에서는 딱 두 가지만 사용하고 있음.
- e_magic : 실행 파일임을 의미하는 매직 넘버
- e_lfanew : 다음 헤더의 오프셋
[ test123.exe ]
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
1.DOS HEADER
도스와의 호환성을 위한 존재. 밑과 같은 많은 정보를 필
요로 하지만, 윈도우에서는 딱 두 가지만 사용하고 있음.
- e_magic : 실행 파일임을 의미하는 매직 넘버
- e_lfanew : 다음 헤더의 오프셋
[ test123.exe ]
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
기본 파일의 DOS HEADER 부분.
e_magic : 4D 5A
e_lfanew : 00 00 00 E0
e_magic과 e_lfanew만 사용되고, 그 외의 필드들은 Windows에서 파일을 실행시켰을 때 이용되지 않는다.
악성코드에서 많이 사용되는 Upack의 DOS HEADER 부분.
e_magic : 4D 5A
e_lfanew : 00 00 00 40 ??
e_magic 및 e_lfanew 필드 이외의 값들이 'KERNEL32.DLL', 'LoadLibraryA',
'GetProcAddress' 등의 문자열로 채워진 것을 확인 할 수 있다.
일반적이지 않은 형태로 구조체가 정의 되더라도 각 필드에 맞는 값들이 채워진다면 운영체제가 파일을 읽어 들여서 실행하는 것에는 문제가 되지 않는다.
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
1.DOS HEADER[Stub]
PE 실행 파일의 확장자가 도스에서와 똑같은 EXE이기 때
문에, 실행됐을 때 DOS에서 실행될 수 없다는 안내문을
뜨게 하는데, 그 역할을 하는 존재
크기가 일정하지 않으며, 코드와 데이터의 조합으로 만
들어짐.
“This is Program Cannot be run in DOS mode..”
[ test123.exe ]
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
2.NT_HEADER
프로그램이 윈도우 시스템에서 동작하기 위한 정보를 가
지고 있음. 이 부분은 3가지로 구성되어있는데, 다음과
같다.
- Signature
50 45 00 00 ( PE )
- IMAGE_FILE_HEADER
- IMAGE_OPTIONAL_HEADER
[ test123.exe ]
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
2.NT_HEADER
프로그램이 윈도우 시스템에서 동작하기 위한 정보를 가
지고 있음. 이 부분은 3가지로 구성되어있는데, 다음과
같다.
- Signature
50 45 00 00 ( PE )
- IMAGE_FILE_HEADER
- IMAGE_OPTIONAL_HEADER
[ test123.exe ]
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
3.SECTION HEADER
PE 파일은 CODE, DATA, RESOURCE 등의 영역을
각각의 Section 단위로 나누어 저장한다.
왜? DATA와 CODE가 같이 있으면, DATA에 값이 쓰일 때,
CODE에 overwrite되기 때문에 동작하지 않을 것
= 안전성 유지 목적
각각의 Section의 속성을 기술할 Header.
typedef struct _IMAGE_SECTION_HEADER {
BYTE
Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD
PhysicalAddress;
DWORD
VirtualSize;
} Misc;
DWORD
VirtualAddress;
DWORD
SizeOfRawData;
DWORD
PointerToRawData;
DWORD
PointerToRelocations;
DWORD
PointerToLinenumbers;
WORD
NumberOfRelocations;
WORD
NumberOfLinenumbers;
DWORD
Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
[ test123.exe ]
.text
실행 코드를 가진다. CPU에 의존적. 실행만 가능, 쓰기 불가능
.data
초기화된 전역 변수를 가진다. 컴파일러가 여기에 변수를 마련
.rdata
읽기 전용의 변수. 문자열 상수나 const선언 변수들을 저장
.edata
Export할 함수에 대한 정보를 가짐. DLL경우에만 이 섹션존재
.idata
Import할 함수에 대한 정보를 가짐. 어떤DLL에 있는함수가필요한지 저장
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
DOS HEADER
typedef struct _IMAGE_DOS_HEADER {
WORD
e_magic;
. . .
LONG
e_lfanew
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
DOS STUB HEADER
NT HEADER
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
SECTION HEADER
typedef struct _IMAGE_SECTION_HEADER {
BYTE
Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD
PhysicalAddress;
DWORD
VirtualSize;
} Misc;
DWORD
VirtualAddress;
DWORD
SizeOfRawData;
DWORD
PointerToRawData;
DWORD
PointerToRelocations;
DWORD
PointerToLinenumbers;
WORD
NumberOfRelocations;
WORD
NumberOfLinenumbers;
DWORD
Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
DOS HEADER
typedef struct _IMAGE_DOS_HEADER {
WORD
e_magic;
. . .
LONG
e_lfanew
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
DOS STUB HEADER
NT HEADER
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
SECTION HEADER
typedef struct _IMAGE_SECTION_HEADER {
BYTE
Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD
PhysicalAddress;
DWORD
VirtualSize;
} Misc;
DWORD
VirtualAddress;
DWORD
SizeOfRawData;
DWORD
PointerToRawData;
DWORD
PointerToRelocations;
DWORD
PointerToLinenumbers;
WORD
NumberOfRelocations;
WORD
NumberOfLinenumbers;
DWORD
Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
FILE HEADER
typedef struct _IMAGE_FILE_HEADER {
WORD
Machine;
WORD
NumberOfSections;
DWORD
TimeDateStamp;
DWORD
PointerToSymbolTable;
DWORD
NumberOfSymbols;
WORD
SizeOfOptionalHeader;
WORD
Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
OPTIONAL HEADER
typedef struct _IMAGE_OPTIONAL_HEADER {
WORD
Magic;
BYTE
MajorLinkerVersion;
BYTE
MinorLinkerVersion;
DWORD
SizeOfCode;
DWORD
SizeOfInitializedData;
DWORD
SizeOfUninitializedData;
DWORD
AddressOfEntryPoint;
DWORD
BaseOfCode;
DWORD
BaseOfData;
DWORD
ImageBase;
DWORD
SectionAlignment;
DWORD
FileAlignment;
WORD
MajorOperatingSystemVersion;
WORD
MinorOperatingSystemVersion;
WORD
MajorImageVersion;
WORD
MinorImageVersion;
WORD
MajorSubsystemVersion;
WORD
MinorSubsystemVersion;
DWORD
Win32VersionValue;
DWORD
SizeOfImage;
DWORD
SizeOfHeaders;
DWORD
CheckSum;
WORD
Subsystem;
WORD
DllCharacteristics;
DWORD
SizeOfStackReserve;
DWORD
SizeOfStackCommit;
DWORD
SizeOfHeapReserve;
DWORD
SizeOfHeapCommit;
DWORD
LoaderFlags;
DWORD
NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
DOS HEADER
typedef struct _IMAGE_DOS_HEADER {
WORD
e_magic;
. . .
LONG
e_lfanew
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
DOS STUB HEADER
NT HEADER
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
SECTION HEADER
typedef struct _IMAGE_SECTION_HEADER {
BYTE
Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD
PhysicalAddress;
DWORD
VirtualSize;
} Misc;
DWORD
VirtualAddress;
DWORD
SizeOfRawData;
DWORD
PointerToRawData;
DWORD
PointerToRelocations;
DWORD
PointerToLinenumbers;
WORD
NumberOfRelocations;
WORD
NumberOfLinenumbers;
DWORD
Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
FILE HEADER
typedef struct _IMAGE_FILE_HEADER {
WORD
Machine;
WORD
NumberOfSections;
DWORD
TimeDateStamp;
DWORD
PointerToSymbolTable;
DWORD
NumberOfSymbols;
WORD
SizeOfOptionalHeader;
WORD
Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
DATA DIRECTORY
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD
VirtualAddress;
DWORD
Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
OPTIONAL HEADER
typedef struct _IMAGE_OPTIONAL_HEADER {
WORD
Magic;
BYTE
MajorLinkerVersion;
BYTE
MinorLinkerVersion;
DWORD
SizeOfCode;
DWORD
SizeOfInitializedData;
DWORD
SizeOfUninitializedData;
DWORD
AddressOfEntryPoint;
DWORD
BaseOfCode;
DWORD
BaseOfData;
DWORD
ImageBase;
DWORD
SectionAlignment;
DWORD
FileAlignment;
WORD
MajorOperatingSystemVersion;
WORD
MinorOperatingSystemVersion;
WORD
MajorImageVersion;
WORD
MinorImageVersion;
WORD
MajorSubsystemVersion;
WORD
MinorSubsystemVersion;
DWORD
Win32VersionValue;
DWORD
SizeOfImage;
DWORD
SizeOfHeaders;
DWORD
CheckSum;
WORD
Subsystem;
WORD
DllCharacteristics;
DWORD
SizeOfStackReserve;
DWORD
SizeOfStackCommit;
DWORD
SizeOfHeapReserve;
DWORD
SizeOfHeapCommit;
DWORD
LoaderFlags;
DWORD
NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
DOS HEADER
e_magic : MZ
e_lfanew : 다음에 실행될 헤더 오프셋
DOS STUB HEADER
OPTIONAL HEADER
FILE HEADER
Machine : CPU 별로의 고유한 값
NumberOfSections : 섹션의 개수
SizeOfOptionalHeader : 옵셔널헤더 구조
체의 크기
Characteristics : 파일의 속성 값 (DLL?
EXE? SYS?)
Magic : OptionalHeader의 매직넘버
(IMAGE_OPTIONAL_HEADER64, 020B)
AddressOfEntryPoint : 최초로 실행되는 코드의 시작 주소(eip=AOEP+Imagebase)
ImageBase :PE 파일이 로딩되는 시작 주소(exe-00400000,dll10000000)
SectionAlignment : 메모리에서 섹션의 최소단위(보통 4K)
FileAlignment : 파일에서의 섹션의 최소단위(보통 512)
SizeOfImage : 메모리에 로딩되었을 때 가상 메모리에서 PE 이미지 크기(헤더+)
SizeOfHeaders : PE 헤더의 전체 크기
Subsystem : GUI면 2, CUI면 3, 시스템드라이브 파일이면 1
NumberOfRvaAndSizes : DataDirectory의 배열 개수(통상 0x10)
DATA DIRECTORY
NT HEADER
Signature : PE00
FILE HEADER
OPTIONAL HEADER
SECTION HEADER
VirtualSize : 메모리에서 섹션이 차지하는 크기
VirtualAddress : 메모리에서 섹션의 시작주소(RVA)
SizeOfRawData :파일에서 섹션이 차지하는 크기
PointerToRawData : 파일에서의 섹션시작위치
Characteristics : 섹션의 속성(bit or)
#define
#define
#define
#define
#define
#define
IMAGE_SCN_CNT_CODE
IMAGE_SCN_CNT_INITIALIZED_DATA
IMAGE_SCN_CNT_UNINITIALIZED_DATA
IMAGE_SCN_MEM_EXECUTE// 실행
IMAGE_SCN_MEM_READ // 읽기
IMAGE_SCN_MEM_WRITE // 쓰기
DATA DIRECTORY
#define
#define
#define
#define
#define
#define
#define
//
#define
#define
#define
#define
#define
#define
#define
#define
IMAGE_DIRECTORY_ENTRY_EXPORT
IMAGE_DIRECTORY_ENTRY_IMPORT
IMAGE_DIRECTORY_ENTRY_RESOURCE
IMAGE_DIRECTORY_ENTRY_EXCEPTION
IMAGE_DIRECTORY_ENTRY_SECURITY
IMAGE_DIRECTORY_ENTRY_BASERELOC
IMAGE_DIRECTORY_ENTRY_DEBUG
IMAGE_DIRECTORY_ENTRY_COPYRIGHT
IMAGE_DIRECTORY_ENTRY_ARCHITECTURE
IMAGE_DIRECTORY_ENTRY_GLOBALPTR
IMAGE_DIRECTORY_ENTRY_TLS
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
IMAGE_DIRECTORY_ENTRY_IAT
IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
0
1
2
3
4
5
6
7
7
8
9
10
11
12
13
1R4
// Export Directory
// Import Directory
// Resource Directory
// Exception Directory
// Security Directory
// Base Relocation Table
// Debug Directory
// (X86 usage)
// Architecture Specific Data
// RVA of GP
// TLS Directory
// Load Configuration Directory
// Bound Import Directory in headers
// Import Address Table
// Delay Load Import Descriptors
// COM Runtime descriptor
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
Peview.exe [test123.exe]
Peview.exe GOGO
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
IAT(Import Address Table)
프로그램이 어떤 라이브러리에서 어떤 함수를 사용하고 있는지 기술한 테이블
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD
Characteristics;
DWORD
OriginalFirstThunk;
} DUMMYUNIONNAME;
DWORD
TimeDateStamp;
// 0 for terminating null import descriptor
// RVA to original unbound IAT (PIMAGE_THUNK_DATA)
Import Name Table
// 0 if not bound,
// -1 if bound, and real date\time stamp
//
in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
// O.W. date/time stamp of DLL bound to (Old BIND)
Name[라이브러리 명]
DWORD
ForwarderChain;
DWORD
Name;
DWORD
FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR;
// -1 if no forwarders
// RVA to IAT (if bound this IAT has actual addresses)
Import Address Table
근데, 저 구조체의 위치는 어디에 있나?? PE HEADER ??..
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
IMAGE_OPTIONAL_HEADER . DataDirectory[1] . VirtualAddress에 있다.
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD
VirtualAddress;
DWORD
Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD
Characteristics;
DWORD
OriginalFirstThunk;
} DUMMYUNIONNAME;
DWORD
TimeDateStamp;
DWORD
ForwarderChain;
DWORD
Name;
DWORD
FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR;
// 0 for terminating null import descriptor
// RVA to original unbound IAT (PIMAGE_THUNK_DATA)
// 0 if not bound,
// -1 if bound, and real date\time stamp
//
in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
// O.W. date/time stamp of DLL bound to (Old BIND)
OriginalFirstThunk(구조체) == Import Name Table(Peview)
Name(구조체) == Name RVA(Peview)
FirstThunk(구조체) == Import Address Table(Peview)
// -1 if no forwarders
// RVA to IAT (if bound this IAT has actual addresses)
IAT
INT
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
EAT(Export Address Table)
라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할 수 있도록 함
-> 해당 라이브러리에서 Export하는 함수의 주소를 정확히 구할 수 있음.
typedef struct _IMAGE_EXPORT_DIRECTORY {
실제 Export 함수 개수
DWORD
Characteristics;
DWORD
TimeDateStamp;
Export 함수 중에서 이름을 가지는 함수
WORD
MajorVersion;
WORD
MinorVersion;
Export 함수 주소 배열
DWORD
Name;
DWORD
Base;
함수 이름 주소 배열
DWORD
NumberOfFunctions;
DWORD
NumberOfNames;
DWORD
AddressOfFunctions;
// RVA from base of image
Ordinal 주소 배열
DWORD
AddressOfNames;
// RVA from base of image
DWORD
AddressOfNameOrdinals; // RVA from base of image
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
IMAGE_OPTIONAL_HEADER . DataDirectory[0] . VirtualAddress = EAT
PE
STRUCTURE
PE File Format | DOS HEADER | NT HEADER | SECTION HEADER | IMAGE_IMPORT_DESCRIPTOR | EAT
이승현(Secudent) | BoB4 | Pwn&Play |
PE
STRUCTURE