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

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

/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/sky-heaven/p/9237758.html

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

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

    最近又遇到了一个崩溃,栈回溯非常怪异. /lib/i386-linux-gnu/libc.so.6(gsignal+0x4f) [0xb2b751df] /lib/i386-linux-gnu/lib ...

  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. jQuery 3.0的domManip浅析
  2. java 画布实验报告_编辑画布图像
  3. 使用View modification扩展SAP Fiori应用的一个案例
  4. 华为回怼特朗普;中兴首款 5G 上市;iPhone 可免息分期购买 | 极客头条
  5. 手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理
  6. PhpED和Zend Studio for Eclipse的Debugger配置
  7. VS工程下的tlb, tlh, tli文件说明(COM)
  8. 中国60家最强汽车初创在此!芯片厂高调入局,智能网联强势霸榜
  9. 家用 NAS 服务器(2)| HyperV的Winserver 2022和Ubuntu 22.04双系统
  10. UVa 437 The Tower of Babylon (DAG最长路)
  11. Android - 自定义控件
  12. 智源社区AI周刊No.97:Bengio新论文用GFlowNets统一生成模型;北大发布AI for EDA数据集...
  13. python列表get方法_Python json.get方法代码示例
  14. MTK支持的DRM简介
  15. Python 学习入门(26)—— 装饰器
  16. 考研英语作文万能句子模板50个
  17. Java实现凑硬币或者最少硬币数
  18. poj 1205 :Water Treatment Plants (DP+高精度)
  19. 深度学习_目标检测_Soft-MNS详解
  20. 哈夫曼编码Java实现

热门文章

  1. Analys 版本历史
  2. 插画放在网页里面竟然这么好看!
  3. 一个完全免费的在线画图网站
  4. 基于Spark MLlib 在IDEA环境实现Kmeans 算法
  5. UnityVR-机械臂场景1-搭建场景
  6. HMI-45-【控制台】控制台代码迁移
  7. jsp和html的区别以及jsp是如何实现动态的
  8. 技术解析 | ZEGO 移动端超分辨率技术
  9. 怎样获取苹果APP里的资源图片
  10. 规则引擎在营销中的促销返利起到什么作用?