Malware Analysis/PE

#1 PE - DOS Header

geunyeong 2021. 7. 31. 23:14

Abstract

PE는 Windows에서 사용하는 실행 파일 포맷이다. 실행 파일을 실행하기 위한 다양한 속성 값을 가지고 있어, 리버스 엔지니어링에 있어서 잘 알아둬야 할 파일 구조이다. 본 PE 편에서는 아래 항목들에 대해 서술하고자 한다.

  • DOS Header
  • File Header
  • Optional Header
  • Section Header
  • IAT
  • .reloc Section
  • Rich Header

DOS Header

IMAGE_DOS_HEADER structure

PE 파일의 DOS 헤더는 DOS 파일에 대한 하위 호환성을 고려해 만들어졌다. 때문에 PE 헤더의 가장 앞 부분에는 IMAGE_DOS_HEADER 구조체가 나타난다. IMAGE_DOS_HEADER는 'MZ' 라는 매직넘버로 시작하며 NT 헤더의 시작 오프셋을 저장하고 있다.

 

winnt.h에 정의된 IMAGE_DOS_HEADER 구조체

 

IMAGE_DOS_HEADER는 winnt.h에 정의되어 있다. 가장 주요하게 볼 건 매직넘버 값을 저장하는 e_magic 멤버와 NT 헤더 오프셋을 저장하는 e_lfanew 멤버다. 나머지 멤버들은 실행에 영향을 주지 않는다. 매직넘버 값이 'MZ'가 아니면 정상적으로 실행되지 않는다. e_lfanew 값도 올바른 NT 헤더를 가리키지 않으면 PE 파일은 실행되지 않는다. 바이너리 파일에서 PE 파일을 카빙할 경우 이를 활용할 수도 있다.

  • e_magic: IMAGE_DOS_HEADER의 매직넘버인 'MZ'가 저장되는 2바이트 크기 멤버
  • e_lfanew: NT 헤더의 파일 내 오프셋을 나타내는 4바이트 크기 멤버

sample.exe의 DOS 헤더를 바이너리로 살펴보면 아래 그림과 같다. 붉은 박스는 DOS 헤더의 매직넘버인 e_magic이고, 하늘색 박스는 NT 헤더 위치를 가리키는 e_lfanew이다. 초록색 박스는 NT 헤더를 나타낸다.

 

IMAGE_DOS_HEADER의 e_lfanew

 

파일 내 오프셋 0바이트 위치에 DOS 헤더의 매직 넘버인 'MZ'를 가지는 455Ah 값을 볼 수 있다. 또한 NT 헤더의 오프셋을 가리키는 파일 내 오프셋 3Ch 바이트 위치(e_lfanew)에 Little Endian 형식의 100h 값을 볼 수 있다. 그리고 파일 내 오프셋 100h로 가면 NT 헤더의 시그니처인 'PE\x00\x00'을 볼 수 있다.

'Malware Analysis > PE' 카테고리의 다른 글

#6 PE - .reloc 섹션  (0) 2021.08.01
#5 PE - IAT  (0) 2021.08.01
#4 PE - Section Header  (0) 2021.08.01
#3 PE - Optional Header  (1) 2021.08.01
#2 PE - File Header  (0) 2021.08.01