IAT(Import Address Table)

PE 파일에서 외부 DLL에서 가져와 사용하는 함수들의 이름과 주소를 기록한 영역이다.
PE파일에는 EXE,DLL 등이 있고 바이너리 구조를 툴을 이용해 보면 IAT를 확인할 수 있다.

리버스 엔지니어링 관점에서 IAT는 해당 바이너리가 어떤 API를 사용하는지 확인할 수 있는 주요 포인트이다. 또한, IAT 테이블을 다른 함수 주소로 덮어 쓰면 기존 코드의 API 호출을 가로채는 IAT Hooking을 사용할 수도 있다.

악성코드들은 분석을 어렵게 하기 위해 IAT 테이블을 의도적으로 날리고 함수를 동적 로딩을 통해 실행시점에서 로드하여 사용하거나 패커를 이용해 분석하기 힘들게 만들기도 한다.

메모장과 악성코드 라이브러리 목록을 보면 메모장의 다수의 라이브러리를 확인할 수 있다. 반면 악성코드의 경우 동적 로딩을 통해 실제 사용하는 라이브러리들이 대부분 보이지 않는것을 확인할 수 있다.

정상적인 프로그램(메모장)

악성코드(Gunra Randsomware)

EXE

IAT 내부를 보면 특정 DLL에서 어떤 함수를 로드하는지 확인할 수 있다. 악성코드 분석시 이러한 정보는 악성코드의 동작을 유추하는데 도움이 된다. 예를 들어 네트워크 관련한 DLL이 있으면 C2로 연결하는 동작이 있다고 추측하여 정적/동적 분석시 해당 부분을 참고해 분석을 진행할 수 있을 것이다.

DLL

DLL을 사용시 LoadLibrary와 GetProcAddress를 이용해 DLL과 DLL 내부의 함수를 로드할 수 있다.

HMODULE hDll=LoadLibrary(”dll 이름”) → 라이브러리 로드 (dll)
GetProcAddress(hDll, ”함수이름”)→해당 라이브러리에 함수 로드

LoadLibrary를 통해 DLL호출 시 아래의 순서대로 DLL을 찾게 된다.

  1. 호출한 실행파일이 있는 디렉터리
  2. 시스템 디렉터리 (C:\Windows\System32)
  3. 16비트 시스템 디렉터리
  4. Windows 디렉터리
  5. PATH 환경변수에 등록된 디렉터리

DLL에는 IAT, EAT가 있다.
EAT는 DLL에서 제공하는 함수명이 명시된다. -> exe가 LoadLibrary를 통해 DLL의 EAT에 명시된 DLL이 제공하는 함수들을 읽어서 자신의 IAT에 불러서 사용한다.

Process Explorer에서 볼 때는 mydll.dll이 보인다 → Process Explorer는 iat만 읽는게 아니라 현재 불러들이는 모든 dll을 보여준다.

DLL Injection

실행중인 프로세스의 메모리 공간에 DLL을 삽입하여 보자. 해당 방법을 통해 악의적인 동작을 하는 DLL을 정상 프로세스에 넣어 실행시킬 수 있다.

injector.c

loader.exe의 pid 확인

injector.exe를 이용해 loader.exe에 mydll2.dll이 추가된 것을 확인할 수 있음

이건 dll 프로세스에 로드하기만 한거고 실행은 안된다.
실행하려면? → 함수 후킹해서 실행하거나 dllmain 사용

DLL Injection의 변형 버전인 Reflected DLL Injection, Shellcode Reflected DLL Injection 등도 있다.
https://www.ired.team/offensive-security/code-injection-process-injection/reflective-shellcode-dll-injection

DLL Ejection

프로세스에 DLL은 넣는것 뿐만 아니라 제거하는 것도 가능하다. 단, IAT에 등록된 DLL은 제거가 안되고 LoadLibrary를 통해 동적 로드한 dll이나 inject한 dll만 제거가 가능하다.

eject를 통해 mydll2.dll 제거

eject 통해 mydll.dll 제거

kernel32.dll은 eject가 안된다. → 이자식은 동적으로 라이브러리를 불러 쓴게 아니라 IAT에 등록된 거라 eject이 되지 않는다.

0개의 댓글