PWN-堆基础之Unsorted bin
Unsorted bin
1.Unsorted bin leak
简介
通过unsorted bin的partial unlink,泄露main_arena地址信息,通过计算在libc中的偏移进而获取libc基地址。
条件
1.存在UAF漏洞 或 其它可以修改unsorted bin中chunk的bk指针的漏洞。
2.glibc <= 2.28(2.29引入了UsortedBin Attack的缓解机制)。
利用
前面unsorted bin的基础知识中,我们了解到unsotred bin中的chunk会被分类到small bin和large bin
中。
这些chunk在被分类时,需要进行partial unlink操作。相比于之前提到的unlink,这里的断开连接更简
单:
victim的fd指针总是指向unsorted bin的头结点,因此可以被忽略。
victim->bk.fd = unsorted_bin_head
unsorted_bin_head.bk = victim.bk
首先,构造如下chunk:
1 | chunk_A = malloc(0x88) |
此时,vis查看发现chunk_B已经被连入unsorted bin中,并且由于unsorted bin中只有这一块chunk,因此该chunk的fd和bk指向了main_arena的地址。
再次malloc(0x88)申请回来,发现这时chunk中的fd和bk是没有被清除的,因此通过输出函数之类的是可以直接输出这两个的值的。
输出了fd即main_arena中unsortedbin的值->通过这个地址计算出main_arena的起始地址->通过这个起始地址获得libc的基地址
unsortedbin attack
比较低版本的glibc中没有校验这个最后的bin到底是不是双向链表中的成员
在结合堆溢出或UAF的漏洞编辑unsortedbin中的bk指针后,就可以直接将main_arena中的bk覆盖写掉
通过构造如下:
1 | chunk_A = malloc(0x88) |
vis查看发现:
再执行一次malloc(0x88),这时就会申请unsorted bin中的这个块,将其从原本的地方unlink,同时会在我们伪造的bk的位置处写入我们main_arena的bk地址。因此,我们可以通过修改bk的值,实现向任意地址写入main_arena bk 的功能。
demo:
源程序:
1 | void l33t(){ |
分析发现,当magic>4869时,会调用后门函数输出flag,因此我们可以使用unsorted bin attack修改magic变量为main arena bk的值,因为该值是一定大于4869的。
因此,完整exp:
1 | malloc(0x28, '') |