__stack_chk_fail栈检查失败

Posted smartch

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了__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栈检查失败的主要内容,如果未能解决你的问题,请参考以下文章

Canary5种绕过方式 栈溢出保护及整数保护

[caffe]:检查失败:检查失败:hdf_blobs_[i]->shape(0) == num (200 vs. 6000)

iOS 13.4 应用程序崩溃,消息模糊:前置条件失败:类型检查失败:101,预期文本,得到 _HiddenModifier

Oracle安装时先决条件检查失败的解决方案:

Linux下安装Oracle10g提示内核参数检查失败

解决重装Mac系统时“安装器有效负载签名检查失败”的错误