__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栈检查失败相关推荐
- 重装MAC系统 “安装器有效负载签名检查失败” 解决方法
部分朋友反应安装macOS Sierra的时候会提示: "安装器有效负载签名检查失败" 其实这是系统时间不对的原因,把系统时间修改正确就好了. 1,如果电脑正常运行,那么进系统偏好 ...
- WCFAppFabric :异常消息: 内存入口检查失败
WCF&AppFabric :异常消息: 内存入口检查失败 参考文章: (1)WCF&AppFabric :异常消息: 内存入口检查失败 (2)https://www.cnblogs. ...
- oracle执行先决条件检查失败的解决方法
oracle执行先决条件检查失败的解决方法 参考文章: (1)oracle执行先决条件检查失败的解决方法 (2)https://www.cnblogs.com/xiaoxiaoweng/p/72779 ...
- oracle11g安装过程提示swap size 检查失败问题
#time 2016/12/6 00:43 #@auth liu 场景描述:我在自己电脑的虚拟机上linux环境下安装oracle11g数据库. Linux版本为:CentOS release 6.8 ...
- [转载]安装Oracle11gR2先决条件检查失败的详细解决处理过程
原文地址:安装Oracle11gR2先决条件检查失败的详细解决处理过程 作者:四海名汀 最近在32位Win7系统下安装Oracle11g发现一系列错误,现将详细的错误解决过程记录如下,以供大家参考. ...
- [Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性
许多js环境都提供检查调用栈的功能.调用栈是指当前正在执行的活动函数链.在某些旧的宿主环境中,每个arguments对象含有两个额外的属性:arguments.callee和arguments.cal ...
- SQL Server 2005 重装时报:对性能监视器计数器注册表值执行系统配置检查失败
问题描述: SQL Server 2005 卸载之后重新安装,在执行检查时报:对性能监视器计数器注册表值执行系统配置检查失败.有关详细信息,请参阅自述文件或 SQL Server 联机丛书中的&quo ...
- 如何解决 SQL Server 安装程序中的 COM+ 系统配置检查失败问题
转载自:http://technet.microsoft.com/zh-cn/library/ms143690(SQL.90).aspx SQL Server 2005 联机丛书(2008 年 11 ...
- WCF 内存入口检查失败 Memory gates checking failed
WCF 内存入口检查失败 Memory gates checking failed 异常信息:内存入口检查失败,因为可用内存(xxx 字节)少于总内存的 xx%.因此,该服务不可用于传入的请求.若 ...
最新文章
- 什么是java序列化_什么是Java序列化?为什么序列化?序列化有哪些方式?
- 首次安装Pycharm出现No Python interpreter selected解决方法
- java学习与总结:计算机网络
- 拥抱.NET Core系列:MemoryCache 缓存域
- python处理era5_ERA5数据python批量下载程序
- PHP之wampserver修改根目录与默认页面
- File存对象--android 的File存储到SD卡();
- 201612-2 工资计算
- 这篇 CPU Cache,估计也没人看
- Mac pip安装allennlp
- 【C++STL库】stack常用函数学习
- android 设置文本加粗,如何在Android中将文本更改为粗体?
- GetLastError() 返回值对照表
- 继续分享最新版本的autohotkey自己编写的快捷键
- 在机自学院自强队的这一年
- win10html服务器搭建,windows10 系统配置nginx文件服务器的图文教程
- 什么是极大似然估计?
- 差点,参加中国平安保险集团
- PS把图片变透明做logo
- ROS TF2静态坐标发布
热门文章
- 通过Alertmanager实现Prometheus的告警告警配置(邮箱加钉钉)
- 数据科学之 如何找到指标的最 佳分裂点的几个想法
- 分享一下前端浏览的一些网址记录
- Openstack 高可用部署(Ocata版)
- BeanFactory not initialized or already closed - call ‘refresh‘ before accessing beans via the Applic
- 硬件设计22之高速电路设计保险丝的选型
- java的Lambda表达式理解
- tools: rm -vf !(*.sh) 删除 除了
- Linux的网络编程面试题汇总
- 英语用法整理_英式\美式英语区分