利用gcc自带的功能-fstack-protector检测栈溢出及其实现
最近又遇到了一个崩溃,栈回溯非常怪异。
/lib/i386-linux-gnu/libc.so.(gsignal+0x4f) [0xb2b751df]
/lib/i386-linux-gnu/libc.so.(abort+0x175) [0xb2b78825]
/lib/i386-linux-gnu/libc.so.(+0x6b39a) [0xb2bb239a]
/lib/i386-linux-gnu/libc.so.(__fortify_fail+0x45) [0xb2c4b0e5]
/lib/i386-linux-gnu/libc.so.(+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",);
printf("1\n");
memcpy(&i,"sssss",);
printf("2\n");
return 0;
}
使用gdb调试该程序,首先查看a和i的地址,
(gdb) p &a
$ = 0xbffff69b "\b\364\037\374\267\220\204\004\b"
(gdb) p &i
$ = (int *) 0xbffff694
显然变量a的地址要高,更接近栈顶。可以证明i的溢出并不一定能被检测到,而a的检测一定会被检测到。
看下汇编代码的对比。
movw $0x7373那句话就是往a里面拷贝ss,所以整个程序前后的差异在于插入两段代码,这两段的代码就是用来检测局部变量。
运行溢出时的栈
# 0xb7fdd424 in __kernel_vsyscall ()
# 0xb7e4f1ef in raise () from /lib/i386-linux-gnu/libc.so.
# 0xb7e52835 in abort () from /lib/i386-linux-gnu/libc.so.
# 0xb7e8a2fa in ?? () from /lib/i386-linux-gnu/libc.so.
# 0xb7f20dd5 in __fortify_fail () from /lib/i386-linux-gnu/libc.so.
# 0xb7f20d8a in __stack_chk_fail () from /lib/i386-linux-gnu/libc.so.
# 0x08048485 in main ()
与本文最前面的错误是一致的
三。走读代码修改错误。
四。总结
当然这个举措并不能够完全的抑制栈溢出,如果跳过了保护数,那么还是检测不到栈溢出的,并且对其他的局部变量溢出没有保护。当然每个变量都保护会大大增加程序复杂度。
利用gcc自带的功能-fstack-protector检测栈溢出及其实现的更多相关文章
- 利用gcc自带的功能-fstack-protector检测栈溢出及其实现【转】
转自:https://www.cnblogs.com/leo0000/p/5719186.html 最近又遇到了一个崩溃,栈回溯非常怪异. /lib/i386-linux-gnu/libc.so.6( ...
- 利用VS自带发布功能实现web项目快速部署
你还在使用最原始的方法部署服务器吗?还在把项目文件全部复制然后黏贴到服务器上?这种方法太low而且又慢又不安全(存在源码泄露等安全性问题),如果你是这样,那你自己肯定也为此烦恼不已. 下面我所要讲到的 ...
- 利用微信企业号的告警功能,联动检测ICMP的shell脚本
作者:邓聪聪 由于设备IP众多,为了及时发现IP地址有不可达现象,利用微信的联动报警,及时发现问题,以下是脚本内容!!! ping.sh #!/bin/bash ###SCRIPT_NAME:icmp ...
- 痞子衡嵌入式:一次利用IAR自带CRC完整性校验功能的实践(为KBOOT加BCA)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是利用IAR自带CRC完整性校验功能的一次实践(为KBOOT加BCA). 痞子衡之前写过两篇关于IAR中自带CRC校验功能的文章 < ...
- 调用Android自带日历功能(日历列表单、添加一个日历事件)
调用Android自带日历功能 觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有 ...
- 利用win10自带的系统配置禁止开机启动项和程序
一.利用win10自带的系统配置禁止开机启动项和程序 首先打开"运行"对话框,可以通过开始菜单打开运行,也可以按下快捷键WIN+R打开"运行".如下图. ...
- Java中的大小写字母相互转换(不利用Java自带的方法)
Java中的大小写字母相互转换(不利用Java自带的方法) 1.设计源码 /** * * @title:UpperAndLower.java * @Package:com.you.utils * @D ...
- ASP.NET Core 实现带认证功能的Web代理服务器
引言 最近在公司开发了一个项目,项目部署架构图如下: 思路 如图中文本所述,公司大数据集群不允许直接访问外网,需要一个网关服务器代理请求,本处服务器A就是边缘代理服务器的作用. 通常技术人员最快捷的思 ...
- Android利用温度传感器实现带动画效果的电子温度计
概述 Android利用温度传感器实现带动画效果的电子温度计. 详细 代码下载:http://www.demodashi.com/demo/10631.html 一.准备工作 需要准备一部带有温度传感 ...
随机推荐
- Python学习实践-----打印日历
使用python语言实现在控制台打印日历 输入年.月.日 输出对应日历,指定的日数输出为'--' 程序没有做严格的输入验证,故输入整数即可. 以下为没有优化的源码: print_calendar.py ...
- struts2+hibernate整合-实现登录功能
最近一直学习struts2+hibernate框架,于是想把两个框架整合到一起,做一个小的登录项目.其他不多说,直接看例子. 1).Struts2 和hibernate的环境配置 包括jar包.web ...
- Month Scheme
新的一个月,我要给自己立FLAG了, ABCDEFG HIJKLMN 天下事有难易乎,为之,则难者亦易矣,不为,则易者亦难矣. 这次采取的策略是,每完成一项work回来补充内容.希望能把这篇blog补 ...
- ubuntu 14.04安装pypcap
直接sudo apt-get install python-pypcap即可 How to install python-pypcap on Ubuntu 12.04 (Precise Pangoli ...
- 关于Spring 国际化 No message found under code 的解决方案
用spring做国际化时经常会报: org.springframework.context.NoSuchMessageException: No message found under code 'u ...
- [LeetCode] Coin Change 硬币找零
You are given coins of different denominations and a total amount of money amount. Write a function ...
- [LeetCode] Distinct Subsequences 不同的子序列
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- 利用HttpWebRequest实现实体对象的上传
一 简介 HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.它们支持一系列有用的属性.这两个类位 于System.Net命名空间,默认情况下这个类对 ...
- Win7 on VirtualBox 看不到 usb device
sudo usermod -G vboxusers -a your_user_name 我的用上面指令不能建立, 需先使用 sudo su 切到root 再執行 usermod -G vboxuser ...
- Fragment中onActivityResult不响应
开发中遇到Fragment中onActivityResult不响应的问题,曾经见过. 不少同学说处理方法是在与Fragment绑定的FragmentActivity中重写onActivityResul ...