0.关于unsortedbin attack
unsortedbin attack的实现前提是存在UAF。
它是低版本libc堆漏洞中第二常用的攻击手法,同时也是最简单的攻击手法。
它最终能够实现在任意内存处写一个非常大的数。(一般是malloc_state->fd,libc-2.23中即为main_arena+88)
通常,利用这种攻击手法来修改次数限制、上限信息、伪造堆头、配合局部写等,也通常和fastbin attack配合使用。
但是在2.29以后的libc版本中增加了对这种攻击的检查机制,因此高版本无法使用这种攻击手法。
1.unsortedbin leak
之前也有提到过,当unsortedbin中只有一个freed chunk时,这个chunk的fd和bk都会指向libc中的一个固定地址。
如下图:
如果存在指针悬挂,我们可以访问到这个freed chunk的脏数据,从而造成libc地址泄露。
2.unsortedbin attack
若存在UAF,则可以通过修改unsortedbin中的freed chunk的bk指针为target_addr-0x10(因为这样才能让target_addr被解析为fake chunk的fd指针),此后再malloc一个相同大小的堆块,则可以完成攻击。
以上图为例,修改freed_chunk->bk为target_addr-0x10,修改后如下图:
可以看到此时target_addr已经被解析为fake chunk的fd了。
而在glibc/malloc/malloc.c中的_int_malloc有这么一段代码,当将一个unsortedbin中的chunk取出的时候,会在bck->fd的位置写入本unsortedbin的位置(即malloc_state->fd)。
1 | /* remove from unsorted list */ |
因此,在malloc回同大小的chunk后,target_addr处由于被解析为了fd,会指向malloc_state->fd,也就是意味着我们修改了target_addr处的内容。如下图所示:
3.例析
用的附件和之前fastbin attack一样(heap)。这里不多赘述。
我们将__malloc_hook作为target,代码如下:
1 | from pwn import * |
分别在修改了bk和malloc回后下断点,分别观察此时的bins和__malloc_hook中内容,回显如下图:
可以看出__malloc_hook已经被修改了。