SROP及例题
SROP
使用条件
有时候函数没有输出函数,无法使用ret2libc(或者直接没有got表)
条件
1.存在
1 | mov eax,0fh |
这样的指令(系统调用号15)sigreturn
2.还有较长的读取空间
3.有syscall_ret
4.有/bin/sh(若没有则需要自己写入)
可以通过栈溢出来控制栈的内容
需要知道相应的地址
“/bin/sh”
Signal Frame
syscall
sigreturn
需要有够大的空间来塞下整个 sigal frame
基本原理
ctf-wiki上面有
- 总结一下就是调用了sigreturn后面程序会进入一个挂起的状态
- 然后将此时的状态压入栈中
- 然后在sigreturn中填写指令
- 最后程序会返回原来的状态
例题
现在以一道例题来说明这个知识点
buu上面的ciscn_2019_s_3
先检查函数,64位,没有canary
再打开ida查看函数
发现有个gadgets
点进去看看
发现可以系统调用号15 可以使用SROP取得这一个题目的权限
先看函数
会打印出一串东西
动态调试看看
看到在‘aaaaaaaa’后面打印出来了其他的
先写个脚本找找
1 | from pwn import * |
找到这个libc的地址,因此我们可以得到我们写入数据在栈上面的位置,因为这个题目里面没有/bin/sh\x00,所以我们可以在开始时写入
又3b08h-3c90h=148h
所以可以知道
leak_addr-0x148是我们输入的位置
这下可以求出/bin/sh的地址了
现在我们在要在ida中找syscall
找到了
因此我们可以开始构造攻击了
1 | from pwn import * |
注:SROP的构造
1 | sigframe = SigreturnFrame() |
这段是pwntools自己集成的攻击手法,可以改变寄存器的值
最后拿到权限
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 鱼非愚!
评论
ValineDisqus