[리버싱핵심원리] PE File Format(1)

흑흑코더·2023년 4월 5일
0

시스템

목록 보기
9/22

Windows 운영체제의 PE(Portable Executable) File Format에 대해
🤓 책 '리버싱 핵심원리'를 읽고 공부한 내용을 정리한 글입니다.

PE File이란?

: PE(Portable Executable), Windows 운영체제에서 사용되는 실행 파일 형식

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

=> OBJ(오브젝트)파일을 제외한 모든 것은 실행 가능한 파일
(디버거, 서비스 기타 등등의 방법을 통해)


notepad.exe파일을 헥스 에디터를 이용해 열어보면 PE파일의 헤더 확인 가능
=> 실행되기 위해 필요한 정보 적혀있음
즉, PE File Format 공부 = PE 헤더 구조체 공부

기본 구조

  • PE Header : DOS header ~ Section header
  • RE Body : 그 밑의 Section들
  • 메모리에 로딩 시 파일의 모양이 달라짐
  • 파일/메모리에서 섹션의 시작 위치는 최소 기본 단위의 배수, 빈공간을 NULL로 채움

VA&RVA

VA : Virtual Address 프로세스 가상 메모리의 절대주소
RVA : Relative Virtual Address 기준 위치(ImageBase)부터의 상대주소
=> RVA로 되어 있는 경우가 많음
Relocation이 발생해도 기준위치에 대한 상대 주소 변경이 없기 때문

PE 헤더

DOS Header

  • DOS EXE Header 확장시킨 IMAGE_DOS_HEADER구조체
  • PE header의 제일 앞부분에 존재
  • e_magic : DOS signature
  • e_lfanew : NT header의 옵셋을 표시 (파일에 따라 가변적)

    모든 PE파일은 시작 부분에 DOS signature ("MZ")가 존재하고 e_lfanew값이 가리키는 위치에 NT Header 구조체가 존재해야함.
    => 이 값들이 변경되면 정상 실행 되지 않음

DOS Stub

: DOS Header 밑에 존재

  • 존재 여부는 옵션
  • 크기 일정X
  • 코드 + 데이터


ㄴ 16비트 어셈블리 명령어
-> Windows OS에서는 실행X
-> DOS 환경에서 실행하면 가능

NT Header

Signatiure

"PE"00 값을 가짐

File Header

파일의 개략적인 속성을 나타내는 구조체

  • Machine
    CPU별로 고유한 값
  • NumberOfSections
    PE파일은 코드, 데이터 등이 각각의 세션에 나뉘어 저장, 그 섹션의 개수
    반드시 0보다 커야함
    -> 정의와 실제 섹션 수가 다르면 실행에러 발생
  • SizeOfOptionalHeader
    이 값을 보고 OptionalHeader 구조체의 크기를 인식
  • Characterisitcs
    파일의 속성을 나타내는 값
    실행 가능한지, DLL파일인지 등등 bit OR형식으로 조합됨

=> 이 4가지의 값들이 정확히 세팅되어 있지 않으면 정상적 실행 불가

Optional Header

: PE 헤더 구조체 중 가장 거대한 IMAGE_OPTIONAL_HEADER(32)

파일 실행에 필수적 값들
Magic32구조체 - 10B / 64구조체 20B
AddressOfEntryPointEP(Entry Point)의 RVA 값, 매우 중요
ImageBasePE파일이 로딩되는 시작 주소
SectionAlignment, FileAlignment메모리/파일에서 섹션의 최소단위 => 파일/메모리의 섹션 크기는 Alignment의 배수가 되어야 함
SizeOflmage가상 메모리에서 PEImage가 차지하는 크기(파일크기 =/= 메모리에 로딩된 크기
SizeOfHeaderPE헤더의 전체크기 (FileAlignment의 배수)
Subsystem
NumberOfRvaAndSizesDataDirectory 배열의 개수를 나타냄
DataDirectoryIMAGE_DATA_DIRECTORY 구조체의 배열, 각 항목마다 정의된 값을 가짐

섹션 헤더

: PE파일은 code data resource등을 각각의 섹션을로 나누어 저장, 섹션 헤더는 각 섹션의 속성을 정의

RVA to RAW

PE 파일이 메모리에 로딩되었을 때, 각 섹션에서 메모리의 주소와 파일 옵셋을 매핑하는 것
1. RVA가 속해있는 섹션 찾기
2. 비레씩을 사용해 파일 옵셋(RAW)계산

PAW - PointerToRawData = RVA - VirtualAddress
RQW = RVA - VirtualAddress + PointerToRawData
profile
공부합시다

0개의 댓글