题目libc是2.23,注意事项:io、nop
首先这道题看上去和正常的栈迁移没什么区别,但是实际上坑处有点多,先看看程序:
还比较好,然后看看main:
第一个是初始化io函数,我们进vul里面看看
第一次输入0x250大小的数据到bss上,然后第二次输入的时候出现栈溢出,看上去我们只需要常规的leave;ret就行,其实里面包含很多坑。
首先想到的就是在bss上布局rop泄漏puts的地址吧?这是第一个坑(会io执行不下去的)
我们看看为啥:
name的上方就是io相关的地址,当我们使用puts的时候puts函数会产生临时参数往上写入迁移的栈中正好覆盖了io,而puts会调用io相关内容,所以导致程序发生信号中断
那么我们多加几个ret是不是就好了?毕竟大小有0x250,可以写很多了(理论上可以,但是实际运行下去会发现rbp=0了,当leave的时候会先mov rsp rbp,这样会明显执行不下去,rbp不是个有效的地址,所以得考虑恢复rbp)
还有个坑如果不考虑恢复rbp的话可以不给name,下面直接name-8就可以rop了。但是这里考虑恢复rbp就用一个name给rbp,然后下面用name就可以了?(还是不行,我们看看源代码)
在执行leave;ret的时候发现还nop了的,所以这里得用两个name下面是name+8
看看exp:
最终获得完整的shell
为什么这里不用system,因为system同样的问题就是对栈的需求较高,所以改用了execv
原文始发于微信公众号(由由学习吧):复杂的栈迁移
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论