Skip to content

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_size0x1fe1,这个是因为需要对齐到内存页,都是比较细节的,这里不进行展开。具体看 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 的一小部分,后续可以利用(如打印堆地址)
}

Comments