리버싱

2부 13장 PE File Format(4)

오브의 별 2022. 4. 24. 14:14
반응형

안녕하세요, 오브입니다.

오늘은 NT Header의 Optional Header에 대해 알아보겠습니다.

https://staraube.tistory.com/51?category=548043

 

2부 13장 PE File Format(1)

안녕하세요, 오브입니다. 오늘은 PE 파일의 기본구조와 VA, RVA에 대해 알아보겠습니다. PE File Format 13.1. 소개 PE 파일: Windows 운영체제에서 사용되는 실행 파일 형식. 기존 UNIX에서 사용되는 COFF 기

staraube.tistory.com

 

https://staraube.tistory.com/52?category=548043

 

2부 13장 PE File Format(2)

안녕하세요, 오브입니다. 오늘은 PE 헤더의 많은 구조체 중 DOS Header와 DOS Stub에 대해 알아보겠습니다. https://staraube.tistory.com/51?category=548043 PE File Format 13.3. PE 헤더 13.3.1. DOS Header D..

staraube.tistory.com

https://staraube.tistory.com/53

 

2부 13장 PE File Format(3)

안녕하세요, 오브입니다. 오늘은 NT Header에 대해 알아보겠습니다. https://staraube.tistory.com/51?category=548043 https://staraube.tistory.com/52?category=548043 PE File Format 13.3.3. NT Header NT he..

staraube.tistory.com

 

PE File Format
  • PE 헤더 구조체 중 가장 크기가 큰 IMAGE_OPTIONAL_HEADER32
    • 아래의 값들은 파일 실행에 필수적이라 잘못 세팅되면 파일이 정상 실행x

1. Magic

  • IMAGE_OPTIONAL_HEADER32 구조체인 경우 10B, IMAGE_OPTIONAL_HEADER64 구조체인 경우 20B 값을 가짐

 

2. AddressOfEntryPoint

  • EP의 RVA 값을 가지고 있음
  • 프로그램에서 최초로 실행되는 코드의 시작 주소

 

3. ImageBase

  • 프로세스 가상 메모리는 0~FFFFFFFF범위(32비트 경우)
  • 광할한 메모리에서 PE 파일이 로딩되는 시작 주소
  • XEX, DLL 파일은 user memory 영역인0~FFFFFFFF범위에 로딩
  • SYS 파일은 kenel memory 영역인 80000000~FFFFFFFF에 로딩
  • 개발 도구로 만드는 EXE 파일이 00400000
  • DLL 파일은 10000000
  • PE 로더는 EIP 레지스터 값을 ImageBase + AddressOfEntryPoint 값으로 세팅

 

4. SectionAlignment, FileAlignment

  • PE 파일의 Body 부분을 섹션으로 나눠집
  • FileAlignment: 메모리에서 섹션의 최소단위
  • 파일/메모리 섹션 크기는 FileAlignment/SectionAlignment의 배수

 

5. SizeOfImage

  • PE 파일이 메모리에 로딩됐을 때 가상 메모리에서 PE Image가 차지하는 크기
  • 파일 크기와 메모리에 로딩된 크기는 다름

 

6. SizeOfHeader

  • PE 헤더의 전체 크기
  • 값: FileAlignment의 배수
  • 파일 시작에서 SizeOfHeader 옵셋만큼 떨어진 위치에 첫 번째 섹션 위치

 

7. Subsystem

  • 이 값을 보고 시스템 드라이버 파일인지, 일반 실행 파일인지 구분 가능
의미 비고
1 Driver File 시스템 드라이버 ex) ntfs.sys
2 GUI 파일 창 기반 애플리케이션 ex) notepad.exe
3 CUI 파일 콘솔 기반 애플리케이션 ex) cmd.exe

 

8. NumberOfRvaAndSizes

  • IMAGE_OPTIONAL_HEADER32 구조체의 마지막 멤버인 DataDirectory 배열의 개수
  • 구조체 정의에 IMAGE_NUMBEROF_DIRECTORY_ENTRIES(16)이라고 명시되어 있지만 PE 로더는 NumberOfRvaAndSizes 값을 보고 배열 크기 인식

 

9. DataDirectory

  • IMAGE_DATA_DIRECTORY 구조체의 배열로, 배열의 각 항목마다 정의된 값 가짐
    • EXPORT: DLL 등의 파일에서 외부에 함수를 공개하기 위한 정보들을 가짐. IMAGE_EXPORT_DIRECTORY 구조체의 시작 번지 가리킴. 이 시작 번지가 익스포트 섹션의 시작 주소
    • IMPORT: 프로그램 실행을 위해 Import 하는 DLL 이름과 사용할 함수 정보가 담긴 INT 주소와 IAT(임포트 주소 테이블) 주소 담은 정보가 담김. IMAGE_IMPORT_DIRECTORY 시작 번지
    • RESOURCE: IMAGE_RESOURCE_DIRECTORY 구조체의 시작 번지. 이 시작 번지가 리소스 섹션의 시작 주소임
    • TLS Directory: 스레드 지역 저장소 초기화 섹션에 대한 포인터. VirtualAddress는 이 TLS 섹션을 가리키는 RVA가 됨

 

반응형