重新做了一下低版本的unlink漏洞攻击,有了新的感悟,发现其实以前根本没搞明白
#define unlink(AV, P, BK, FD) {
FD = P->fd;
BK = P->bk;
//检查p和其前后的chunk是否构成双向链表
if (__builtin_expect (FD->bk != P || BK->fd != P, 0))
malloc_printerr (check_action, "corrupted double-linked list", P, AV);
else
{
FD->bk = BK;
BK->fd = FD;
这是unlink前两个相邻堆块合并前的unlink的操作
在此操作之前,会检查释放的堆块的pre_size和前一个chunk的size是否匹配得上,然后再去看自己得size位得in_use位是否是置为零的。
还是以bamboobox的题目为例,真的重做一遍发现,又理解了许多。
这里我先写下我做题(低版本)这种unlink漏洞利用的理解:
首先unlink操作是发生在unsortedbin里的,也就是说我们构造的堆块必须要大小要是大于等于0x80(包括chunk头的话实际上是0x90,这是最起码的),然后就是构造假的chunk,注意注意,unlink的漏洞利用的条件是,首先最最最起码要有一个off by one的漏洞,接着就是构造一个假的chunk,最重要的是构造它的fd,bk指针,还要去修改下一个chunk的presize位和假chunk的size对得上,注意注意,假chunk的size位的in_use位要为1。
(4条消息) 【PWN-HEAP】Unlink学习笔记_pwn heap unlink_Tr@cer的博客-CSDN博客
另外贴上这位大佬的博客,里面的调试信息非常得清楚。
然后谈谈我的理解,这个假chunk的fd bk指针的构造需要特定的地址才能绕过unlink的检测的
先下个结论:首先要找到合适的地址,按照ctfwiki上面的说法是,选取的地址必须是指向一个chunk。可以去试试,不满足这个条件就会报错,耐心调试就行