본문 바로가기

High Level Technique/Reversing

PE 재배치 (PE Relocation)

PE Relocation


PE파일인 exe, dll, sys 는 메모리에 로딩 될 때 ImageBase 주소에 로딩됩니다. 하지만 해당 주소에 이미 다른 파일이 로딩 되어있다면 어떻게 해야 할까요??


앞서 IAT를 공부하면서 말했지만 다른 주소로 이동됩니다. 이렇게 다른 주소로 이동되는 것을 Relocation이라고 합니다.


좀 더 자세히 알아보도록 하겠습니다.



DLL / SYS Relocation



메모리에 A.DLL 파일이 ImageBase에 맞게 100000000에 로딩되어 있습니다. 그러던 중 어떤 프로그램이 B.DLL이 로딩되려고 하는데 마찬가지로 ImageBase가 100000000 이여서

해당 주소에 로딩 할려고 합니다. 그런데 이미 A.DLL이 먼저 로딩되어 있어서 B.DLL은 다른 주소를 찾아 로딩하게 됩니다.




EXE Relocation


프로세스가 생성 될 때 EXE 파일은 메모리에 먼저 로딩 되기 때문에 재배치를 생각할 필요가 없었습니다. 하지만 Windows의 버전이 달라지면서 (XP SP3) ASLR이라는 기능이

추가 되었습니다.



* ASLR (Address Space Layout Randomization)

메모리에 로딩 될 때 ImageBase 값을 랜덤하게 바꾸는 것. 프로세스의 Stack, Heap의 시작 주소 또한 실행 될 때 랜덤하게 변경.



프로그램을 실행시켜서 OllyDBG로 ImageBase를 확인해 보면 주소가 달라지는 것을 알 수 있습니다.


※ kernel32, user32 등은 자신만의 고유 ImageBase에 로딩 되기 때문에 실제로 시스템 DLL 사이에는 재배치가 일어나지 않습니다.





PEView로 notepad의 ImageBase를 확인해본 결과 400000으로 되어있습니다. OllyDBG로 해당 notepad를 열어서 확인해 보도록 하겠습니다.





OllyDBG로 해당 notepad의 ImageBase가 10D0000으로 되어있습니다. PEView에서 확인 했던 것과 다른 결과가 나타납니다.




위 사진처럼 빨간 박스안의 하드코딩된 주소들은 notepad가 매번 실행 될때마다 바뀌게 됩니다.

ASLR 기능에 의해 주소만 바뀐다면 실행도중 오류가 발생하고 종료하게 됩니다. 따라서 하드코딩된 주소들도 바꿔주게 됩니다.






Base Relocation Table


Base Relocation Table은 IMAGE_NT_HEADER.IMAGE_OPTIONAL_HEADER.IMAGE_DATA_DIRECTORY[5]에 존재합니다.







36000부터 시작 한다는 것을 알 수 있습니다.










IMAGE_BASE_RELOCATION



VirtualAddress는 기준이 되는 주소를 말합니다. RVA 값입니다. SizeOfBlock은 각 단위 블록의 크기를 말합니다.

TypeOffset은 IMAGE_BASE_RELOCATION 구조체 밑으로 WORD 타입의 배열이 따라 온다는 뜻입니다.



따라서 Windows10 32bit notepad는 VirtualAddress는 1000, SizeOfBlock은 CC가 됩니다.


그리고 TypeOffset의 값이 3004라고 한다면 앞의 3은 Type을 나타내고 뒤 0004는 Offset을 나타냅니다.


기본적으로 PE 파일은 Type이 3이며 64bit는 A를 갖고 있습니다.



예를 들어 TypeOffset의 값이 3168이라고 한다면 VirtualAddress (1000) + Offset (168) = 1168 (RVA)가 됩니다.


앞서 notepad의 ImageBase가 10D0000 였기 때문에 10D1168이 됩니다.



해당 위치를 찾아가 보면 10E5460으로 하드코딩된 주소를 확인 할 수 있습니다.




실습


* RVA값 찾아가기


PEView로 앞서 찾았던 RVA 값 1168을 찾아갑니다.



1168의 값은 41 54 60 입니다. 










* ImageBase 만큼 빼기

ImageBase는 400000 였음을 확인 했었습니다. 415460 - 400000 = 15460이 됩니다.








* 실제 ImageBase 더하기

notepad가 실제 로딩된 ImageBase 값은 10D0000 이였습니다. 이 값에 15460을 더하면 10E5460이 됩니다.




이렇게 해당 위치에 하드코딩 된 것을 볼 수 있습니다.

'High Level Technique > Reversing' 카테고리의 다른 글

Windows Massage Hooking  (0) 2015.12.29
.reloc section 제거  (1) 2015.12.21
EAT (Export Address Table)  (0) 2015.12.21
IAT (Import Address Table)  (0) 2015.12.18
IMAGE_SECTION_HEADER  (0) 2015.07.09