리버싱

PE 파일의 자료구조 임포트 테이블 분석 실습

이둥둥 2025. 2. 24. 15:26

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

참고로 IDA,  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가 존재한다는 것을 알 수 있다