본문 바로가기
리버싱(Reversing)/리버싱 개념

리버싱 핵심원리 13.5~13.8(PE File Format)

by LIZ0904 2020. 11. 2.
반응형

13.5 IAT

DLLWindows OS의 근간을 이루는 개념으로, Dynamic Linked Library, 동적 연결 라이브러리라고 한다.

16bit DOS 시절에는 코드가 해당 함수의 binary 코드를 그대로 가져와 프로그램에 삽입시켜버리는 구조로 실행되어 DLL없이 Library만 존재했는데, 이는 멀티태스킹이 지원되면서 심각한 메모리 낭비를 불러오게 됐다. 32bit Windows 환경에서는 매우 많은 라이브러리 함수가 필요하게 되면서, 아래와 같은 DLL 개념이 고안됐다.

 

<DLL의 개념>

1. 프로그램에 라이브러리를 포함시키지 말고 별도의 파일(DLL)로 구성하여 필요할 때마다 불러 쓸 것

2. 일단 한번 로딩된 DLL의 코드, 리소스는 Memory Mapping 기술로 여러 Process에서 공유해서 쓸 것

3. 라이브러리가 업데이트 됐을 때 해당 DLL 파일만 교체하면 되니 쉽고 편할 것

 

실제 DLL 로딩 방식은 2가지로,

프로그램에서 사용되는 순간에 로딩하고 사용이 끝나면 메모리에서 해제되는 방법(Explicit Linking),

프로그램이 시작할 때 로딩되어 프로그램이 종료할 때 메모리에서 해제되는 방법(Implicit Linking)

으로 나눌 수 있다. IAT는 이 Implicit Linking에 대한 매커니즘을 제공하는 역할을 한다.

 

PE 파일은 자신이 어떤 라이브러리를 import(library에게 함수를 제공받는 일)하고 있는지 IMAGE_IMPORT _DESCRIPTOR 구조체에 명시하고 있다. 일반적인 프로그램에서는 보통 여러 개의 라이브러리를 임포트하기 때문에, 구조체의 배열 형식으로 존재하며, 구조체 마지막은 NULL 구조체르 끝나게 된다.

PE 로더가 임포트 함수 주소를 IAT에 입력하는 기본적인 순서는 아래와 같다.

 

1. llD Name 멤버를 읽어서 라이브러리의 이름 문자열 (“kernel32.dll”)을 얻는다.

2. 해당 라이브러리를 로딩한다.

3 IIDOriginalFirstThunk 멤버를 읽어서 INT 주소를 얻는다.

4. INT에서 배열의 값을 하나씩 읽어 해당 IMAGE_IMPORT _BY _NAME 주소 (RVA)를 얻는다.

5. IMAGE_IMPORT _BY_NAME Hint(ordinal) 또는 Name 항목을 이용하여 해당 함수의 시작 주소를 얻는다.

6. IIDFirstThunk(IAT) 멤버를 읽어서 IAT 주소를 얻는다.

7. 해당 IAT 배열 값에 위에서 구한 함수 주소를 입력한다.

8. INT가 끝날 때까지(=NULL을 만날 떄까지) 4~7 과정을 반복한다.

 

실제 lMAGE_ IMPORT _DESCRIPTOR 구조체 배열(=IMPORT Directory Table)PE파일의 PE 바디에 위치한다. 그 바디의 위치에 대한 정보는 PE 헤더의 IMAGE_OPTIONAL_HEADER32.DataDirectory[1].VirtualAddress 값에 있으며, 이게 즉 DESCRIPTOR 구조체 배열의 RVA 시작주소라고 할 수 있다.

 

13.6 EAT

EAT(Export Address Table)은 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할 수 있도록 해주는 핵심 매커니즘이다. , EAT를 통해서만 해당 라이브러리에서 익스포트하는 함수의 시작 주소를 정확히 구할 수 있다는 것이다. 이에 대한 정보는 IMGAE_EXPORT_DIRECTORY에 저장되어 있으며, 라이브러리의 EAT를 설명하는 IMAGE_EXPORT_DIRECTORY 구조체는 PE 파일에 하나만 존재한다.

 

반응형

댓글