利用gcc自带的功能-fstack-protector检测栈溢出及其实现【转】
转自:https://www.cnblogs.com/leo0000/p/5719186.html
最近又遇到了一个崩溃,栈回溯非常怪异。
![](/assets/blank.gif)
/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]
![](/assets/blank.gif)
其中的xxxxx是公司的模块和函数,故隐藏,对接下去的分析没有影响。
一开始,因为没有接触过__fortify_fail这个函数,另外加上因为有一部分栈回溯没有对应的符号,我以为是数组溢出把栈信息破坏了。但实际上想想不对,如果是栈信息被破坏了,不出意外的话,应该是回溯不到某些很有序的函数的,这些函数我没上。
后来同事无意的一句话,说__fortify_fail是内存检测,我才百度了一下这个__fortify_fail函数,那么这个函数是什么情况下会被调用的呢?
一。gcc编译选项-fstack-protector和-fstack-protector-all
正是我在前面猜测的错误原因,牛人Stack Guard 就想出了保护栈信息的方式,在ebp和ip等信息的地址下面放一个保护数,如果栈溢出,那么这个8位数会被修改,就会导致函数进入栈溢出错误处理函数,也就是导致了上面的栈。
二。比较加选项前后的反汇编代码
源码:
![](/assets/blank.gif)
#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; }
![](/assets/blank.gif)
使用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,所以整个程序前后的差异在于插入两段代码,这两段的代码就是用来检测局部变量。
运行溢出时的栈
![](/assets/blank.gif)
#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 ()
![](/assets/blank.gif)
与本文最前面的错误是一致的
三。走读代码修改错误。
四。总结
当然这个举措并不能够完全的抑制栈溢出,如果跳过了保护数,那么还是检测不到栈溢出的,并且对其他的局部变量溢出没有保护。当然每个变量都保护会大大增加程序复杂度。
转载于:https://www.cnblogs.com/sky-heaven/p/9237758.html
利用gcc自带的功能-fstack-protector检测栈溢出及其实现【转】相关推荐
- 利用gcc自带的功能-fstack-protector检测栈溢出及其实现
最近又遇到了一个崩溃,栈回溯非常怪异. /lib/i386-linux-gnu/libc.so.6(gsignal+0x4f) [0xb2b751df] /lib/i386-linux-gnu/lib ...
- 虚拟机可以做成存储服务器吗,利用win10自带虚拟机功能轻松打造家用nas
利用win10自带虚拟机功能轻松打造家用nas 2020-11-17 11:53:29 16点赞 95收藏 26评论 创作立场声明:本文所有内容原创,所涉及产品均自费购置.无利益关系.观众大人们可自行 ...
- w10虚拟服务器,利用win10自带虚拟机功能轻松打造家用nas
利用win10自带虚拟机功能轻松打造家用nas 2020-11-17 11:53:29 16点赞 96收藏 26评论 创作立场声明:本文所有内容原创,所涉及产品均自费购置.无利益关系.观众大人们可自行 ...
- Excel:Excel使用技巧经验总结之(利用Excel自带功能统计各个字段不同类别及其个数并进行图表可视化+非编程实现)图文教程之详细攻略
Excel:Excel使用技巧经验总结之(利用Excel自带功能统计各个字段不同类别及其个数并进行图表可视化+非编程实现)图文教程之详细攻略 目录 利用Excel自带筛选功能统计各个字段不同类别及其个 ...
- 用计算机按数字铃声,利用计算机自带功能设置校园和谐铃声
目前,无论城市学校还是边远农村中小学,上级行政部门都要求在学校大门口及重点部位安装监控设备,凡是进入学校的人员,都是监控的对象,这些监控设备每天24小时都在工作,将监控到的情况传输到专门配置的计算机中 ...
- 利用gcc的-finstrument-functions获取函数轨迹跟踪
在软件系统的性能及架构考量中,将特定运行顺序的函数按照运行顺序进行编译,有利于提高软件的运行效率. 在一个已有的大型软件系统中,获取软件相关函数的运行顺序,可以利用gcc自动的-finstrume ...
- 利用Cadence Allegro强大的功能节省您调丝印的时间
本文转载自 https://www.mr-wu.cn 调丝印.拉等长.撩妹是老wu的工作日常,? 现在,随着Cadence Allegro 新版本的发布,其加入了强大的丝印辅助功能,让你不用再苦逼的浪 ...
- allegro 丝印 对齐_利用Cadence Allegro强大的功能节省您调丝印的时间
调丝印.拉等长.撩妹是老wu的工作日常,? 现在,随着Cadence Allegro 新版本的发布,其加入了强大的丝印辅助功能,让你不用再苦逼的浪费时间去调丝印,能省下更多的时间来撩妹- 好吧,也许你 ...
- VC++利用笔记本自带摄像头扫二维码功能(附源码demo)
VC++开发常用功能一系列文章 (欢迎订阅,持续更新...) 第8章:VC++利用笔记本自带摄像头扫二维码功能(附源码demo) 源代码demo已上传到百度网盘:永久生效 ,代码实现了打开笔记本 ...
最新文章
- num2cell用法
- MBR与GPT分区格式(实例-创建大于2TB的分区)
- 【转】Java finally语句到底是在return之前还是之后执行?
- 在secureCRT软件上运行一些简单的python脚本
- ASP.NET Core 认证与授权[4]:JwtBearer认证
- 前5个有用的隐藏Eclipse功能
- 从外部调用Django模块
- 移动端实时3D目标检测,谷歌开源出品,安卓下载就能用
- fglrx 9.8与kernel 2.6.30
- android实现计算器功能吗,安卓实现一个计算器的功能
- rk3288 lvds屏参资料_RK3288四核高性能主板,微型工业主机
- 计算机如何更改键盘设置在哪里设置,原神pc按键怎么改
- 策略模式:网络小说的固定套路
- asp.net开发wap程序必备:识别来访手机品牌型号【来源网络】
- 利用arcmap提取河流中心线
- TextRNN+attention
- what is Differential steering and skid steering ?
- ES6中的字符串API.md
- 从平安普惠捆绑意外险,看最强金融生存法则:底子厚、路子野、扛得住
- 【STM32 嵌入式课程实验】实验一 单个LED灯的闪烁