what is __free_hook
드림핵 문제를 풀면서 얻은 개념이다.
free 함수에서 hook 이라는 개념을 제공한다. 물론 libc에 있어서 익스를 짤때 참고해야한다. libc_base가 필요하다.
개념은 다음과 같다.
Python
pwndbg> p __free_hook
$1 = (void (*)(void *, const void *)) 0x0
pwndbg> p &__free_hook
$2 = (void (**)(void *, const void *)) 0x7ffff7f9f148 <__free_hook>
pwndbg> vmmap
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
Start End Perm Size Offset File
0x400000 0x401000 r-xp 1000 0 /home/kali/Desktop/one day 1 pwn/hook
0x600000 0x601000 r--p 1000 0 /home/kali/Desktop/one day 1 pwn/hook
0x601000 0x602000 rw-p 1000 1000 /home/kali/Desktop/one day 1 pwn/hook
0x7ffff7db9000 0x7ffff7dbc000 rw-p 3000 0 [anon_7ffff7db9]
0x7ffff7dbc000 0x7ffff7de4000 r--p 28000 0 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7de4000 0x7ffff7f3e000 r-xp 15a000 28000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7f3e000 0x7ffff7f94000 r--p 56000 182000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7f94000 0x7ffff7f98000 r--p 4000 1d7000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7f98000 0x7ffff7f9a000 rw-p 2000 1db000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7f9a000 0x7ffff7fa7000 rw-p d000 0 [anon_7ffff7f9a]
0x7ffff7fc0000 0x7ffff7fc2000 rw-p 2000 0 [anon_7ffff7fc0]
0x7ffff7fc2000 0x7ffff7fc6000 r--p 4000 0 [vvar]
0x7ffff7fc6000 0x7ffff7fc8000 r-xp 2000 0 [vdso]
0x7ffff7fc8000 0x7ffff7fc9000 r--p 1000 0 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7fc9000 0x7ffff7ff0000 r-xp 27000 1000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7ff0000 0x7ffff7ffb000 r--p b000 28000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7ffb000 0x7ffff7ffd000 r--p 2000 33000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7ffd000 0x7ffff7fff000 rw-p 2000 35000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffffffde000 0x7ffffffff000 rw-p 21000 0 [stack]
다음과 같이 libc 영역에 존재하며 기본값은 0으로 되어 있다. 하지만, 이 0이 만약 수정되면 free 함수가 호출 될때 수정된 값의 주소로 흐름제어가 된다.
따라서 free(str) str에 “/bin/sh” 넣고 __free_hook 을 system 함수로 수정하는 방식으로 익스를 짤 수 있다.
추가적으로 __malloc_free 도 존재하는데 이를 사용할려면 좀 더 고차원적인 개념이 필요할 수 있다.
이는 다음에 해당 문제를 풀면서 다루겠다.