栈迁移面试做题复现

前言

在面试星盟安全的时候,遇到一道栈迁移的题,因为好久没做题了,花了很久的时间才做出来,现在专门写一篇博客记录一下

栈迁移

栈迁移主要就是在恢复栈地址后,返回到leave继续恢复,就能够根据我们覆盖的ebp的值去将栈偏移过去,也就是可以将执行流给转移过去。最主要的利用难度就是如何控制迁移过去的地址上面的值,

一种是泄露当前ebp的值然后栈迁移到当前栈地址的前面,利用我们写进去的脏数据来ROP,

还有一种就是利用read和一些现成的其他函数去控制对应地址,这里一般就是转移到bss段去控制(bss段含有一些其他的数据,在后面执行函数的时候可能会有影响,所以我们一般选取具有写权限的高地址的地址)

题目详情

image-20230317103111585

这里由于汇编较为简单,于是我就直接放的汇编。

没有开启pie保护,没有system函数,于是需要泄露libc地址

  • 这里存在栈溢出漏洞,但只允许溢出16个字节
  • 于是我们考虑栈迁移
  • 但是没有其他函数泄露ebp的地址,于是我们可以利用现成的read函数,可以看到read函数的rsi是由rbp-0x60控制的,于是我们控制ebp即可,就可以控制ebp-0x60地址上的值
  • 再在ebp的地址上写入ebp-0x60的值后,leave_ret就能将执行流给控制到rbp-0x60的位置去执行我们的ROP了
  • 后面再按照正常的泄露libc,ROP就行。