最近又遇到了一个崩溃,栈回溯非常怪异。

/lib/i386-linux-gnu/libc.so.6(gsignal+0x4f) [0xb2b751df]
/lib/i386-linux-gnu/libc.so.6(abort+0x175) [0xb2b78825]
/lib/i386-linux-gnu/libc.so.6(+0x6b39a) [0xb2bb239a]
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x45) [0xb2c4b0e5]
/lib/i386-linux-gnu/libc.so.6(+0x102eba) [0xb2c49eba]
/ramdisk/xxxxxx() [0x8467639]
/ramdisk/xxxxxx() [0x849a802]
/ramdisk/xxxxxx() [0x84b75da]
/ramdisk/xxxxxx(xxxxxxxxxxxx+0x444) [0x84b9224]

  其中的xxxxx是公司的模块和函数,故隐藏,对接下去的分析没有影响。

  一开始,因为没有接触过__fortify_fail这个函数,另外加上因为有一部分栈回溯没有对应的符号,我以为是数组溢出把栈信息破坏了。但实际上想想不对,如果是栈信息被破坏了,不出意外的话,应该是回溯不到某些很有序的函数的,这些函数我没上。

  后来同事无意的一句话,说__fortify_fail是内存检测,我才百度了一下这个__fortify_fail函数,那么这个函数是什么情况下会被调用的呢?

一。gcc编译选项-fstack-protector和-fstack-protector-all

  正是我在前面猜测的错误原因,牛人Stack Guard 就想出了保护栈信息的方式,在ebp和ip等信息的地址下面放一个保护数,如果栈溢出,那么这个8位数会被修改,就会导致函数进入栈溢出错误处理函数,也就是导致了上面的栈。

二。比较加选项前后的反汇编代码

  源码:

#include <stdio.h>
int main()
{char a;int i;memcpy(&a,"ss",2);printf("1\n");memcpy(&i,"sssss",4);printf("2\n");return 0;
}

  使用gdb调试该程序,首先查看a和i的地址,

(gdb) p &a
$1 = 0xbffff69b "\b\364\037\374\267\220\204\004\b"
(gdb) p &i
$2 = (int *) 0xbffff694

  显然变量a的地址要高,更接近栈顶。可以证明i的溢出并不一定能被检测到,而a的检测一定会被检测到。

  看下汇编代码的对比。

  movw $0x7373那句话就是往a里面拷贝ss,所以整个程序前后的差异在于插入两段代码,这两段的代码就是用来检测局部变量。

  运行溢出时的栈

#0  0xb7fdd424 in __kernel_vsyscall ()
#1  0xb7e4f1ef in raise () from /lib/i386-linux-gnu/libc.so.6
#2  0xb7e52835 in abort () from /lib/i386-linux-gnu/libc.so.6
#3  0xb7e8a2fa in ?? () from /lib/i386-linux-gnu/libc.so.6
#4  0xb7f20dd5 in __fortify_fail () from /lib/i386-linux-gnu/libc.so.6
#5  0xb7f20d8a in __stack_chk_fail () from /lib/i386-linux-gnu/libc.so.6
#6  0x08048485 in main ()

  与本文最前面的错误是一致的

三。走读代码修改错误。

四。总结

  当然这个举措并不能够完全的抑制栈溢出,如果跳过了保护数,那么还是检测不到栈溢出的,并且对其他的局部变量溢出没有保护。当然每个变量都保护会大大增加程序复杂度。

转载于:https://www.cnblogs.com/leo0000/p/5719186.html

利用gcc自带的功能-fstack-protector检测栈溢出及其实现相关推荐

  1. 利用gcc自带的功能-fstack-protector检测栈溢出及其实现【转】

    转自:https://www.cnblogs.com/leo0000/p/5719186.html 最近又遇到了一个崩溃,栈回溯非常怪异. /lib/i386-linux-gnu/libc.so.6( ...

  2. 虚拟机可以做成存储服务器吗,利用win10自带虚拟机功能轻松打造家用nas

    利用win10自带虚拟机功能轻松打造家用nas 2020-11-17 11:53:29 16点赞 95收藏 26评论 创作立场声明:本文所有内容原创,所涉及产品均自费购置.无利益关系.观众大人们可自行 ...

  3. w10虚拟服务器,利用win10自带虚拟机功能轻松打造家用nas

    利用win10自带虚拟机功能轻松打造家用nas 2020-11-17 11:53:29 16点赞 96收藏 26评论 创作立场声明:本文所有内容原创,所涉及产品均自费购置.无利益关系.观众大人们可自行 ...

  4. Excel:Excel使用技巧经验总结之(利用Excel自带功能统计各个字段不同类别及其个数并进行图表可视化+非编程实现)图文教程之详细攻略

    Excel:Excel使用技巧经验总结之(利用Excel自带功能统计各个字段不同类别及其个数并进行图表可视化+非编程实现)图文教程之详细攻略 目录 利用Excel自带筛选功能统计各个字段不同类别及其个 ...

  5. 用计算机按数字铃声,利用计算机自带功能设置校园和谐铃声

    目前,无论城市学校还是边远农村中小学,上级行政部门都要求在学校大门口及重点部位安装监控设备,凡是进入学校的人员,都是监控的对象,这些监控设备每天24小时都在工作,将监控到的情况传输到专门配置的计算机中 ...

  6. 利用gcc的-finstrument-functions获取函数轨迹跟踪

    在软件系统的性能及架构考量中,将特定运行顺序的函数按照运行顺序进行编译,有利于提高软件的运行效率. 在一个已有的大型软件系统中,获取软件相关函数的运行顺序,可以利用gcc自动的-finstrume ...

  7. 利用Cadence Allegro强大的功能节省您调丝印的时间

    本文转载自 https://www.mr-wu.cn 调丝印.拉等长.撩妹是老wu的工作日常,? 现在,随着Cadence Allegro 新版本的发布,其加入了强大的丝印辅助功能,让你不用再苦逼的浪 ...

  8. allegro 丝印 对齐_利用Cadence Allegro强大的功能节省您调丝印的时间

    调丝印.拉等长.撩妹是老wu的工作日常,? 现在,随着Cadence Allegro 新版本的发布,其加入了强大的丝印辅助功能,让你不用再苦逼的浪费时间去调丝印,能省下更多的时间来撩妹- 好吧,也许你 ...

  9. VC++利用笔记本自带摄像头扫二维码功能(附源码demo)

      VC++开发常用功能一系列文章 (欢迎订阅,持续更新...) 第8章:VC++利用笔记本自带摄像头扫二维码功能(附源码demo) 源代码demo已上传到百度网盘:永久生效  ,代码实现了打开笔记本 ...

最新文章

  1. 征战蓝桥 —— 2018年第九届 —— C/C++B组第3题——乘积尾零
  2. 初创公司股本结构_我如何向初创公司的开发团队添加一些结构-以及从过程中学到的东西
  3. 从华为看企业高效产品的研发管理
  4. DailyWallpaper v1.02 released
  5. redis 永不过期_Redis系列八Redis数据过期策略详解
  6. 【应用推荐】常见资源管理器整理,内含使用体验和个人使用推荐
  7. java.lang.NoClassDefFoundError: org/jaxen/JaxenException
  8. 计算机基础表格制作教学设计,word中表格制作教学设计精选
  9. python counter_如何获得按输入顺序排序的python Counter输出?
  10. 域名升级访问中拿笔记好_好记性也应做笔记,安利一款比onenote更好用的云笔记工具...
  11. 阵列信号处理笔记-波达方向DOA-子空间方法
  12. 服务器微信互通是什么意思,妄想山海微信区和QQ区互通吗,服务器互通数据详解...
  13. Axure RP9 制作下拉式菜单
  14. Centos7系统启动盘的正确安装姿势
  15. Python|动态规划问题--斐波那契数列
  16. CVPR 2018 论文解读集锦
  17. 【小西】优化若依导出功能,若依继承导出
  18. 電子郵件退信原因及寄信錯誤查詢
  19. 实习时候的亚子==(一)
  20. 【数据获取】GGGIS下载谷歌、天地图等地图数据

热门文章

  1. 顶级俄国数学家是怎样炼成的?[2016-06-25 张羿 赛先生]
  2. SharePoint 向多行文本类型字段插入特殊类型链接
  3. 不做旁观者,给博主最有力的支持——博客之星评选,期待您的支持,谢谢路过的朋友投上您宝贵的一票...
  4. 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别...
  5. C++手动实现库函数
  6. 网站设计大访问量应用的解决方案
  7. 如何解决内网中网络被限制的问题
  8. 今天写的一个makefile,备份下
  9. 06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
  10. python量化交易第一天_《Python量化交易教程》第一部分新手入门 第1天:谁来给我讲讲Python?...