伪造堆块绕过unlink检查(ctf-QiangWangCup-2015-shellman)
目录
堆溢出点
伪造空闲堆块
释放时重写指向伪造堆块的指针
如何利用
参考资料
堆溢出点
图1 堆溢出点
在edit函数中,没有对输入的长度和原来的长度做判断。
伪造空闲堆块
正常的堆块布局
图2 正常堆块布局
溢出后内存布局
图3 溢出后堆块布局
释放时重写指向伪造堆块的指针
FD = P->fd; \ BK = P->bk; \ 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;
这样就使得string_ptr1=&string_ptr1-0x18
如何利用
编辑string1的内容
图4 修改string_ptr1的内容
可以看到,由于string_ptr1指向了& string_ptr1-0x18,所以我们修改内容时候,再一次将string_ptr1指针的值修改了。修改为指向free的GOT表项。
查看string1内容
此时查看string_ptr1的内容就可以把free函数的地址打印出来了。
再一次编辑string1的内容
这个时候编译string1意味着什么呢?意味着修改free的GOT表项中的地址。那么随后的free调用,起始就是调用我们写入的函数。我们写入system地址
释放string3
free(string_ptr3)意味着什么?
system(“/bin/sh;”)
参考资料
[1] linux堆溢出实例分析
本文版权归作者所有,欢迎转载,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。