unsorted bin attack
[TOC] 1.unsorted bin attack 被利用的前提是控制 unsorted bin chunk 的 bk 指针或者有show函数。 2.unsorted bin attack的目的一般是为别的attack做准备,比如可以通过main_arena泄露出libc
unsorted bin来源
unsorted bin leak
- 如果我们可以把正确的 fd 指针 leak 出来,就可以获得一个与 main_arena 有固定偏移的地址,这个偏移可以通过调试得出。而main_arena 是一个 struct malloc_state 类型的全局变量,是 ptmalloc 管理主分配区的唯一实例。说到全局变量,立马可以想到他会被分配在 .data 或者 .bss 等段上,那么如果我们有进程所使用的 libc 的 .so 文件的话,我们就可以获得 main_arena 与 libc 基地址的偏移,实现对 ASLR 的绕过
- 泄露libcbase的方法:比较巧合的是,main_arena 和 __malloc_hook 的地址差是 0x10,而大多数的 libc 都可以直接查出 __malloc_hook 的地址,这样就可以获得 main_arena 与基地址的偏移从而获得libcbase了 main_arena_offset = libc.sym["__malloc_hook"] + 0x10 libcbase=u64(sh.recvuntil(’\x7f’)[-6:].ljust(8,b’\x00’))-main_arena_offset-96
- 利用方法
unsorted bin 任意地址写一个很大的数
- 当将一个 unsorted bin大小的chunk被取出的时候,如下: //victim就是即将被取出的chunk //unsorted_chunks (av)就是unsorted bin链表头 1.victim = unsorted_chunks(av)->bk=p 2.bck = victim->bk=p->bk = target addr-0x10 3.unsorted_chunks(av)->bk = bck=target addr-0x10 4.bck->fd = *(target addr -0x10+0x10) = unsorted_chunks(av); 结合unsorted bin的链表结构想象一下 最终效果是target=unsorted_chunks (av),也就是target是一个很大的值
- wiki笔记
- 总结:这里我们可以看到 unsorted bin attack 确实可以修改任意地址的值,但是所修改成的值却不受我们控制,唯一可以知道的是,这个值比较大。这看起来似乎并没有什么用处,但是其实还是有点卵用的,比如说: 1.我们通过修改循环的次数来使得程序可以执行多次循环。 2.我们可以修改 heap 中的 global_max_fast 来使得更大的 chunk 可以被视为 fast bin,这样我们就可以去执行一些 fast bin attack 了。