Information Security

EAT(Export Address Table) 본문

Reverse Engineering

EAT(Export Address Table)

leeeeye321 2019. 6. 12. 15:33

EAT(Export Address Table)

라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할 수 있게 해주는 핵심 메커니즘이다. 

IMAGE_EXPORT_DIRECTORY 구조체에 Export 정보가 저장되어 있다.

 

 

 NumberOfFunctions

 실제 Export 함수 개수

 NumberOfNames

 Export 함수 중에서 이름을 가지는 함수 개수

 AddressOfFunctions

 Export 함수 주소 배열

 AddressOfNames

 함수 이름 주소 배열

 AddressOfNameOrdinals

 Ordinal 배열

 

EAT를 통해서만 해당 라이브러리에서 Export하는 함수의 시작 주소를 정확히 구할 수 있다.

라이브러리에서 함수 주소를 얻는 API는 GetProcAddress()이다. 이 API가 EAT를 참조하여 원하는 API의 주소를 구한다. 

 

* GetProcAddress()가 함수 이름으로 함수 주소를 얻는 과정

 

1. AddressOfNames를 이용하여 함수 이름 주소 배열로 간다.

 

2. 문자열 비교(strcmp)를 통하여 원하는 함수의 이름을 찾는다.

 

3. AddressOfNameOrdinals 배열을 이용하여 Ordinal 배열로 간다.

 

4. 2번 배열의 인덱스로 해당 ordinal 값을 찾는다.

 

5. AddressOfFunctions를 통해 함수 주소 배열(EAT)로 간다.

 

6. 4번에서 찾은 ordinal을 배열 인덱스로 하여 원하는 함수의 시작 주소를 얻는다.

 

 

 

 

 

 

kernel32.dll(C:\WINDOWS\system32\kernel32.dll)을 이용하여 GetProcAddress()가 EAT를 참조해서 AddConsoleAliasW의 실제 함수 주소를 찾는 과정을 실습할 것이다.

 

 

 

 

 

EXPORT 구조체의 시작 주소는 IMAGE_OPTIONAL_HEADER32.DataDirectory[0].VirtualAddress에 나와 있다.

PEview를 통해 확인해보면 값은 262C(RVA)이고, 이를 RAW로 변환하면 262C-1000+400=1A2C이다.

 

 

 

 

 Offset

 Member 

 Value 

 RAW 

 1A38

 Name

00004B98 

4B98 - 1000 + 400 = 3F98 

 1A3C

 Base 

 00000001

 

 1A40

 NumberOfFunctions

 000003BA

 

 1A44

 NumberOfNames

 000003BA

 

 1A48

 AddressOfFunctions

 00002654

2654 - 1000 + 400 = 1A54 

 1A4C

 AddressOfNames

 0000353C

 353C - 1000 + 400 = 293C

 1A50

 AddressOfNameOrdinals

 00004424

 4424 - 1000 + 400 = 3824

 

EXPORT 구조체의 멤버들 정보를 정리했다.

다음은 AddConsoleAliasW 함수의 주소를 찾는 과정이다.

 

 

 

1. AddressOfNames (함수 이름 배열) : 293C

함수 이름 배열은 3BA(NumberOfNames)개의 원소가 있는 배열이고, 원소는 모두 문자열 주소(RVA)로 이루어져 있다.

첫번째 원소 4BA5를 RAW 3FA5로 변환하여 찾아가 본다.

 

 

 

 

2. 함수 이름 찾기 : 3F455

엄청나게 많은 문자열들이 보인다. 우리가 찾아야 할 함수의 이름은 AddConsoleAliasW이다.

ActivateActCtx가 제일 앞에 있어 인덱스의 값이 0이다. 그러므로 AddConsoleAliasW의 인덱스는 4이다.

 

 

 

 

3. AddressOfNameOrdinals (Ordinal 배열) : 3824

Ordinal 배열로 가서 위에서 알아낸 인덱스 4로 해당 ordinal을 찾는다. 똑같이 4이다.

 

 

 

 

4. AddressOfFunctions (함수 주소 배열 - EAT) : 1A54

EAT로 가서 ordinal 4를 인덱스로 하여 함수 주소를 찾으면 00072B29 값을 얻는다.

kernel32.dll의 ImageBase는 7C800000이므로 00072B29(RVA) + 7C800000(ImageBase) = 7C872B29(VA)이다.

Ollydbg에서 직접 찾아가 보면

 

AddConsoleAliasW 함수를 만날 수 있다..

이렇게 IAT / EAT에 대해서 정리를 마칩니다.

'Reverse Engineering' 카테고리의 다른 글

DLL Ejection  (0) 2019.06.21
DLL Injection - Remote Thread 생성 & 레지스트리 이용  (0) 2019.06.20
Windows Message Hooking  (0) 2019.06.17
IAT(Import Address Table)  (0) 2019.06.12
PE File Format  (0) 2019.06.12