1前提条件
1,符合fastbin大小的堆块
2.堆溢出漏洞
2源码
这段话的判断逻辑是a,b,c三个堆块,我们一开始释放a,然后再释放a时
这时会报错为double free,但是如果我们 一开始让
然后 我们让a指向b然后b此时又指向a,然后a又指向b就会变成
这个时候我们修改从a指向b的指针也就是fd指针就能让后一个a任意指向地址,此时就算只剩最后一个检查方式即fastbin的大小要保持一致
然后最后就是一个house spirit即可用的堆块和不可用的堆块
然后就是结合demo的理解
demo
1fastbin dump
链接:https://pan.baidu.com/s/1ybe8XglymkiiTKMZhJxTxg
提取码:1111
这样申请出来的堆块
这个例子演示了 fastbin 的 double free
首先申请了 3 个 chunk
第一个 malloc(8): 0x564d644d92a0
第二个 malloc(8): 0x564d644d92c0
第三个 malloc(8): 0x564d644d92e0
free 掉第一个
当我们再次 free 0x564d644d92a0 的时候, 程序将会崩溃因为 0x564d644d92a0 在 free 链表的第一个位置上
我们先 free 0x564d644d92c0.
现在我们就可以再次 free 0x564d644d92a0 了, 因为他现在不在 free 链表的第一个位置上
这段程序验证的就是第一个保护机制,不能连续两次释放同一个内存否则会报错free(): double free detected in tcache 2
2demo2
验证consolidate机制
申请两个 fastbin 范围内的 chunk: p1=0x560c517792a0 p2=0x560c517792c0
先 free p1
去申请 largebin 大小的 chunk,触发 malloc_consolidate(): p3=0x560c517792e0
因为 malloc_consolidate(), p1 会被放到 unsorted bin 中
free(): double free detected in tcache 2
3demo3
house of spirit
通过伪造fake chunk,将原本的不可控区域申请出来
这一段进行堆块的伪造,
其中从chunk【1】开始的原因是mem指针的前段chunk是不能进行修改的
这边伪造一个指针并将其释放,就将伪造的chunk段放到了bins中
此时再申请一个大小为0x30的
堆块就会将这一段拉出来
从而实现对原本不可控段的利用