Hacking/Reversing / / 2016. 9. 26. 23:17

PE File Format - (1)

PE File이란?


PE파일이란 Portable Executable의 약자로써 현재 가장 많이 사용되고 있는 운영체제인 Windows에서 사용되는 실행 파일 형식 다. PE에는 파일을 실행시키기 위한 정보들이 기록되어 있는데, 파일실행을 시키면 PE에서 정보를 읽어와 바이너리를 메모리에 올리기 전에 데이터를 작업하는 과정을 거친다. 이 과정에서 PE가 손상이 되어있다면 파일이 실행되지 않기때문에 PE는 중요하다.


기존 PE는 32비트 형태의 실행파일만 의미하며 64비트 형태의 실행 파일은 PE+ 또는 PE32+ 라고 부른다.


PE File 의 종류


종류 

주요확장자 

실행 계열 

EXE, SCR 

드라이버 계열 

SYS, VXD 

라이브러리 계열 

DLL, OCX, CPL, DRV 

오브젝트 파일 계열 

OBJ 



정확히 말하면 OBJ를 제외한 모든 것은 실행이 가능한 파일이다. DLL, SYS같은 파일들은 쉘(exploer.exe)에선 실행 할 수 없지만, 디버거 같은 다른방법으로 실행 시킬 수 있기 때문이다.



PE File의 기본 구조

<그림 1. PE파일이 메모리에 로딩되는 모습>



Dos header부터 Section header까지 PE header라고 불리고 그 밑의 나머지 section들을 PE body 라고 부른다.


File에서는 offset으로 위치를 표현하고, Memory에서는 VA(Virtual Address, 절대주소)로 위치를 표현한다. 파일이 메모리에 로딩되면 Section의 위치, 크기 등이 달라지며 파일의 내용은 보통 코드(.text), 데이터(.data), 리소스(.rsrc) section에 나뉘어 저장된다.


*개발도구(VB/VC++/Delphi/etc)와 빌드옵션에 따라 section의 이름, 크기, 개수, 저장 내용 등은 달라지고 각 용도별로 여러 section이 나뉘어 저장된다.


그리고 또, Section header를 보면 각 section에 대한 파일/메모리에서의 크기, 위치, 속성 등이 정의 되어있다.


<그림 1>을 보면 PE header의 끝 부분과 각 Section의 끝엔 Null padding이라는 영역이 존재한다. 이 부분은 컴퓨터에서 파일, 메모리, 네트워크 패킷 등을 처리할 때 효율을 높이기 위해 최소 기본단위 개념을 사용하는 것과 마찬가지로 PE File에서도 똑같은 개념을 적용한 것이다. 파일/메모리에서 section의 시작 위치는 각 파일/메모리의 최소 기본 단위의 배수에 해당하는 위치여야 하고, 빈 공간은 Null로 채워버린다.(<그림 1>을 참조하면 각 section의 시작 주소가 어떠한 규칙에 의해 끊어져서 시작된 다는걸 느낄 수 있다.) 



VA & RVA


VA(Virtual Address)는 프로세스 가상 메모리의 절대주소를 말하며, RVA(Rela-tive Virtual Address)는 어느 기준 위치(ImageBase)에서부터의 상대주소를 말한다. 


RVA + ImageBase = VA


VA와 RVA의 관계식이다.



PE header 내의 정보는 RVA형태가 대부분이다. 왜냐하면 PE file이 프로세스 가상 메모리의 특정 위치에 로딩되는 순간 이미 그 위치에 다른 PE가 로딩되어 있을 수 있는데, 그땐 재배치(Relocation)을 통해 비어 있는 다른 위치에 로딩 되어야 한다. 하지만 만약 PE header정보들이 VA로 되어있다면 정상적인 엑세스가 이루어지지 않을 것이다.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유