본문 바로가기
시큐아

NT Header, Image Section Header, IAT란?

by jwcs 2025. 7. 21.
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