内核栈溢出保护

linux内核中有个编译选项CC_STACKPROTECTOR用来开启GCC的stack-protector功能,
这个功能是在GCC4.9版本中引入,用来检测栈是否遭到溢出攻击。


目前我们用的版本中开启了这两个选项CONFIG_CC_STACKPROTECTOR、CONFIG_CC_STACKPROTECTOR_REGULAR。


编译器栈溢出保护原理:
函数栈存储结构,从栈底往上一般是形参,返回地址,控制信息(EBP),局部变量。
栈溢出往往是局部变量超过了他自身的存储位置,覆盖到了返回地址,
如果返回地址被恶意攻击者利用,就会导致执行攻击者设计的代码,造成安全隐患。
编译器对栈溢出的保护就是在控制信息前面多存储一个特殊的canary word,
函数返回时检测canary word是否有被改写,如果被改写,意味着发生了栈溢出。


以下面代码为例,看下栈溢出的过程:
int vulFunc() {
    char name[10];
    //…
    return 0;

}

图 1. 溢出前的函数栈
溢出前的函数栈
图 2. 溢出后的函数栈
溢出后的函数栈


如果能在运行时检测出这种破坏,就有可能对函数栈进行保护。目前的堆栈保护实现大多使用基于 “Canaries” 的探测技术来完成对这种破坏的检测。


GCC 4.9 中三个与堆栈保护有关的编译选项
-fstack-protector:
启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码。
-fstack-protector-all:
启用堆栈保护,为所有函数插入保护代码。
-fno-stack-protector:
禁用堆栈保护。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值