首页 > 代码库 > 伪造堆块绕过unlink检查(ctf-QiangWangCup-2015-shellman)
伪造堆块绕过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堆溢出实例分析
http://tyrande000.how/2016/03/21/linux%E5%A0%86%E6%BA%A2%E5%87%BA%E5%AE%9E%E4%BE%8B%E5%88%86%E6%9E%90/
伪造堆块绕过unlink检查(ctf-QiangWangCup-2015-shellman)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。