house of orange
复制本地路径 | 在线编辑
一句话概括,就是没有 free 但我们 free 了一段内存。这样假设我们能操控这段内存,那么相当于 Use After Free 了,
原理
原理简单来说是当前堆的 top chunk 尺寸不足以满足申请分配的大小的时候,原来的 top chunk 会被释放到 unsorted bin 中。
所以篡改 top_chunk->size,让其变得很小,然后再申请一段内存,这样就可以了。当然这其中还有更具体的细节了,可以参考 CTF Wiki。
更具体的细节
我们总结一下伪造的 top chunk size 的要求
1. 伪造的 size 必须要对齐到内存页
2. size 要大于 MINSIZE(0x10)
3. size 要小于之后申请的 chunk size + MINSIZE(0x10)
4. size 的 prev inuse 位必须为 1
简单示例
下面是简单的示例,至于为什么 fake_size 是 0x1fe1,这个是因为需要对齐到内存页,都是比较细节的,这里不进行展开。具体看 CTF Wiki。
#include <stdlib.h>
#define fake_size 0x1fe1
int main(void)
{
void *ptr;
ptr=malloc(0x10);
ptr=(void *)((long long)ptr+24);
*((long long*)ptr)=fake_size;
malloc(0x2000); // 申请一段大内存,这样原来的 top chunk 会被释放到 unsorted bin 中
malloc(0x60); // 申请内存,得到原来的 top chunk 的一小部分,后续可以利用(如打印堆地址)
}