hook overwrite 기법은 malloc, free, realloc 함수가 호출될 때 사용되는 변수인 hook 변수를 이용해 exploit을 하는 기법이다.
// __malloc_hook
void *__libc_malloc (size_t bytes)
{
mstate ar_ptr;
void *victim;
void *(*hook) (size_t, const void *)
= atomic_forced_read (__malloc_hook); // malloc hook read
if (__builtin_expect (hook != NULL, 0))
return (*hook)(bytes, RETURN_ADDRESS (0)); // call hook
#if USE_TCACHE
/* int_free also calls request2size, be careful to not pad twice. */
size_t tbytes;
checked_request2size (bytes, tbytes);
size_t tc_idx = csize2tidx (tbytes);
// ...
}
hook?
hook 변수는 libc.so에 정의되어 있는데 해당 변수의 위치는 libc.so의 bss 영역에 있다. 그렇기 때문에 해당 변수의 값은 바이너리의 보호기법과 관계없이 overwrite가 가능하다.
만약 여기서 hook 변수에 system 함수의 주소를 overwrite 하고 할당이나 해제가 될 때 아래와 같이 호출하면 쉘을 획득할 수 있다.
malloc("/bin/sh")
or
free("/bin/sh")
'hacking > pwnable' 카테고리의 다른 글
RTL(Return to Libc) (0) | 2023.05.27 |
---|---|
Return to Shellcode (0) | 2023.05.27 |
patchelf (0) | 2023.01.06 |
x64 stack alignment (0) | 2022.12.06 |
GLIBC 2.29 (0) | 2022.12.06 |