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栈检查失败相关推荐

  1. 重装MAC系统 “安装器有效负载签名检查失败” 解决方法

    部分朋友反应安装macOS Sierra的时候会提示: "安装器有效负载签名检查失败" 其实这是系统时间不对的原因,把系统时间修改正确就好了. 1,如果电脑正常运行,那么进系统偏好 ...

  2. WCFAppFabric :异常消息: 内存入口检查失败

    WCF&AppFabric :异常消息: 内存入口检查失败 参考文章: (1)WCF&AppFabric :异常消息: 内存入口检查失败 (2)https://www.cnblogs. ...

  3. oracle执行先决条件检查失败的解决方法

    oracle执行先决条件检查失败的解决方法 参考文章: (1)oracle执行先决条件检查失败的解决方法 (2)https://www.cnblogs.com/xiaoxiaoweng/p/72779 ...

  4. oracle11g安装过程提示swap size 检查失败问题

    #time 2016/12/6 00:43 #@auth liu 场景描述:我在自己电脑的虚拟机上linux环境下安装oracle11g数据库. Linux版本为:CentOS release 6.8 ...

  5. [转载]安装Oracle11gR2先决条件检查失败的详细解决处理过程

    原文地址:安装Oracle11gR2先决条件检查失败的详细解决处理过程  作者:四海名汀 最近在32位Win7系统下安装Oracle11g发现一系列错误,现将详细的错误解决过程记录如下,以供大家参考. ...

  6. [Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性

    许多js环境都提供检查调用栈的功能.调用栈是指当前正在执行的活动函数链.在某些旧的宿主环境中,每个arguments对象含有两个额外的属性:arguments.callee和arguments.cal ...

  7. SQL Server 2005 重装时报:对性能监视器计数器注册表值执行系统配置检查失败

    问题描述: SQL Server 2005 卸载之后重新安装,在执行检查时报:对性能监视器计数器注册表值执行系统配置检查失败.有关详细信息,请参阅自述文件或 SQL Server 联机丛书中的&quo ...

  8. 如何解决 SQL Server 安装程序中的 COM+ 系统配置检查失败问题

    转载自:http://technet.microsoft.com/zh-cn/library/ms143690(SQL.90).aspx SQL Server 2005 联机丛书(2008 年 11 ...

  9. WCF 内存入口检查失败 Memory gates checking failed

    WCF 内存入口检查失败 Memory gates checking failed   异常信息:内存入口检查失败,因为可用内存(xxx 字节)少于总内存的 xx%.因此,该服务不可用于传入的请求.若 ...

最新文章

  1. 什么是java序列化_什么是Java序列化?为什么序列化?序列化有哪些方式?
  2. 首次安装Pycharm出现No Python interpreter selected解决方法
  3. java学习与总结:计算机网络
  4. 拥抱.NET Core系列:MemoryCache 缓存域
  5. python处理era5_ERA5数据python批量下载程序
  6. PHP之wampserver修改根目录与默认页面
  7. File存对象--android 的File存储到SD卡();
  8. 201612-2 工资计算
  9. 这篇 CPU Cache,估计也没人看
  10. Mac pip安装allennlp
  11. 【C++STL库】stack常用函数学习
  12. android 设置文本加粗,如何在Android中将文本更改为粗体?
  13. GetLastError() 返回值对照表
  14. 继续分享最新版本的autohotkey自己编写的快捷键
  15. 在机自学院自强队的这一年
  16. win10html服务器搭建,windows10 系统配置nginx文件服务器的图文教程
  17. 什么是极大似然估计?
  18. 差点,参加中国平安保险集团
  19. PS把图片变透明做logo
  20. ROS TF2静态坐标发布

热门文章

  1. 通过Alertmanager实现Prometheus的告警告警配置(邮箱加钉钉)
  2. 数据科学之 如何找到指标的最 佳分裂点的几个想法
  3. 分享一下前端浏览的一些网址记录
  4. Openstack 高可用部署(Ocata版)
  5. BeanFactory not initialized or already closed - call ‘refresh‘ before accessing beans via the Applic
  6. 硬件设计22之高速电路设计保险丝的选型
  7. java的Lambda表达式理解
  8. tools: rm -vf !(*.sh) 删除 除了
  9. Linux的网络编程面试题汇总
  10. 英语用法整理_英式\美式英语区分