概述
在程序中设置钩子,用来在malloc,,对其进行检查,可以看到对应的函数调用后的地址是什么。
malloc__hook 也位于libc中的data段
它是一个地址
当调用 malloc 的时候 它会发生跳转到malloc__hook 所指向的地址
当我们把malloc__hook 所指向的地址 改为 system(“bin/sh”)
再次调用 malloc 的时候 就会发生跳转到 system() 处
操作
上述前提是获取 malloc__hook 的地址
有一个固定的偏移 (libc2.23 // ubuntu16
): main_arena+0x58 = unsortbin表头的地址
接着获取malloc__hook的地址: main_arena - 0x10 = malloc__hook
即 malloc__hook=unsortbin表头地址-0x58-0x10
第二种方法:这里还有一个固定结论 偏移0x3c4b78
**
libc_base=(程序里的main_arena+88)-0x3c4b78(0x3c4b0+88,一般2.23_64的偏移都是这个,不同libc版本会有不同)
**
show(1)
libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00')) -0x3c4b78
malloc_hook = libc_base + libc.symbols['__malloc_hook']
主线程的arnea称为“main_arena”。子线程的arnea称为“thread_arena”。
这里需要我们先获取unsortbin的地址
即 unsortbin attack (leak libc)
主要是利用堆溢出的原理
步骤过程如下
这是chunk的结构组成部分
大致过程是这样的
prev-size 站位大小是8