伪造堆块绕过unlink检查(ctf-QiangWangCup-2015-shellman)
Posted 一肩担风月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了伪造堆块绕过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堆溢出实例分析
以上是关于伪造堆块绕过unlink检查(ctf-QiangWangCup-2015-shellman)的主要内容,如果未能解决你的问题,请参考以下文章