EAT (Export Address Table)
EAT는 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서도 사용할 수 있도록 해주는 방법입니다.
IAT에서 설명한것 처럼 프로그램 마다 동일한 라이브러리가 포함되어 실행되면 메모리 낭비가 심해지죠.
EAT는 IMAGE_EXPORT_DIRECTORY에 그 내용을 저장하고 있습니다.
IMAGE_EXPORT_DIRECTORY는 IMAGE_OPTIONAL_HEADER.DataDirectory[0]에 존재합니다.
IMAGE_EXPORT_DIRECTORY
여기서 중요한 멤버는 다음과 같습니다.
* NumberOfFunctions
실제 Export 함수 개수를 나타냅니다.
* NumberOfNames
Export 함수 중에서 이름을 가지는 함수 개수를 나타냅니다. (<=NumberOfFunctions)
* AddressOfFunctions
Export 함수 주소 배열을 나타냅니다. (배열의 원소 개수 = NumberOfFunctions)
* AddressOfNames
함수 이름 주소 배열을 나타냅니다. (배열의 원소 개수 = NumberOfNames)
* AddressOfNamesOrdinals
Oridinal 주소 배열을 나타냅니다. (배열의 원소 개수 = NumberOfNames)
라이브러리에서 함수 주소를 얻는 것은 GetProcAddress()가 하는데 GetProcAddress()가 EAT를 참조해서 API 주소를 구합니다.
GetProcAddress() 동작 원리
1. AddressOfNames 멤버를 이용해 함수 이름 배열로 이동합니다.
2. 함수 이름 배열은 문자열 주소가 지정되어 있어, 문자열 비교를 통하여 원하는 함수 이름을 찾습니다.
3. AddressOfNamesOrdinals 멤버를 이용해 ordinal 배열로 이동합니다.
4. ordinal 배열에서 2에서 찾은 문자열 주소가 지정되어있는 배열 인덱스로 ordinal 값을 찾습니다.
5. AddressOfFunctions 멤버를 이용해 함수 주소 배열(EAT)로 이동합니다.
6. 함수 주소 배열(EAT)에서 ordinal을 배열 인덱스로 해서 원하는 함수의 시작 주소를 얻습니다.
Windows10 32bit kernel32.dll 을 이용하여 분석하도록 해보겠습니다.
Windows10 - 32bit - kernel32.dll
EXPORT table의 RVA 값은 75930입니다. RVA to RAW 공식을 이용해서 RAW 값을 구하면 다음과 같습니다.
RAW = RVA - VA + PTRD
RAW = 75930 - 170 + 170 = 75930 입니다.
여기서 VA 값이 68900170으로 나오는데 68900000이 ImageBase 값이므로 제외합니다.
헥스 에디터로 75930 위치로 이동합니다.
위와 같이 정리 됩니다.
* 함수 이름 배열 찾기
NumberOfNames의 값이 771DC인데 Section .text에 존재하므로 RAW로 변환하면 771DC - 1000 + 1000 = 771DC가 됩니다.
771DC 부터 값을 하나씩 찾아가면 771F0이 AddAtomW 함수라는 것을 알 수 있습니다.
* 함수 이름 찾기
79797을 RAW로 변환하면 79797이 됩니다.
해당 위치로 이동하면 AddATomW 함수를 찾을 수 있습니다.
* Ordinal 배열
AddressOfNameOrdinals의 값은 78A60 입니다. RAW로 변환하면 78A60이 됩니다.
* 함수 주소 배열 - EAT
AddressOfFunctions의 값은 75958 입니다. RAW로 변환하면 75958이 됩니다.
75958부터 DWORD 단위로 Ordinal 배열에서 찾은 인덱스 값 만큼 이동하면 75974에서 AddATomW를 찾을 수 있습니다.
02 08 60 이라는 값이 나오게 됩니다.
이 값을 OllyDBG에서 찾아보도록 하겠습니다.
* AddAtomW 함수 주소
kernel32.dll의 ImageBase가 75680000 이므로 20860값과 더하면 756A0860이 됩니다.
'High Level Technique > Reversing' 카테고리의 다른 글
.reloc section 제거 (1) | 2015.12.21 |
---|---|
PE 재배치 (PE Relocation) (0) | 2015.12.21 |
IAT (Import Address Table) (0) | 2015.12.18 |
IMAGE_SECTION_HEADER (0) | 2015.07.09 |
NT Header - IMAGE_OPTIONAL_HEADER - IMAGE_DATA_DIRECTORY (0) | 2015.07.09 |