0. 목차
Contents
1. Hooking
공격자가 코드(일반적으로 DLL, 이외에도 exe파일, 쉘 코드도 사용됨)를 정상 프로세스에 인젝션하는 이유는 Target Process의 API 호출을 후킹하기 위함이다. Target Process에 코드를 인젝션하면 프로세스 메모리에 모든 권한을 가지며 해당 컴포넌트도 수정할 수 있다. 프로세스 메모리 컴포넌트를 변경할 수 있는 기능을 사용하면 IAT에 있는 항목을 교체하거나 API 함수 자체를 수정할 수 있는데 이러한 기술을 후킹(Hooking)이라고 한다.
공격자는 API를 후킹함으로써 프로그램 실행 경로를 제어하고 악성코드로 경로를 재지정할 수 있다. 또한 다음과 같은 기능을 수행할 수 있다.
- 정상 애플리케이션(보안 제품 등)의 API 호출을 차단
- API로 전달되는 입력 파라미터를 모니터링하고 가로챔
- API에서 반환되는 결과 파라미터를 필터링
1.1 IAT Hooking
IAT Hooking은 말 그대로 애플리케이션이 DLL에서 임포트한 함수를 포함한 IAT 항목을 후킹하는 것으로 공격 과정은 IAT를 찾아 후킹할 함수 항목을 식별한 뒤, 해당 함수의 주소를 악의적인 함수의 주소와 교체한다. 가장 단순하며 구현 방법이 쉬운 후킹이다.
예를 들어, 일반적으로 애플리케이션이 IAT에 존재하는 API함수를 호출하면 다음과 같다.
하지만, IAT Hooking이 된 경우 다음 그림과 같다.
IAT에 있는 정상적인 API함수의 주소를 악의적인 함수의 주소로 교체된다. 결국, 후킹된 정상적인 API함수를 호출할 때마다 악의적인 함수(악성코드)로 리다이렉션되고 악의적인 함수는 다시 원래 API함수 주소를 호출하여 정상적인 것처럼 보이게한다.
단점)
① DLL을 동적으로 로딩해서 사용하는 API함수는 후킹할 수 없다.
→ 예를 들면 내부 로직에서 LoadLibraryW("User32.dll")를 통해서 동적으로 User32.dll을 로딩하는 경우 해당 DLL의 API함수는 IAT를 참조하지 않기 때문이다.
② IAT 후킹은 쉽게 탐지됨
→ 후킹 기술을 탐지하고자 보안 제품은 해당 모듈의 주소 범위 밖에 있는 IAT 항목을 식별할 수 있으며 64bit 윈도우에서 커널패치보호(KPP, Kernel Patch Protection)
또는 패치가드(PatchGuard)
라 불리는 기술은 IAT를 포함해 호출 테이블을 패치하지 못하도록 한다.
→ 추가적으로 패치가드로 인해 커널단에서 후킹할 수 있는 SSDT(System Service Dispatch Table)
후킹도 안된다고 한다.
→ 하지만 2017년도 기사보면은 고스트 훅이라는 기술을 통해 패치가드를 우회할 수 있다고한다.
(이 부분은 나중에 따로 정리해야게따..)
IAT Hooking관련 자료) → example code도 있음
1.2 Inline Hooking
인라인 후킹(Inline Hooking)이란 API함수 자체를 패치해서 API함수를 악성코드로 리다이렉션하는 방식이다. 인라인 후킹은 일반적으로 공격 대상 API함수가 호출되어 시작하는 몇 바이트를 악성코드로 분기할 수 있도록 코드 패치를 사용한다. 가장 널리 사용되는 방법으로 다음과 같은 여러 가지 다양한 옵션이 존재한다.
- 처음 5byte를 JMP <ADDR> 명령어로 패치하는 방법
- 함수 일부를 덮어쓰는 방법
- 필요한 부분만 일부 변경하는 방법
위 옵션 중에서 JMP를 사용하는 방법에서는 jmp명령이 최소 5byte가 필요하므로 악성코드는 5byte 또는 그 이상을 차지하는 명령어를 선택하여 패치해야 한다. 다음 그림을 살펴보자
패치 하기 전 5byet 인스트럭션을 jmp를 통해 악의적인 함수로 패치하고 악의적인 함수의 인스트럭션에는 원하는 작업을 진행한 뒤 다시 패치하기 전의 원래 API함수의 인스트럭션과 원래 API 함수로 돌아가는 jmp명령어를 넣어 원래대로 돌아가게끔 한다.
위와 같이 API 함수의 시작 부분에 인스트럭션을 jmp명령어로 패치한 경우 탐지할 수 있지만, 시작 부분이 아닌 더 깊숙한 곳에 jmp명령어로 패치한 경우 탐지가 어려워진다.
관련 악성코드) - Zeus bot
1.3 In-Memory Patching using shim
- shim을 통해 인-메모리 패칭을 사용해 코드를 인젝션하고 API 함수를 후킹하는 기술.
- MS에서는 인-메모리 패칭 기술을 사용하여 제품의 취약점을 수정하기도 함
참고자료)
다음 링크는 리버싱을 통해 인-메모리 패칭 기능을 파악하고 분석하기 위한 도구임
관련 악성코드) - GootKit
커널 후킹이나 다른 후킹도 공부해서 추가하자
Uploaded by Notion2Tistory v1.1.0