首页 > 代码库 > __stack_chk_fail栈检查失败

__stack_chk_fail栈检查失败

1. __stack_chk_fail的作用

在了函数的局部变量和保存的指令指针(译注:此处指返回地址和EBP)之间。这个值被称作金丝雀(“canary”)值

参考

http://www.freebuf.com/articles/system/24177.html

 

2. 发生原因及原理

数组越界写入,导致 canary值被修改。在函数退出时检查canary,发现canary被修改,函数不能安全返回,call到__stack_chk_fail函数,abort当前线程

2.1函数调用栈布局中canary位置

技术分享

ESP:堆栈(Stack)指针寄存器,指向堆栈顶部
EBP:基址指针寄存器,指向当前堆栈底部

局部变量往低位地址增长,调用栈也是往位地址增长

canary位置:高于局部变量,低于EBP

所以诱发金丝雀的原因可能是:函数比局部变量更高的地址被修改

 

3. 经典案例

sprintf()输入的数据长度过大,溢出到canary中。导致奇怪的现象。

http://stackoverflow.com/questions/3037636/very-strange-stack-overflow-in-c-program

 

4.容易引发__stack_chk_fail的常见原因及函数

根据发生原因可知,一般发生在越界写入

When you increased the size of your local variable, you ran out of stack space:

http://stackoverflow.com/questions/29571930/xcode-pthread-kill-20

函数

sprintf

5.奇怪现象

crash的地方是被影响的地方,而不一定是发生越界的访问的地方。所以crash的时间可能是滞后的。在函数退出的时候等。

 

__stack_chk_fail栈检查失败