PE 파일의 자료구조 임포트 테이블 분석 실습
intro
EXE파일은 혼자 일할 수 X → DLL에 정의된 API을 호출해야 함
→ PE-COFF 파일에는 참조해야 하는 DLL, API 관련 정보들을 구조화하는데 이를 임포트 테이블이라고 함
임포트테이블에 바인딩 때문에 저장매체에서와 메모리에서 실행될 때 내용이 약간 달라진다
CFF Explorer를 사용해서 임포트 테이블의 위치를 살펴보자
CFF Explorer
Optional Header 안에 위치한 데이터 디렉토리에 export/import/TLS 에 관한 정보가 있고 해당 정보들이 존재하는 포인터와 사이즈 정보가 있다
Nt Header\Optional Header\Data Directories에 들어가니 export\import 디렉토리 정보가 뜬다
00007000은 절대주소가 아닌 오프셋이므로 파일의 시작위치로부터 그 만큼 떨어져 있는 거
ImageBase 값은 00400000이니까 둘이 더해서 0x00407000 위치로 이동하자
파일을 덤프하고 ctrl+G를 통해 검색하면 이렇게 결과가 뜬다
IDA
HEX값으로 각 descriptor들이 뜨는데 리틀 엔디안이라 보기가 어려우므로 address 보기로 설정하면
이 중에서 첫 번째 descriptor를 살펴보는데, descriptor 내부에서 가장 중요한 건 4, 5번째인 name, thunk이다
- Name: DLL 이름 위치를 가리키는 메모리상의 상대주소 RVA
- Thunk: IAT 위치를 가리키는 메모리상의 상대주소 RVA
- ImageBase 값 0x00400000 + 0x00007520 → 0x00407520 → Name
- ImageBase 값 0x00400000 + 0x00007104 → 0x00407104 → Thunk
x32 dbg
0x00407520값을 x32 dbg에서 가보기로 했다
hex값이지만 오른쪽 마우스를 눌러서 address를 선택하면 주소 address로 보여준다
이 DLL의 경우 Kernel32.dll을 참조한다는 것을 확인할 수 있다!
마찬가지로 descriptor의 5번째인 thunk 위치 00407104도 가보자
value에 있는 주소값들을 참조해서 메모리맵에 가보면 여러 dll들이 뜬다
kernel32.dll ntdll.dll 등이 있는 곳을 가리키고 있었음
value에 있던 779~7689~ 등의 숫자들은 함수들의 시작위치이고 이게 모여서 IAT가 되는 것!
마지막에 Null 값으로 끝나고 0x004071c8애서 API 주소가 끝난다
이번에는 두 번째 descriptor 도 분석해 보자
msvcrt.dll을 가리킨다
다음은 5번째 구간인 IAT위치를 알아보자 → 00407164
msvcrt.dll 라이브러리의 함수 정보들이 있고
테이블의 끝을 알리는 null 값도 확인된다
정리하자면 이 실행파일에서는 3개의 dll이 있고
마찬가지로 3개의 descriptor가 존재한다는 것을 알 수 있다