리버스 엔지니어링

PE 재배치 -1

evans 2018. 5. 14. 14:17

Base Relocation Table

PE 파일의 재배치(Relocation)과정에 사용되는 Base Relocation Table 구조와 동작원리에 대해 알아보자.

1. PE 재배치

PE 파일(EXE/DLL/SYS)이 프로세스 가상 메모리에 로딩(Loading)될 때 PE 헤더의 ImageBase 주소에 로딩된다. DLL(SYS)파일의 경우 ImageBase위치에 이미 다른 DLL(SYS) 파일이 로딩되어 있다면 다른 비어있는 주소 공간에 로딩이 된다. 이것을 PE파일 재배치라고 한다. 즉 PE파일 재배치란 PE파일이 ImageBase에 로딩되지 못하고 다린 주소에 로딩될 때 수행하는 일련의 작업들을 의미한다.

참고 SDK(Soft Development Kit)또는 visual C++로 PE 파일을 생성하면 기본적으로 EXE의 경우 ImageBase = 00400000, DLL 경우는 ImageBase =1000000으로 설정된다. 또한 DDK(Driver Development Kit)로 생성된 SYS 파일은 기본적으로 ImageBase = 10000으로 설정된다.

1.1 DLL/SYS



그림을 보면 TEST.EXE 프로세스에 A.DLL이 10000000 주소에 로딩되어 있다. 이후 B.DLL이 같이 주소(10000000)에 로딩을 시도하면 PE 로더는 비어있는 주소(3C000000)에 B.DLL을 로딩 시긴다.

1.2 EXE

프로세스가 생성될 때 EXE파일이 가장 먼저 메모리에 로딩되기 때문에 EXE에서    는 재배치를 고려할 필요가 없다. 그러나 Windows Vista 이후 보안을 강화하기 위해 ASLR(Address Space Layout Randomization)기능이 추가되었다.이것은 EXE파일이 실행될 떄마다 랜덤한 주소로 로딩된다.


2. PE 재배치 살생시 수행되는 작업

notepad.exe 프로그램으로 PE 재배치를 확인해보자.

 

그림과 같이 notepade의 Image Base는 01000000이다.

 



그림은 notepad.exe의 EP 코드 부분입니다. 현재 ASLR 기능에 의해서 로딩된 상태이다. 여기서 Ollybdg에서 재실행을 할때마다 주소 로딩주소가 매번 변경된다. 이렇게 하드코딩된 메모리 주소를 현재 로딩된 주소에 맞게 변경해주는 작업이 PE 재배치이다.
 ImageBase 주소에 로딩되지 않은 경우에 이 PE 재배치 작업이 없다면 프로그램은 정상적으로 실행 될 수 없다.('잘못된 메모리 주소 참조 에러''에 의해서 비정상 종료가된다.)