CTFer成长日记13:Canary的基本原理与绕过

CTFer成长日记13:Canary的基本原理与绕过
最新回答
山间风

2026-03-22 22:49:12

一、 Canary的基本原理

Canary是一种针对栈溢出攻击的防护手段,其核心在于在栈帧中复制一个随机数 canary ,这个随机数在创建栈帧时紧挨着 rbp 入栈。如果函数退栈返回前,程序比较栈上的canary副本和原始canary,发现二者不一致,则判定发生了栈溢出,程序会立即崩溃。

通过一个简单程序演示Canary工作原理,程序包括关键代码块实现随机数读取与比较。运行该程序,可以观察到栈溢出时的崩溃现象与正常执行情况。

二、Canary的特点

Canary生成的随机数的第一个字节总是0x00,这一设计目的是实现字符串截断,避免随机数泄露。当栈结构包含字符串时,若canary首字节非0x00,会导致随机数泄露。

通过实例说明随机数首字节为0x00的重要性。若随机数与字符串相邻,字符串输出过程可能会导致canary泄露。

三、Canary的绕过

绕过Canary主要方法有两种:逐字节爆破与直接覆盖。

3.1 逐字节爆破

逐字节爆破是尝试获取64位随机数的方法。在Canary场景下,只需尝试7次即可猜到随机数,因为可以轻易判断每个字节是否正确。通过分析程序代码与逻辑,可构造并测试payload,最终实现Canary绕过。

3.2 直接覆盖Canary

利用Glibc线程函数栈帧的特性,若存在足够大的缓冲区溢出或漏洞,可以覆盖原始Canary值,实现绕过。通过分析线程函数栈帧结构,构造payload覆盖Canary,达到绕过效果。