[PE파일] 특정 PE파일로부터 Export Table 주소를 구해보자.
Security/System Hacking

[PE파일] 특정 PE파일로부터 Export Table 주소를 구해보자.

 windows 7 32bit 환경에서 진행하였습니다.


간단한 어셈블리 프로그램으로~

특정 PE 파일로부터 Export Table 주소를 구해봅시다.  Export Table 주소를 구하고, 더 나아가서 Export 하는 함수들의 주소까지 구해볼수 있겠죠. 


kernel32.dll 를 이용해봅시다. 


PEView를 이용하면 쉽겠지만 동적으로 Export Table 내의 함수들의 주소를 받아오기 위해서 간단한 어셈블리 프로그램을 짜보도록 하겠습니다. 

먼저 kernel32.dll 의 base 주소를 알아야겠죠? 

mov eax, fs:[eax+0x30] // PEB 의 주소 FS = TEB을 가리키고있음 mov eax, [eax+0xc0] // PEB_LDR_DATA mov eax, [eax+0x14] // .exe InMemoryModuleList (첫번째) mov ebx, [eax] // ntdll.dll InMemoryModuleList (두번째) mov ebx, [ebx] // kernel32.dll InMemoryModuleList (세번째) mov ebx, [ebx+0x10] // InMemoryModuleList + 0x10 자리에 dll base 주소가 있습니다.


InMemoryModuleList 들은 각각 서로를 가리키고 있습니다. 더블링크드 형태로요. 3번째에 kernel32.dll 이 있습니다.

자 kernel32.dll 의 base 주소를 ebx에 저장했습니다.


이제 kernel32.dll 의 PE 구조를 들여다 봐야겠죠? PE 구조는 대충 아실거라 믿어요. PEView를 함께보시면 편해요. 

PE 파일들은 크게 DOS Header, NT Header, Section Header로 이루어져있습니다. 우리가 원하는 Export Table 주소는 _IMAGE_NT_HEADER 안에 _IMAGE_OPTIONAL_HEADER 속에있는 _IMAGE_DATA_DIRECTIORY 안에 있답니다. 복잡하죠? 


한번 하나하나 찾아 가봅시다. 

먼저 kernel32.dll base 주소로부터 NT header 까지의 거리(offset)은 0xF0 입니다. Dos header 크기가 0xF0란 의미랑 같습니다.



다음은 NT header로 부터  _IMAGE_OPTIONAL_HEADER 속에있는 _IMAGE_DATA_DIRECTIORY 까지 가야겠죠? Export table까지 한번에 가봅시다.

NT Header 의 Signature 구조체의 크기는 4바이트입니다. 그리고 IMAGE_FILE_HEADER 의 크기는 14 바이트구요 (PEView로 쉽게 알수있습니다)

IMAGE_OPTIONAL_HEADER(0x108)에서 _IMAGE_DATA_DIRECTIORY 속의 EXPORT Table(0x168) 까지는 168-108 = 60바이트 입니다. 

PE헤더 각각의 구조체의 크기도 알았겠다 프로그램을 짜봅시다.

mov edi, [ebx+0x3c] // PE header , ebx = kernel32.dll base 주소 // [ebx+0x3c] 에 DOS Header 마지막 멤버인 e_Ifanew 의 값이 들어있습니다 여기선 0xF0 입니다. add edi, ebx // ASCII "PE" base+0xf0 // base에 0xf0를 더하면 NT Header 시작 offset 주소가 되죠. mov edi, [edi+0x78] // EXPORT Table offset = edi+ 0x78(4 + 14 + 60) // NT Header offset에 EXPORT Table 까지의 거리를 더합니다. add edi, ebx // base dll address + EXPORT Table offset // RAV를 구했으니 VA 를 구해야겠죠 ? base주소에 EXPORT Table offset를 더합니다

EDI 에 kernel32.dll 의 Export Table 주소가 들어있습니다.