转自: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 ()

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

三。走读代码修改错误。

四。总结

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

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

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

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

  2. 利用VS自带发布功能实现web项目快速部署

    你还在使用最原始的方法部署服务器吗?还在把项目文件全部复制然后黏贴到服务器上?这种方法太low而且又慢又不安全(存在源码泄露等安全性问题),如果你是这样,那你自己肯定也为此烦恼不已. 下面我所要讲到的 ...

  3. 利用微信企业号的告警功能,联动检测ICMP的shell脚本

    作者:邓聪聪 由于设备IP众多,为了及时发现IP地址有不可达现象,利用微信的联动报警,及时发现问题,以下是脚本内容!!! ping.sh #!/bin/bash ###SCRIPT_NAME:icmp ...

  4. 痞子衡嵌入式:一次利用IAR自带CRC完整性校验功能的实践(为KBOOT加BCA)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是利用IAR自带CRC完整性校验功能的一次实践(为KBOOT加BCA). 痞子衡之前写过两篇关于IAR中自带CRC校验功能的文章 < ...

  5. 调用Android自带日历功能(日历列表单、添加一个日历事件)

    调用Android自带日历功能  觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有 ...

  6. 利用win10自带的系统配置禁止开机启动项和程序

    一.利用win10自带的系统配置禁止开机启动项和程序     首先打开"运行"对话框,可以通过开始菜单打开运行,也可以按下快捷键WIN+R打开"运行".如下图. ...

  7. Java中的大小写字母相互转换(不利用Java自带的方法)

    Java中的大小写字母相互转换(不利用Java自带的方法) 1.设计源码 /** * * @title:UpperAndLower.java * @Package:com.you.utils * @D ...

  8. ASP.NET Core 实现带认证功能的Web代理服务器

    引言 最近在公司开发了一个项目,项目部署架构图如下: 思路 如图中文本所述,公司大数据集群不允许直接访问外网,需要一个网关服务器代理请求,本处服务器A就是边缘代理服务器的作用. 通常技术人员最快捷的思 ...

  9. Android利用温度传感器实现带动画效果的电子温度计

    概述 Android利用温度传感器实现带动画效果的电子温度计. 详细 代码下载:http://www.demodashi.com/demo/10631.html 一.准备工作 需要准备一部带有温度传感 ...

随机推荐

  1. Sprint计划会议内容

    项目名称:蹭课神器 会议内容 首先我们讨论了项目的工作量及实施流程 一.工作认领 二.界面的总体规划 三.主要功能的设计 四.设计数据库 五.编写项目报告 六.软件测试和推广 然后我们进行了工作认领, ...

  2. 重温servlet②

    重定向:我给服务器请求一条消息,服务器让我访问另外一个服务器(新的地址).302状态码,并设置location头,完成重定向.两个请求. package com.pcx.servlets;   imp ...

  3. Sprint第二个计划

    一.现状 现在是冲刺的第二个阶段了,我们的进度还是一样,没有太大的进展.所以这一个阶段应该加紧进度,好好学习别的组,弥补我们组的不足.一开始我们是打算用原来的初级APP,然后再补充一些新的内容.可是现 ...

  4. JavaMail实现邮箱之间发送邮件功能

    package com.minstone.message.util; import java.util.Date; import java.util.Properties; import javax. ...

  5. We are a team----sh_6666

    团队宣言:编程,我们是玩命的,玩命,我们是认真的. 团队简介: 团队名称:sh_6666队 团队博客链接:http://www.cnblogs.com/sh-6666/ 人物简介: 剧团导演:吴小勇 ...

  6. Eclipse使用较多的快捷键

    快速修正:Ctrl+1 单词补全:Alt+/ 快速Outline:Ctrl+O 删除行:Ctrl+D 选中到行末/行首:Shift+End/Home 注释:Ctrl+/ 变为大/小写:Ctrl+Shi ...

  7. PAT 1043 输出PATest

    https://pintia.cn/problem-sets/994805260223102976/problems/994805280074743808 给定一个长度不超过10000的.仅由英文字母 ...

  8. Linux命令(六) 查看文件 cat tac more less tail

    如果要查看文件,使用 cat  less  tac   tail  和 more 中的任意一个即可. 1.cat 使用 cat 命令查看文件时会显示整个文件的内容,注意cat只能查看文本文件的内容,如 ...

  9. FileReader & Blob & File

    FileReader & Blob & File https://developer.mozilla.org/en-US/docs/Web/API/FileReader https:/ ...

  10. BZOJ1815 SHOI2006有色图(Polya定理)

    置换数量是阶乘级别的,但容易发现本质不同的点的置换数量仅仅是n的整数拆分个数,OEIS(或者写个dp或者暴力)一下会发现不是很大,当n=53时约在3e5左右. 于是暴力枚举点的置换,并且发现根据点的置 ...