728x90
반응형
Definition | 정의
윈도우 운영체제에서 사용되는 실행 파일 형식을 의미함 ex) exe 파일
PE format : 윈도우 로더가 실행 가능한 코더를 관리하는데 필요한 정보를 캡슐화한 데이터 구조체
Portable Executable File Format : 옮겨지더라도 파일이 실행가능하도록 만들어진 포맷
→ 프로그램을 빌드할 때 파일 실행시 필요한 정보들을 PE헤더에 명시해주곤 함
종류
실행계열 : exe, scr
라이브러리 계열 : DLL, OCX, CPL, DRV
드라이버 계열 : SYS, VSD
오브젝트 계열 : OBJ
PE파일의 구조
Dos Header
e_magic값 : 해당 파일이 PE 파일인지 아닌지 확인해주는 영역 →시작 부분이 4D 5A여야함
--> Dos Signature 값이 존재함
[IMAGE_DOS_HEADER 구조체]
- 구조체 크기 0x 40
- e_magic 변수 : 2byte
- e_lfanew 변수 : NT header의 시작 주소 표시 (4byte - 가변적)
알씨 9.22 파일을 참고하면 e_lfanew는 00 00 01 00(리틀엔디안)이다
Dos Stub
- DOS Header의 다음 주소부터 NT Header 시작 전까지 영역
window 32에서 돌아가야한다는 것을 나타냄
NT Header (IMAGE_NT_HEADERS)
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; // PE Signature
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
- Signature : 50 45 00 00 byte로 NT Header 구조체의 시작을 알림
- IMAGE_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;
- Machine : 해당 파일이 동작 가능한 머신의 종류 → 알씨 9.22는 0x014c (리틀엔디안) Intel x86호환 CPU
- NumberOfSections : PE 파일이 가지고 있는 Section의 개수 → 알씨 9.22는 0x000B 총 11개
- TimeDateStamp : 파일을 빌드한 시간 (4byte)
- PointertoSymbolTable : 심볼테이블을 가리키는 포인터 (4byte)
- NumberofSymbols : 심볼의 개수 (4byte)
- SizeofOptionalHeader : IMAGE_OPTIONAL_HEADER 구조체의 크기(2byte) → 알씨 9.22는 0x00E0 (224 byte)
- Characteristics : 현재 파일의 형식을 알려줌 (실행파일 / DDL / 시스템 /재배치 여부) (2byte) → 알씨 9.22는 0x818E
<Characteristics 참고 WinNT.h>
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file.
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references).
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file.
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file.
#define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010 // Agressively trim working set
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 // App can handle >2gb addresses
#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed.
#define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine.
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 // If Image is on removable media, copy and run from the swap file.
#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 // If Image is on Net, copy and run from the swap file.
#define IMAGE_FILE_SYSTEM 0x1000 // System File.
#define IMAGE_FILE_DLL 0x2000 // File is a DLL.
#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 // File should only be run on a UP machine
즉 0x818E => 32bit word machine & Bytes of machine word are revsersed & file is executable ...
- OptionalHeader - 224byte
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// NT additional fields.
//
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;
- Magic (Signature) : 0x010B - IMAGE_OPTIONAL_HEADER 구조체임을 나타냄 (64bit인 경우 0x020B)
- MajorLinkerVersion & MinorLinkerVersion → 알씨 9.22는 0x02 / 0x19
- SizeofCode :코드 영역의 크기(텍스트 section) → 알씨 9.22는 0x00764000
- SizeOfInitializedData & SizeOfUninitalizedData → 알씨 9.22는 0x003E6200 / 0x00000000
- AddressOfEntryPoint : 프로그램이 메모리에서 실행되는 시작 지점→ 알씨 9.22는 0x00764E78 + imagebase
- ImageBase : PE파일이 로딩되는 시작 주소 → 알씨 9.22는 0x00001000
- SectionAlignment : 메모리 상에서 섹션의 최소 단위
- FileAlignment : 파일 상에서 섹션의 최소 단위
- SizeOfImage : PE파일이 메모리에 로딩되었을 때 가상메모리에서의 PE의 크기
- SizeOFHeader : PE헤더 전체 크기
728x90
반응형
'Hacking > Window' 카테고리의 다른 글
[Mitigation] Window VS Linux (0) | 2024.11.27 |
---|---|
[IDA Pro] 사용법 정리 (3) | 2024.07.21 |
MuseScore DoS Vulnerability Write Up (2) | 2024.07.18 |
[ Domato ] 사용법 (4) | 2024.05.18 |
[Fuzzing] WinAFL을 이용한 개념정리 (2) | 2024.05.05 |