보안

PE 파일의 구조

벌게진눈 2013. 9. 5. 22:36
반응형

EXE파일과 관련 DLL파일들이 메모리 상에 로드되면서 비로소 프로그램이라는 것이 사용 가능하게 되고 이렇게 로드된 하나의 EXE와 여러개의 관련 DLL들의 소위 운영체제론에서 이야기하는 하나의 프로세스를 구성하게된다.

EXE파일을 로드하는 역할을 담당하는 것이 Win32운영체제의 서브시스템으로 존재하는 프로그램 로더이고 EXE의 파일 구조는 이 로더가 식별할 수 잇는 방식으로 구성된다. EXE와 DLL은 같은 파일 구조를 지니며 마이크로소프트에서는 이러한 파일구조를 PE파일 포맷이라고 명명했다.

PE구조로된 PE파일( Portable Executable)들은 플랫폼에 관계없이 Win32운영체제가 들어가는 시스템이면 어디서든 실행 가능하다. Win32 Platform SDK의 "WinNT.H"헤더 파일 내의 PE관련 구조체들은 파일이라는 명칭 대신 이미지라는 명칭을 사용한다. PE파일은 하드디스크에 파일로 존재하지만 그것이 실행되기 위해 메모리로 로드될 때 일반 데이터 파일이 메모리에 로드되는 방식과는 전혀 다른 방식으로 로드된다.  프로세서에 할당되는 4기가 바이트의 가상 주소 공간을 유지하기 위해 가상 메모리 관리자는 페이지 파일이라는 스와핑 영역을 하드디스크에 유지하며 이 페이지 파일과의 적절한 스와핑, 매핑을 통해 프로세스에게 4기가의 가상 공간을 실제로 제공해 주는 것처럼 실행 환경을 만들어 주게 된다. 하지만 PE파일이 로드될 때 VMM은 페이지 파일을 사용하지 않고, PE파일 자체를 마치 페이지 파일처럼 가상주소공간에 그대로 매핑하게 된다. 이렇게 파일 자체가 페이지 파일의 역할을 대신하는 경우를 메모리에 매핑된 파일이라고 하며 PE의 경우 MFF로 해당파일을 연다고 볼 수 있다. 앞서말한 이미지란 메모리에 매핑된 하드디스크 상의 PE파일 자체인것이다.


PE파일 포맷을 분석하는데 필요한 개념들

RVA(Relative Virtual Address)

해당 프로세스의 가상 주소 공간 내에 로드되었을 때의 그 시작 주소에 대한 상대적 번지 개념으로 메모리 상에서의 PE의 시작주소에 대한 오프셋으로 생각하면 된다. 

실제 주소 번지(가상 주소) = 이미지 로드 시작 번지 +RVA

이미지 로드 시작 번지는 IMAGE_OPTIONAL_HEADER구조체의 ImageBase필드에 저장되어있다. 


섹션

PE가 가상주소 공간에 로드된 뒤의 실제 내용을 담고 있는 블록들이다.

.text    프로그램을 실행하기 위한 코드를 담고 있는 섹션이다. CPU 레지스터의 명령 포인터인 ip는 이 섹션 내에 존재하는 번지 값을 담게 된다. 

.data    초기화된 전역변수들을 담고 있는 읽고 쓰기 가능한 섹션이다.

.rdata    읽기 전용 데이터 섹션으로 문자열 표현이나 C++/COM 가상 함수 테이블 등이 .rdata에 배치되는 항목 중의 하나이다.

.bss    초기화되지 않은 전역 변수들을 위한 섹션이다. 실제 PE파일 내에서는 존재하지만 가상 주소 공간에 매핑 될 때에는 보통 data섹션에 병합되기 때문에 메모리 상에서는 따로 존재하지 않는다.

idata    임포트할 DLL과 그 API들에 대한 정보를 담고 잇는 섹션이다. 대표적으로 이 섹션 내에 IAT이 존재한다. 하지만 이 섹션은 .rdata에 병합하는 경우가 요즘 추세이다.

.didat    지연로딩 임포트 데이터를 위한 섹션이다. 지연로딩은 DLL로딩의 한 방식으로 암시적인 방식과 명시적인 방식의 혼합이다. 보통 릴리즈모드로 링크될 때 이 섹션 역시 다른 섹션에 병합된다.

.edata     익스포트할 API에 대한 정보를 담고 있는 섹션이다. 보통 API나 변수를 익스포트 할 수 있는 경우는 DLL이기 때문에 DLL PE에 이 섹션이 존재한다. 

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

.reloc    실행 파일에 대한 기본 재배치 정보를 담고 잇는 섹션이다. 재배치란 PE이미지를 원하는 기본 주소에 로드하지 못하고 다른 주소에 로드했을 경우 코드 상에서의 관련주소참조에 대한 정보를 갱신해야 하는 경우를 말한다. 이러한 재배치는 EXE에서는 할 필요가 없기 때문에 DLL파일에서 볼 수 있다.

.tls        __declspec 지시어와 함께 선언되는 스레드 지역 저장소를 위한 섹션이다. 이 섹션에는 런타임이 필요로 하는 부가적인 변수나 __declspec지시어에 의한 데이터의 초기 값을 포함한다.

.crt        C++런타임을 지원하기 위해 추가된 섹션이다. 좋은 예는 정적 C++객체의 생성자와 소멸자를 호출하는데 이용되는 함수 포인터

그밖에 .sdata, .srdata .pdata .debug$S .debug$T .debug$P .drectve 가 있다


VAS(Virtual Address Space 가상 주소 공간)와의 관계

파일로 존재하는 PE구조와 이것이 가상번지에 로드되었을 때의 PE구조에 대한 관계이다. 이 공간을 RAM 이나  하드디스크의 PageFile.sys에 연결시켜주는 것이 가상메모리 관리자이며 VMM은 페이징마일과 RAM그리고 VAS를 관리하면서 프로세스에게는 마치 자기 혼자서 4G의 선형 주소공간을 가진 것처럼 착각하게 만든다.  

프로세스에 속한 특정 스레드가 가상 주소 공간 내의 특정 번지를 액세스 할 때 VMM은 해당 번지의 페이지를 페이징 파일과 매핑시켜준다. 따라서 해당 가상 주소 공간에 무엇을 읽거나 쓰는 행위는 결국 해당 페이징 파일의 특정 페이지에 동일한 행위를 하는 것이 된다.

가상메모리

http://cappleblog.co.kr/247

반응형

'보안' 카테고리의 다른 글

PE 파일 자료들  (0) 2013.08.30
CodeEngn Basic02 공부  (0) 2013.08.29
CodeEngn Basic01 풀이  (0) 2013.08.29
8/29일 다시 시작  (0) 2013.08.29
ebp와 esp 레지스터  (2) 2013.08.28