PE 포맷(Portable Executable)은 윈도우 운영 체제에서 사용되는 실행 파일, DLL, object 코드, FON 폰트 파일등을 위한 파일 형식이다. PE 포맷은 윈도우 로더가 실행 가능한 코드를 관리하는데 필요한 정보를 캡슐화한 데이터 구조체이다. -위키백과-

 

다시 말하자면 PE파일이란 윈도우 운영체제에서 우리가 만든 파일이 다른 윈도우 운영체제의 PC로 옮겨(Portable)져도 실행(Executable)되도록 만들어 놓은 파일을 말합니다.

 

파일 확장자의 종류로는 다음이 있습니다.

.acm, .ax, .cpl, .dll, .drv, .efi, .exe,  .mui, .ocx, .scr, .sys, .tsp

 

PE 파일의 구조


PE파일의 구조-출처:https://rednooby.tistory.com/33

  • DOS header 부터 Section header 까지를 PE Header, 그 밑의 Section 들을 합쳐서 PE Body라고 합니다.

  • 파일에서는 offset으로, 메모리에서는 VA(Virtual Address) 로 위치를 표현합니다.

  • 파일이 메모리에 로딩되면 모양이 달라집니다(Section의 크기, 위치 등)

  • Section header에 각 Section에 대한 파일/메모리에서의 크기, 위치, 속성 등이 정의되어 있습니다.

  • PE header의 끝부분과 각 Section의 끝부분에 있는 NULL padding이라는 영역이 있습니다.
    컴퓨터에서 파일, 메모리, 네트워크 패킷 등을 처리할 때 효율을 높이기 위해 최소기본단위를 사용하는데, PE파일에서도 이러한 개념이 적용된 것입니다.

  • 파일/메모리에서 섹션의 시작위치는 각 파일/메모리의 최소기본단위의 배수에 해당하는 위치여야하고, 빈 공간은 NULL로 채웁니다.

VA와 RVA


VA(Virtual Address) : 가상메모리상의 절대주소

RVA(Relative Virtual Address) : 기준위치(Imagebase)에서부터의 상대주소

 

RVA와 VA의 관계식은 다음과 같습니다.

RVA + Imagebase = VA

 

왜 RVA를 써야할까?

PE파일(주로 DLL)이 프로세스 가상 메모리의 특정 위치에 로딩되는 순간

이미 그 위치에 다른 PE 파일(DLL)이 로딩되어있을 수 있습니다.

 

그럴때 재배치(Relocation) 과정을 통해서 비어 있는 다른 위치에 로딩되어야 하는데,

만약 PE header 정보들이 VA로 되어있다면 정상적인 엑세스가 이루어지지 않을것입니다.

 

PE Header


PE파일의 각 부분에 대한 설명은 너무나도 길어지기에 PE에 대해 정말 잘 정리해주신 분의 블로그를 발견하여 링크올려드립니다.

아래 그림과 함께 읽어보시면 더욱 이해가 잘 될거라고 생각합니다.

DOS Header & DOS Stub

https://reversecore.com/19

 

NT header(IMAGE_FILE_HEADER & IMAGE_OPTIONAL_HEADER32)

아래 그림중 signature~NumberOfRvaAndSizes 부분

https://reversecore.com/20

https://reversecore.com/21

 

Section Header

아래 그림중 Section Table 영역

https://reversecore.com/22

 

IAT(Import Address Table) & EAT(Export Address Table)

https://reversecore.com/23

https://reversecore.com/24

PE Header 32bit Structure-출처:https://commons.wikimedia.org/wiki/File:Portable_Executable_32_bit_Structure.png

 

+ Recent posts