wusiqi111 / 诡异问题 / __stack_chk_fail栈检查失败

分享

   

__stack_chk_fail栈检查失败

2018-01-19  wusiqi111


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的时间可能是滞后的。在函数退出的时候等。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>