zoukankan      html  css  js  c++  java
  • __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的时间可能是滞后的。在函数退出的时候等。

  • 相关阅读:
    身份证验证(c#和js)
    获取焦点问题
    关于加载设计器遇到一个或多个错误问题的解决方案
    关于如何使用自定义的结束消息循环的方式 (转载)
    多种重要源码下载
    关于线程同步(转载)
    ArrayList的使用技巧
    一些所谓有利于家庭生活的优点
    080801 30℃
    080731 31℃
  • 原文地址:https://www.cnblogs.com/qq378829867/p/5978334.html
Copyright © 2011-2022 走看看