[glibc] free_hook, malloc_hook
```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
#include <stdio.h>
#include <malloc.h>
int main(){
void *a;
a = malloc(10);
a = malloc("/bin/ls");
return 0;
}
__malloc_hook 호출 sequence
코드에서 정상적으로 __malloc_hook을 변경하는 경우
```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 |