深入解析Stack Canaries:从原理到实战防御

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

1. Stack Canaries的工作原理

想象一下你家的防盗门装了一个特殊的报警器。如果有人试图撬锁,报警器会立即响起。Stack Canaries在计算机安全领域扮演着类似的角色,它是栈溢出攻击的第一道防线。

这个技术的名字来源于煤矿中的金丝雀——矿工们带着金丝雀下井,如果金丝雀突然死亡,就说明矿井中有毒气泄漏。在计算机系统中,Stack Canaries就是这只"金丝雀",当它被破坏时,系统就知道发生了栈溢出攻击。

具体来说,Stack Canaries是一个随机生成的数值,被放置在函数栈帧中返回地址之前的位置。由于栈溢出攻击通常需要覆盖返回地址来控制程序执行流程,攻击者必须先覆盖这个Canary值。在函数返回前,系统会检查这个值是否被修改。如果发现值被篡改,程序会立即终止并报错,防止攻击者利用栈溢出漏洞。

2. Stack Canaries的类型与实现

2.1 Terminator Canaries

这类Canaries特别针对字符串操作引发的栈溢出。它们通常包含像NULL(0x00)、CR(0x0d)、LF(0x0a)和EOF(0xff)这样的终止字符。因为这些字符会截断大多数字符串操作,所以攻击者很难通过字符串操作来覆盖Canary而不触发终止。

我在实际项目中遇到过这样的情况:一个使用strcpy()函数的漏洞,攻击者试图通过长字符串覆盖返回地址。由于使用了Terminator Canaries,攻击字符串在遇到0x00字符时就被截断了,攻击因此失败。

2.2 Random Canaries

这类Canaries在程序启动时随机生成,通常来自/dev/urandom或时间哈希。随机性使得攻击者难以猜测正确的Canary值。不过,如果攻击者能够读取内存,还是有可能获取到这个值。

在Linux系统中,Random Canaries通常存储在Thread Local Storage(TLS)中,通过fs寄存器(32位系统是gs寄存器)访问。具体来说,在x86-64架构中,Canary值存储在fs:0x28的位置。

2.3 Random XOR Canaries

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值