复杂的栈迁移

admin 2022年12月26日18:40:22程序逆向评论4 views649字阅读2分9秒阅读模式

题目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

原文始发于微信公众号(由由学习吧):复杂的栈迁移

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月26日18:40:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  复杂的栈迁移 http://cn-sec.com/archives/1461099.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: