728x90
반응형
리버싱 및 시스템 보안 수업 중 PE 구조에 대해 금방 잊어버릴 것 같아 개인 실습을 기록하기로 했다.
NT Header
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; // PE Signature : 50450000 ("PE"00)
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
위와 같이 3개의 멤버로 구성된 구조체를 가진다.
Signature
DOS Header의 마지막 값이 e_lfanew 값이다. 오프셋 0x3C에 위치해있는데, 이 값에 PE 시그니처의 오프셋이 들어있다.

50 45 00 00의 값을 가지며, 이후의 값이 IMAGE_FILE_HEADER의 값이다.
IMAGE_FILE_HEADER
- Machine
- CPU별로 고유한 값을 가지면서 IA-32 호환 CPU 14Ch의 값을 IA-64호환 CPU는 200h의 값을 가짐
- NumberOfSections
- 이 값은 다음에 나오는 Section들의 갯수이며 최소 1개 이상이여야 함
- SizeOfOptionalHeader
- 이 값은 IMAGE_NT_HEADERS 구조체의 마지막 구조체 IMAGE_OPTIONAL_HEADER 32의 구조체 크기를 나타냄
- Characteristics
- 이 값은 파일 속성에 대한 부분

IMAGE_OPTIONAL_HEADER
- Magic
- 이 구조체가 32bit 용이면 10Bh, 64bit용이면 20Bh의 값을 가진다
- AddressOfEntryPoint
- EP(Entry Point)의 RVA 주소값이 들어있다
- PE 시그니처 이후 20byte + 16byte 뒤에 주소값에 위치함

- Image Base
- PE 파일이 맵핑되는 시작 주소를 가리킨다
- AddressOfEntryPoint의 값 4byte + BaseOfCode, BaseOfData의 값 8byte 총 12byte 뒤에 있다.


위 구조체에 각 몇 바이트씩 차지하는지를 계산해서 더하기 몇을 해야하는지 알 수 있다.
파일을 시작하면 ImageBase + AddressOfEntryPoint가 Virtual Address이다.

위 그림에서 00400000(ImageBase) + 11A0(AddressOfEntryPoint)한 값이 프로그램의 시작 지점임을 알 수 있다.
IAT
- PE 파일이 실행될 때, 내가 사용하는 함수들(예: MessageBoxA)의 실제 주소가 IAT에 기록된다.
- 프로그램 코드에서는 call [IAT의 함수 주소] 처럼 사용하여 IAT를 간접 참조해서 외부 함수를 호출한다.

- IAT의 테이블을 구성하기 위해 그 dll에 직접 한 번씩 방문하여 어느 요소인지 확인하는 과정을 거친다.
- 아직 IAT에 대해서는 확실하게 이해가 되지 않았다. 나중에 이어서 다시 확인해보도록 하겠다
728x90
반응형
'시큐아' 카테고리의 다른 글
| 지뢰 찾기 무적 On/Off 핵 만들기 (0) | 2025.07.22 |
|---|---|
| AWS WAF + Load Balancer 적용 실습 (2) | 2025.07.11 |
| [시큐아] 정보보호 개론 (0) | 2025.07.10 |
| [온택트 융합보안] 리눅스 기초 (0) | 2025.07.05 |