후킹(hooking)은 코드 실행을 낚아채 다른 코드가 샐행되게 하는 것을 말하고, 이때 실행되는 코드를 훅(hook)이라고 한다.
후킹은 다양한 용도로 사용된다. 예를 들어 malloc과 free에 hook을 설치하면 소프트웨어에서 할당하고, 해제하는 메모리를 모니터링 할 수 있다. 이를 응용하면 함수 도입부에 모니터링 함수를 hook으로 설치하여 모든 호출 함수를 tracing 할 수 있다.
여기서는 hook overwrite와 one-gadget에 대해 공부할 것이다. Hook Overwrite는 Full RELRO가 적용되더라도 libc의 데이터 영역에 쓰는 것이라 Full RELRO를 우회할 수 있는 기법이다. Glibc 2.33이하에선 libc 데이터 영역에 malloc()과 free()를 호출할 때 함께 호출되는 hook이 함수 포인터 형태로 존재한다. 이 함수 포인터를 임의 함수 주소로 overwrite 가능하다. One-gadget은 단일 가젯만으로 쉘을 실행할 수 있는 가젯이다. Glibc의 버전이 높을수록 제약 조건을 만족하기 어려우므로 ubuntu 18.04(Glibc 2.27버전)에서 실습을 진행한다.
메모리 함수 훅
malloc, free, realloc hook
malloc, free, realloc은 libc.so에 구현되어 있다. readelf의 s옵션을 이용해 malloc, free, realloc의 심볼을 확인한 결과이다.
libc에는 디버깅 편의를 위해 훅 변수가 정의되어 있다. malloc의 경우, __malloc_hook 변수의 값이 null인지 검사하고, null이 아니라면 malloc을 수행하기 전에 __malloc_hook이 가리키는 함수를 먼저 실행한다. 이때, malloc의 인자는 훅 함수에 전달된다. free는 __free_hook, realloc은 __realloc_hook인 훅 함수가 존재한다.
훅의 위치와 권한
__malloc_hook, __free_hook, __realloc_hook 또한 libc.so에 정의되어 있다.
변수의 offset은 libc.so의 bss 섹션에 포함되어 있다. bss 섹션은 쓰기가 가능하므로, 이 변수들의 값은 조작 가능하다.
Hook Overwrite
공격 시나리오는 다음과 같다.
1. __malloc_hook을 system 함수 주소로 덮기
2. hook 실행 시, 기존 함수에 전달한 인자를 같이 전달해 주기 때문에, 인자로 "/bin/sh" 전달
아래의 코드는 hook overwrite에 대한 Proof-of-Concept(PoC)이다. 이 코드를 실행하면 쉘 획득되는 것을 확인할 수 있다.
// Name: fho-poc.c
// Compile: gcc -o fho-poc fho-poc.c
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
const char *buf="/bin/sh";
int main() {
printf("\"__free_hook\" now points at \"system\"\n");
__free_hook = (void *)system;
printf("call free(\"/bin/sh\")\n");
free(buf);
}
Full RELRO가 적용된 바이너리에도 라이브러리의 훅에는 쓰기 권한이 남아있어, 이런 공격이 가능하다.
__free_hook과 같이 훅은 libc에 쓰기 권한으로 존재하는 함수포인터이며, free(), malloc()을 간접적으로 호출할 수 있기 때문에 공격에 악용되기 쉽니다. 또한, hook은 힙 청크 할당(malloc)과 해제(free)가 다발적으로 일어나는 환경에서 성능에 안좋은 영향을 끼치기 때문에, 보안과 성능 향상을 이유로 Glibc 2.34 버전 부터는 제거되었다.
'CS > system' 카테고리의 다른 글
[System][Dreamhack] Exploit Tech: Hook Overwrite - one_gadget (0) | 2024.03.11 |
---|---|
[System][Dreamhack] Exploit Tech: Hook Overwrite(2/2) (0) | 2024.03.04 |
[System][Dreamhack] RELRO - RELocation Read-Only (1) | 2024.01.02 |
[System][Dreamhack] PIE - Position-Independent Executable (0) | 2023.12.26 |
[System][Dreamhack] Exploit Tech : Return Oriented Programming(ROP) - ret2main (0) | 2023.12.22 |