With 리버싱 핵심원리
DLL
DLL(Dynamic Linked Library)란 동적 연결 라이브러리라고도 하는데, 별도의 라이브러리 파일(*.dll)을 필요할 때 불러와서 사용하는 방법입니다. DLL 파일은 2가지 방법으로 로딩되는데,
1. Explicit Linking : 프로그램에서 사용되는 순간에 메모리에 로딩되고, 사용이 끝나면 메모리에서 해제
2. Implicit Linking : 프로그램의 시작과 함께 로딩되고, 프로그램이 종료될 때 함께 해제
이제 배울 IAT는 위에서 2번 방법에 사용되는 방식입니다.
IAT
IAT(Import Address Table)은 프로그램에서 함수를 호출할 때 직접 함수의 주소를 호출하는 게 아니라 DLL 파일에 원하는 함수 주소를 저장하고 저장된 위치를 호출함으로써 해당 함수를 호출하게 됩니다. 이렇게 호출하는 이유는 프로그램이 어떤 환경에서 호출될지 모르고, 메모리에 여러 개의 DLL 파일이 매핑되기 때문입니다.
- IMAGE_IMPORT_DESCRIPTOR
파일은 IMAGE_IMPORT_DESCRIPTOR 구조체에 Import하는 라이브러리를 명시하고 있습니다.
IMAGE_IMPORT_DESCRIPTOR는 다른 용어로 IMPORT Directory Table입니다. 그래서 PE view로 찾을 땐 IMPORT Directory Table이란 이름으로 찾아야 됩니다.
구조체에서 중요한 맴버로는
OriginalFirstThunk : Import Name Table의 RVA 주소
Name : Library 이름의 RVA 주소
FirstThunk : Import Address Table의 RVA 주소
- Import Name Table(INT)
INT(Import Name Table)은 import 하는 함수의 정보(Ordinal, Name)가 담긴 구조체 포인터 배열입니다. 이 정보들이 있어야 메모리에 로딩된 라이브러리의 정확한 위치를 알 수 있습니다.
- IMAGE_IMPORT_BY_NAME
파일 오프셋의 최초 2바이트 값은 Ordinal로 라이브러리에서 함수의 고유 식별 번호입니다. Ordinal 뒤로 함수의 이름 문자열이 있습니다.
- Import Address Table(IAT)
IAT에는 실질적인 함수의 시작 주소 값을 가리킵니다.
EAT
EAT(Export Address Table)은 라이브러리 파일에 있는 함수를 다른 프로그램이 가져다 사용할 수 있게 해주는 메커니즘 EAT를 이용해야만 라이브러리에서 Export 하는 함수의 시작 주소를 정확히 구할 수 있습니다. EAT는 PE 파일에 IMAGE_EXPORT_DIRECTORY 구조체에 정보를 저장하고 있습니다.
NumberOfFunctions : 실제 Export하는 함수의 개수
NumberOfNames : Export 함수 중 이름을 가지는 함수의 개수
AddressOfFunctions : Export 함수 주소 배열
AddressOfNames : 함수 이름의 주소 배열
AddressOfNameOrdinals : Ordinal 배열
GetProcAddress()를 이용하여 라이브러리에서 함수 주소를 얻을 수 있는데 이 API가 EAT를 참조하여 원하는 API의 주소를 구하는 것입니다.
GetProcAddress가 함수 주소를 얻는 과정
1. AddressOfNames를 이용해 함수 이름 배열에서 문자열 비교로 원하는 함수의 인덱스를 찾는다. 2. AddressOfNameOrdinals를 이용해 앞서 찾은 인덱스로 해당 Ordinal 값을 찾는다. 3. AddressOfFunction를 이용해 EAT(함수 주소 배열)로 가서 Ordinal을 이용해 함수 시작 주소를 구한다. (index != Ordinal일 경우가 있어 Index를 찾고, 그 index 값으로 Ordinal 값을 찾는 것) |
마치며
PE File Format 파트는 저도 정리하면서 여러 번 읽고도 이해가 잘 안되는 부분이 있었습니다. 내용도 많고 난이도도 꽤 있어서 여러번 읽고 실습을 하면서 이해해야 하는 파트인 거 같습니다. 제가 정리한 것은 참고만 하시고 꼭 책으로 공부하시길 바랍니다.
'Reversing > 리버싱핵심원리' 카테고리의 다른 글
P2 - Unpackme #1 (0) | 2022.09.18 |
---|---|
P2 - 13 PE File Format 정리 #1 (0) | 2022.09.11 |
P1-1,2 리버싱 기초 (0) | 2022.04.17 |