```c

gdb-peda$ x/4wx &__free_hook

0xf7fd08b0 <__free_hook>:       0x00000000 

gdb-peda$ patch 0xf7fd08b0 one_gadget_addr

```

32bit `` libc.so``의 경우 다음과 같이 `` unsorted_bin``에서 `` 0x10`` 단위로 조회하면 없는 것 처럼 나오는데, 이는 `` gdb``가 맨 왼쪽에 있는 symbol만 표시해주기 때문이다.

```bash

gdb-peda$ x/40wx 0xf7fad7b0 - 0x60

0xf7fad750:     0x00000000      0x00000000      0x00000000      0x00000000

0xf7fad760 <__memalign_hook>:   0xf7e6cfa0      0xf7e6cf40      0x00000000      0x00000000

0xf7fad770:     0x00000000      0x00000000      0x00000000      0x00000000

```

이렇게 조회해보면 있다. 그리고 어차피 `` __free_hook``은 여기에 없기 때문에 `` unsorted_bin``에서 바로 hook func에 접근하지 말고 `` libc_base``를 계산해서 접근하는 것이 좋다.

```bash

gdb-peda$ x/4wx 0xf7fad7b0 - 0x48

0xf7fad768 <__malloc_hook>:     0x00000000      0x00000000      0x00000000      0x00000000

```


__free_hook VS __malloc_hook

아무래도 ``c malloc("/bin/sh")`` 보다는 ``c free("/bin/sh")`` 쪽이 훨씬 더 자연스럽고 인자 넣기도 수월하다. 전자는 `` size``고 후자는 `` ptr``이니까, 그냥 문자열 넘기고 이를 free하도록 하면 된다. 

대신 64bit의 경우 ``c malloc()``은 근처에 `` 0x7f``같이 `` chunk.size``로 쓸만한 주소가 있는 경우가 있어 fastbin attack으로 chunk를 할당하기 좋다.

* smallbin range chunk는 unlink 때문에 할당할 수가 없다.


argument push

``c free(arg) / malloc(arg)``이면 ``c hook_func(arg)``으로 넘어간다. 따라서 ``c free("/bin/sh") / malloc("/bin/sh")``를 호출해야 ``c system("/bin/sh")``가 된다. one-gadget을 사용할 수 없는 경우 이렇게 직접 argument를 넘길 수 있다.
```c

#include <stdio.h>

#include <malloc.h>


int main(){

    void *a;

    a = malloc(10);  

    a = malloc("/bin/ls");

    return 0;

}

```
```c
arg[0]: 0x4005e4 --> 0x736c2f6e69622f ('/bin/ls')
gdb-peda$ patch 0x7ffff7dd3740 0x7ffff7a5b590 // ( == patch __malloc_hook system)
Written 6 bytes to 0x7ffff7dd3740
gdb-peda$ c
Continuing.
[New process 6924]
process 6924 is executing new program: /bin/dash
[New process 6925]
process 6925 is executing new program: /bin/ls
ht  ht.c  malloc_hook  malloc_hook.c  peda-session-ht.txt
```

__malloc_hook 호출 sequence

코드에서 정상적으로 __malloc_hook을 변경하는 경우

* `` rip+0x33b870 == 0x7ffff7dd2ee0``는 libc의 bss section이다.

```c

malloc()


__GI___libc_malloc() { 

    mov    rax,QWORD PTR [rip+0x33b870]   # 0x7ffff7dd2ee0: 0x601060 

    mov    rax,QWORD PTR [rax]    # RAX: 0x601060 (<__malloc_hook@@GLIBC_2.2.5>) --> 0x4005bd (<my_malloc_hook>)

}

hook_func()

```


&__malloc_hook에 직접 접근해 값을 변경하는 경우

```c

malloc()


__GI___libc_malloc() { 

    mov    rax,QWORD PTR [rip+0x33b870]   # 0x7ffff7dd2ee0: 0x00007ffff7dd3740

    mov    rax,QWORD PTR [rax]    # RAX: 0x7ffff7dd3740 (<__malloc_hook>) --> 0x7ffff7a5b590 (<__libc_system>)

}

hook_func()

```




'Security > System Exploit' 카테고리의 다른 글

Shellcode  (0) 2017.07.26
UAF, Use After Free  (0) 2017.07.23
[glibc] malloc - checks  (0) 2017.07.22
[glibc] malloc - 4  (0) 2017.07.21
[glibc] malloc - 3  (0) 2017.07.21