复杂的栈迁移

admin 2022年12月26日18:40:22评论24 views字数 649阅读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

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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月26日18:40:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   复杂的栈迁移http://cn-sec.com/archives/1461099.html

发表评论

匿名网友 填写信息