double free

double free 利用

unlink漏洞

1
2
3
4
FD = P->fd;
BK = P->bk;
FD->bk = BK;
BK->fd = FD;

这里在宏中传入参数FD,BK,P分别是指向后一个,
前一个,还有当前的chunk。很经典的链表节点删除,
溢出的话导致链表被改,所以有了保护。
当前内存块的上一块内存中指向下一块内存指针和
当前内存块的下一块内存块的指向上一块内存块的指针
如果不是指向当前内存块的话,程序就会崩溃退出。

漏洞的原理

要利用Double Free的漏洞。我们就要让系统进行unlink的操作,
达到篡改指针的目的。但是一般的情况下,
我们两次释放同一块内存会被操作系统给检测出来,
怎么欺骗过操作系统才是最重要的。

假设程序申请了两个堆块

1
2
>malloc(504)
>malloc(512)

然后释放这2块内存。这样子我们就可以在距离
第一个指针偏移量为0x200的地方有了一个野指针。
我们留下了一个野指针p指向偏移为0x200的地方。
然后我们需要做的就是伪造chunk。再free野指针p。
首先是申请一块更大的内存,
大小应该等于我们刚才申请的内存的总和。

malloc(768)
最好和刚才2块内存大小总和一样,如果不一样大也也可以,
就是待会伪造第二快内存块的大小的时候,
要让伪造的大小等于我们申请的chunk的大小,
否则会无法绕过检查。会被系统检查出double free。

然后这是我在第二次申请的内存中填入的内容。

1
>0x0 + 0x1f9 + 0x0804bfc0 - 0xc + 0x0804bfc0 - 0x8 + 'a'*(0x200-24) + 0x000001f8 + 0x108
接着释放野指针,除法unlink可以绕过检查,让指针指向自己前面的地址。