double free
double free 利用
unlink漏洞1
2
3
4FD = 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可以绕过检查,让指针指向自己前面的地址。