标签:err corrupt margin isp linux strong 释放 http 9.png
目录
堆溢出点
伪造空闲堆块
释放时重写指向伪造堆块的指针
如何利用
参考资料
图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
图4 修改string_ptr1的内容
可以看到,由于string_ptr1指向了& string_ptr1-0x18,所以我们修改内容时候,再一次将string_ptr1指针的值修改了。修改为指向free的GOT表项。
此时查看string_ptr1的内容就可以把free函数的地址打印出来了。
这个时候编译string1意味着什么呢?意味着修改free的GOT表项中的地址。那么随后的free调用,起始就是调用我们写入的函数。我们写入system地址
free(string_ptr3)意味着什么?
system(“/bin/sh;”)
[1] linux堆溢出实例分析
伪造堆块绕过unlink检查(ctf-QiangWangCup-2015-shellman)
标签:err corrupt margin isp linux strong 释放 http 9.png
原文地址:http://www.cnblogs.com/shangye/p/6261606.html