자료 저장소

지난번 포스트에서 DISK 상에 저장된 PE파일을 헥사 에디터로 분석하여

Imported 함수들의 위치를 찾아가는 방법을 살펴보았는데,

 

첨에 언급되었다시피 함수의 주소라는 것은 결국 해당 PE파일이 메모리에 로드되는 순간

바뀌게 되므로 메모리의 위치에서 위치를 찾아가는 방법을 살펴볼 필요가 있다.

 

[Navigating Imports in Memory]

 

올리디버거 프로그램을 특정 PE파일을 Open 하게되면,

아래와 같이 메모리에 로드되며 메모리 맵을 살펴볼수가 있다. (ALT+M)

 

 <그림-1>

 

위의 메모리맵에 나타난바대로 .idata section은 RVA 2D000에 해당되는 RVA 42D000 에 위치한다. 크기는 2000 정도의 범위를 가지게 된다.

 

올리의 메인 창(CPU)은 CODE 섹션만을 보여주게 되며 401000 에서 42AFFF 범위를 가질 수 있다.

대부분의 IAT는 .idata 에 있으므로 메모라 맵화면에서 .idata 위치에서 마우스 오른쪽 버튼으로 컨텍스트 윈도우를 나타나게 한후 'Dump in CPU'를 살포시 눌러준다.

그리고 다음과 같은 화면이 나타나면 'Ctrl+N'으로 함수 목록을 볼수 있다.

 

 

 <그림-2>

 

이제 특정 imported 함수가 호출되는 thunk stub 과 instance를 보기 위하여 다음과 같이...

 

 <그림-3>

 

여기서 Comment를 주목해보면,

Kernel32.dll의 DeleteCriticalSection을 호출하게 될때 바로 ntdll.dll의 RtlDeleteCriticalSection로 포워딩 하는 것을 알 수 있다.

 

다시 Names 윈도우에서 실제적인 함수의 위치를 따라가보면,

찾고자 하는 imported function 의 이름 위에서 아래와 같이

' Follow Import in Disassembler' 를 선택하여 실제 dll함수의 시작위치에 대한 옵셋을 찾아갈 수 있다.

 

 <그림-4>

 

만약 우리가 DeleteCriticalSection 이 호출되는 위치 00401B12 (<그림-3>의 reference 참고)를 살펴보면,

<그림-5>

 

이것은 실제로 "CALL 00401314" 이고, 401314는 IAT를 가리키고 있는 jmp stub의 주소이다.

올리는 이것을 우리가 알 수 있는 심볼 이름으로 변경하엿는데,  

아래와 같이 실제 위치로 가보면 실제로 "JMP DWORD PTR DS:[0042D084]" 이을 알 수 있다.

 

 

결국 'DeleteCritcalSection' 에대한 주소, <그림-2>에서 언급된 주소 '42D0B4'는

실제적으로 kernel32.DLL의 함수주소 7C97AE65로 업데이트 됨을 알 수 있다.

이는 <그림-4>에서 ' Follow Import in Disassembler'  를 통해서 본 시작 주소와 같다. 휴~ ^^; 

댓글 로드 중…

최근에 게시된 글