PE파일

1. PE 구조 개요

  • Portable Executable : 윈도우 운영체제에서 사용되는 실행 파일, DLL, object 코드, FON 폰트 파일 등을 위한 파일 형식
  • 윈도우 로더가 실행 가능한 코드를 관리하는데 필요한 정보를 캡슐화한 구조체

1) pe 파일 종류

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

2. PE 파일 구조

  • 전체적인 PE 파일 구조

1) 전반적인 구조

  • 다양한 정보들이 PE Header에 구조체 형식으로 저장
  • 위 그림처럼 Dos Header ~ Section Header를 PE Header
  • 그 이후를 PE Body 또는 Section이라 부름
  • 파일에서는 offset, 메모리에서는 Virtual Address로 위치를 표시

2) Offset / Virtual Address

  • Offset : 파일의 첫 바이트부터 거리
  • Virtual Address : 프로세스 가상 메모리의 절대 주소
  • RVA : 이미지가 해당 프로세스의 가상 주소 공간 내에 로드되었을 때에 그 시작주소에 대한 상대적 번지 개념/ 메모리 상에서 시작 주소에 대한 PE Offset

3) NULL Padding

  • PE 헤더 끝과 각 Section 사이사이에 NULL 값이 존재
  • 파일 또는 메모리에서 섹션의 시작위치는 각각 최소 기본 단위의 배수에 해당하는 위치여야하므로 남은 빈 공간을 NULL 채움
  •  

4) PE Header

(1) DOS Header

  • DOS 파일에 대한 하위 호환성을 고려하여 만들었으나 Win32에서 PE 파일 실행시 NT Header에 대한 offset이 저장되어 있어 해당 주소로 이동

(2) DOS Stub

  • DOS 환경에서 실행되는 코드를 가진 영역으로 DOS 환경에서 실행하지 못하는 프로그램 실행 시 “This program cannot be run in Dos mode” 라는 문자열 출력 후 종료

(3) NT Header

  • 파일 실행에 필요한 정보 저장
  • Signiture : NT Header의 제일 첫 번째 멤버
  • File Header : 파일의 계략적인 정보를 나타냄
  • Optional Header : 파일 실행에 필요한 주요 정보 저장

(4) Section Header

  • 각 Section의 Header가 존재하며 Section들의 메타데이터를 저장하고 메모리에 로드될 때 필요한 정보를 포함

5) Section

(1) 코드

  • .text : 프로그램을 실행하기 위한 코드를 담고 있는 섹션, 명령 포인터는 이 섹션 내에 존재하는 번지 값을 가짐

(2) 데이터

  • .data : 초기화된 전역 변수들을 담고 있는 읽고 쓰기가 가능한 섹션
  • .rdata : 읽기 전용 데이터 섹션으로 문자열 표현이나 C++/COM 가상함수 테이블 등이 배치되는 공간
  • .bss : 초기화되지 않은 전역 변수들을 위한 공간, 실제 PE 파일 내에서는 존재하나 가상 주소 공간 매핑 시 .data 섹션에 병합되어 표시

(3) 리소스

  • .rsrc : 다이얼로그, 아이콘, 커서 등의 윈도우 APP 리소스 관련 데이터들이 이 섹션에 배치

'Security > Reversing' 카테고리의 다른 글

PE File Format Advance  (1) 2023.07.08
Calling Convention (함수 호출 규약)  (0) 2023.07.06
스택프레임  (0) 2023.07.05
어셈블리어  (0) 2023.07.02
CPU 레지스터  (0) 2023.07.02