[리버싱 핵심원리] PE File Format 구조와 개념

jammy0903·2024년 8월 16일

study

목록 보기
1/10

📜PE 파일이란?

PE(Portable Executable)는 Windows 운영 체제에서 사용되는 실행 파일 형식입니다. Unix의 COFF(Common Object File Format)를 기반으로 하고 있습니다.

PE 파일의 종류

계열파일 확장자
실행 계열EXE, SCR
드라이버 계열SYS, VXD
라이브러리 계열DLL, OCX, CPL, DRV
오브젝트 계열OBJ

실행 계열:

  • exe: 가장 일반적인 실행 파일입니다.
  • scr: 스크린 세이버 파일입니다.

드라이버 계열:

  • sys: 시스템 파일로, 하드웨어와 운영체제 간의 통신을 담당하는 드라이버 파일입니다.
  • vxd: 가상 장치 드라이버 파일입니다.

라이브러리 계열:

  • dll: 동적 링크 라이브러리 파일입니다.
  • ocx: ActiveX 컨트롤 파일입니다.
  • cpl: 제어판 파일입니다.
  • drv: 구형 드라이버 파일입니다.

오브젝트 계열:

  • obj: 오브젝트 파일입니다. 실행 불가능한 유일한 파일 형식 입니다.

PE 파일의 기본 구조🏛️

PE 파일은 크게 PE 헤더바디(섹션)로 구성됩니다.

  1. PE 헤더 (PE Header)
  2. 섹션 (Sections)

🧩PE 헤더 (PE Header)

PE 헤더는 파일의 메타데이터포함하고 있으며, 다음과 같은 많은 구조체를 가집니다:

📊 PE 헤더의 주요 구성 요소

  1. DOS 헤더

    • 역할: DOS 호환성 제공
    • 특징: "MZ" 시그니처로 시작
  2. DOS Stub

    • 역할: DOS 모드 실행 시 메시지 표시
    • 특징: 선택적 요소, 크기 가변적
  3. NT 헤더

    • 역할: PE 파일의 핵심 정보 포함
    • 구성:
      • File Header: 파일 기본 정보
      • Optional Header: 상세 정보 및 데이터 디렉토리

🔍 PE 헤더의 중요성

  • 운영 체제가 프로그램을 어떻게 메모리에 로드하고 실행할지 결정
  • 프로그램의 리소스, 임포트/익스포트 함수 정보 제공
  • 보안 및 호환성 정보 포함

📈 PE 헤더 구조 도식화

PE 파일
│
├─ DOS 헤더 ("MZ")
│
├─ DOS Stub
│
└─ NT 헤더
   ├─ File Header
   └─ Optional Header
      └─ Data Directories

PE 헤더는 프로그램의 "설계도"와 같아서, 이를 통해 Windows가 프로그램을 올바르게 실행할 수 있습니다.

< 섹션 (Sections) >

섹션은 실제 데이터를 포함하는 파일의 본문 부분입니다. 주요 섹션은 다음과 같습니다:

  • .text: 실행 가능한 코드
  • .data: 초기화된 데이터
  • .rdata: 읽기 전용 데이터
  • .bss: 초기화되지 않은 데이터
  • .rsrc: 리소스 데이터

🚀 파일과 메모리의 차이 🚀

PE 파일은 디스크에 저장될 때와 메모리에 로드될 때 구조가 다릅니다:

  • 파일에서의 위치: Offset
    파일에서는 각 요소의 위치를 파일의 시작부터의 오프셋으로 표현합니다.

  • 메모리에서의 위치: Virtual Address (VA)
    메모리에 로드된 후에는 각 요소의 위치를 가상 주소로 표현합니다.

    File on Disk:
    [PE Header] [.text] [.data] [.rdata] ...


    Memory Image:
    [PE Header] [.text] [...] [.data] [...] [.rdata] ...

메모리에 로드될 때, 섹션들은 재배치되며 각 섹션 사이에 여유 공간이 생길 수 있습니다.


주요 개념

  1. RVA (Relative Virtual Address): 이미지 베이스 주소로부터의 상대적 오프셋
  2. VA (Virtual Address): 실제 메모리 주소 (VA = ImageBase + RVA)
  3. ImageBase: PE 파일이 메모리에 로드될 때의 기본 주소

섹션 정렬

PE 파일의 각 섹션은 특정 단위로 정렬됩니다:

  • 파일 정렬 (File Alignment): 디스크 상에서의 섹션 정렬 단위
  • 메모리 정렬 (Section Alignment): 메모리 상에서의 섹션 정렬 단위

    Section on Disk: [...Data...][Padding]
    Section in Memory: [...Data...][Padding][................]

PE 헤더의 끝과 각 섹션의 끝에 null padding 영역이 있습니다.
이는 최소 기본 단위를 채우기 위함입니다.

VA(Virtual Address)와 RVA(Relative Virtual Address)에 대한 자세한 내용은 이곳을 참조하세요. ()


PE 헤더 구조

1. DOS 헤더
2. DOS Stub
3. NT 헤더
4. NT 헤더 - File header
5. NT 헤더 - Optional header
6. 섹션 헤더

각 헤더의 세부 내용은 다음 포스팅에서 자세히 다루도록 하겠습니다.

0개의 댓글