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 도 존재하는데 이를 사용할려면 좀 더 고차원적인 개념이 필요할 수 있다.

이는 다음에 해당 문제를 풀면서 다루겠다.