Reverse engineering

PE 구조 - 1

LeeIkGyu 2022. 2. 12. 19:19

PE구조 개요 (Portble Executable)

Microsoft의 운영체제 Window 3.1부터 지원되는 실행파일의 구조를 말합니다. 다양한 운영체제에서의 이식성(대대적인 개정 없이도, 하나 이상의 운영체계에서 사용될 수 있는지의 여부를 나타내는 컴퓨터 프로그램의 특성)을 보여준다는 뜻에서 이식이 가능한 실행 형식(Portble Executable)이라는 이름을 붙였습니다.

 

PE 파일의

계열 확장자 명
실행 파일 계열 EXE, SCR(Screen Saver)
라이브러리 계열 DLL, OCX(Active X), CPL(Windows Control panel item), DRV(Device Driver)
드라이브 계열 SYS, VXD(Virtual Device Driver)
오브젝트 파일 계열 OBJ

 

세부 구조

DOS Header부터 Section Header까지 PE Header이며 밑에 Section들을 합쳐서 PE Body입니다.

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

 

NULL Padding

헤더의 끝 부분과 섹션별로 사이사이에 Null 값이 존재, 파일 또는 메모리에서 섹션의 시작 위치는 각각 최소 기본 단위의 배수에 해당하는 위치여야 하므로 빈 공간은Null로 채워버림 이를 Alignment라 부르며 여러 가지 내부 연산 등 처리상의 효율성을 위해 특정 단위로 간격을 맞추며 빈 공간은 Null로 채우는 것이다.

 

리틀 엔디언(Little Endian) 표기법

PE에서는 리틀 엔디언 표기법을 갖습니다.

Intel 계열 CPU에서 사용하는 표기법으로 낮은 주소부터 시작하여 하위 바이트를 기록하는 것입니다.

ex) 0x075BCD15(실제 값) -> 0x15CD5B07(리틀 엔디언)

 

Offset, VA, RVA

offset : 파일의 첫 바이트부터 거리

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

  ※ VA = RVA + ImageBase

RVA(Relative Virtual Addess) : 기준(ImageBase)으로부터 상대 주소

 

절대 주소와 상대 주소

PE헤더 내의 정보는 RVA형태로 된 것이 많음 PE파일(주로 DLL)이 프로세스 가상 메모리의 특정 위치에 로딩되는 순간 이미 그 위치에 다른 PE 파일이 로딩되어 있을 수 있음 이때 재배치(Relocation)를 통해서 비어있는 다른 자리에 로딩되어야 하는데 만약 PE헤더 정보들이 VA로 되어있다면 정상적인 액세스가 이루어지지 않는다.

현재 0x1~0x3, 0x7이 사용 중입니다 중간중간 비어있는 공간이 있습니다. 하지만 프로그램은 연속적으로 메모리를 사용해야 하기 때문에 빈 공간인0x4~0x6, 0x8~0x9를 사용하면 안 됩니다. 그래서 나온 개념이 가상 주소입니다. 프로그램은 가상 메모리인0x1~0x3, 0x4~0x5(가상)까지 접근하게 되고 운영체제는 알아서 물리적인 메모리인 0x4~0x6, 0x8~0x9를 찾아가서 값을 읽어오게 됩니다. 한마디로 물리적인 빈 공간을 가상 주소에 연결해서 가상주소에 접근하면 운영체제가 알아서 가상 주소와 연결된 물리 주소를 찾아가서 값을 읽어 옵니다. 가상 주소는 0x0~0xFFFFFFFF까지이며 프로그램은 4byte 메모리를 사용해야 합니다.