본문 바로가기
Study/악성코드

[윈도우즈 보안과 악성코드 기초] PE 파일 구조

by 8희 2024. 3. 30.

PE(Portable Excutable) 파일

PE 파일이란?

  • Win32 기본 파일 형식
  • exe, scr, sys, dll, ocx 등
  • Process : EXE +DLL
  • 실행 과정
    • PE 파일 실행
      • dll은 더블 클릭해도 실행되지 않음! dll은 exe가 call 해야 실행이 됨
    • PE 헤더 정보를 메모리에 매핑
      • 실제 프로세스를 위한 메모리 할당
      • 섹션 정보를 메모리에 복사
      • Import 정보 처리
      • 기준 재배치 처리
    • 실제 프로그램 코드로 분기
    • https://learn.microsoft.com/ko-kr/windows/win32/debug/pe-format

 

notepad.exe(win7) 구조

 

  • notepad.exe -> 보통  C:\Windows\System32에 있음
  • PEview를 통해 notepad.exe의 구조를 분석할 거임

 

  • 빨간 사각형으로 표시한 부분을 통해 PE 파일임을 알 수 있음

  • PE 파일의 실행 영역은 .text 부분
  • 실행 시 메모리의 특정 영역에 할당 등 동적인 행동을 하기 때문에 실행 후에 padding 영역이 증가
  • file 상태로 있을 때는 내용이 차곡차곡 있는 게 좋음
    • 그래야 사이즈도 크지 않고, 내용 정의도 쉽게 가능
  • memory 상으로 올라가게 되면 추후 address를 매핑하게 되면서 각각의 주소에 접근
    • text, data, rsrc 영역을 확인하면 address가 깔끔하게 떨어진 주소가 됨
      • 이를 통해 조금 더 편리하게 매핑 가능
  • offset과 address의 차이: RVA, VA
    • RVA(Relative Virtual Address)
      • 가상 메모리 상대 주소
      • PE 파일(DLL)이 메모리 상의 어떤 위치에 올라갈지 알 수 없음
      • 기준점을 놓고 그 곳으로부터 위치를 계산함
      • 기준점이 바뀌더라도 정보 접근이 가능하도록 함
    • VA(Virtual Address)
      • 가상 메모리 주소
      • VA= ImageBase(대부분 40000000)+ RVA

 

notepad.exe(win7) 구조 - IMAGE_DOS_HEADER

 

  • 5A4D, Signature 
    • 맨 처음엔 리틀 엔디안 표기법 사용으로 4D 5A로 표시
      • 4D 5A를 아스키 코드로 읽으면 MZ
    • MZ는 DOS의 SIGNATURE를 의미
      • 보통 윈도우 시스템이라는 뜻 
  • 이외에도 IMAGE_DOS_HEADER에서 다양한 정보가 확인 가능

 

IMAGE_DOS_HEADER의 헤더 파일 - winnt.h

  • 헤더 파일에 중요한 정보가 저장됨
  • winnt.h: 윈도우 헤더

  • e_magic
    • 어떤 구조인지 알려주는 부분
    • WORD로 두 칸이고, 4D 5A(MZ)는 PE 파일의 구조를 나타내는 시그니처
    • 4D 5A(MZ) : PE 파일 구조
    • D0 CF 11 E0(OLE), 50 4B(ZIP), 25 50 44 46(PDF),
    • 89 50 4E 47(PNG)
  • e_lfanew
    • 실제 파일이 어디서 시작하는지 알려주는 부분
    • 000000E8: IMAGE_NT_HEADER 시작 주소
    • 중요! 헤더의 시작 주소
  • PE 파일을 인증하는 두 가지 요소: 헤더가 MZ, 실제 e_lfanew가 PE

 

DOS Stub Code

  • This program cannot be run in DOS mode
    • 이 파일이 윈도우에서 실행되는 파일임을 알려줌
  • 실행하지 않아도 정적 분석을 통해 윈도우에서 실행되는지 DOS에서 실행되는지 알 수 있음

 

NT_Header

  • signature: 4byte 공간 PE 구조 파일 명시

  • File_Header
    • Machine(CPU): 0x8664 – AMD64 CPU 호환 (0x014c - IntelCPU)
    • Number of Sections
      • 섹션의 개수: 0x0006
    • Time Data: 0x4A5BC9B3 → 1247529395
      • /60=20792156분 35초, /60=346535시간 56분, /24=14438일 23시, /365=39년 203일
      • 1970년 1월 1월 0시+39년 203일 23시 35초= 2009년 7월 13일 23시 56분 35초
      • 파일 컴파일 일자를 의미함, 초만 계산 후 역산해서 연월일 출력
    • Pointer To Symbol Table, Number of Symbols
    • Size Of Optional Header: 0xE0(32bit), 0xF0(64bit), 0x00(obj)
    • Characteristics: 파일 형식 정보, OR 연산

 

Optional_Header

  • Magic
    • 실행하는 PE 파일의 구조체가 32bit(0x10B)인지, 64bit(0x20B)인지 알려주는 부분
  • Address of entry point
    • 프로그램 시작되는 코드의 주소
    • RVA 값으로 저장
    • OllyDbg에서 처음 실행되는 주소 (악성코드 시작 지점으로 지정할 수 있음)

 

Section_Header

Section_Header의 종류

 

Section_Header의 주요 내용