用图形展示堆利用过程

首先你需要对堆的一些基本常识有了解,比如chunk,bin,fastbin,unsorted bin,small bin,large bin,prev_in_use,size,prev_size,fd,bk,topchunk,av->top,main_arena等等。

本文旨在用更易懂的方式介绍一些堆的利用方式。

当然,这些方法都是前人研究的成果,我只是换了一种表述方法而已。


unlink

一般来说,由于当时没有NX,所以可以将AAAA填为某个能劫持程序流的指针,然后BBBB改为shellcode的地址。

一般来说,如果在某处存着一个chunklist,通过这种方法再对第一个chunk写入就能覆盖后面chunk指针,从而间接获得任意地址读写。


fastbin attack

fastbin不同于其他的bin,他是单链表管理。而且在程序自身不加检测的情况下,fastbin的double free是非常容易的。

libc的检查只有一句,顶部不能为自身。就是不能连续两次free同一个fast chunk。因此只要double free时中间隔一个bin就好了。

使用这个攻击方法的前提是伪造的那个chunk的size位必须满足当前fast array的index值,size = (idx+[0,7])

而这个fastbin_index是这样定义的

实际上是一个unsigned int,也就是说在x64上(假设此时idx为0x20),我们的size的高位不是全要为零,而是0x????????00000020 + [0,7],高4字节是可以任意的。比如0xffffffff00000023就是可以的。


unsorted bin attack

单看unsorted bin attack没什么卵用,写的值不受我们控制。

一般来说最普遍的做法是利用unsorted bin attack去修改libc中的global_max_fast这个全局变量为一个很大的数,因为他控制了多大的chunk被视为fastbin。修改后就是利用fastbin attack了。


extend the chunk

off-by-one

通过修改下一个chunk的size,从而得到overlap。

这里有一个trick,一般来说1字节到不了size,前面还有prev_size。

考虑64位,如果malloc的size没有16字节对齐,比如malloc(0x18),系统实际malloc了0x20字节给程序,不够的8字节由后面一个chunk的prev_size提供(共用)。这也很合理,当这个chunk在使用时,prev_size肯定为0,是没用的;当prev_size有用时,这个chunk已经被free了,里面的内容已经无用了。

使用这个trick加off-by-one的溢出,我们刚好可以修改size。

off-by-one null byte


shrink the chunk

和extend the chunk 差不多,都是通过off-by-one null byte来获得overlap。但这个方法对堆布局的构造更加复杂。


house of force


MORE

先这样吧,我画的累死了 XD