一、缓冲区溢出介绍

1988年,世界上第一个缓冲区溢出攻击–Morris蠕虫在互联网上泛滥,短短一夜的时间全世界6000多台网络服务器瘫痪或半瘫痪,不计其数的数据和资料被毁。造成一场损失近亿美元的空前大劫难!

那么,缓冲区溢出到底是怎么一回事呢?

缓冲区溢出就好比一个杯子倒太多的水,洒出来,这叫溢出。它是一种非常普遍、非常危险的漏洞,最常出现在C/C++编写的程序中。

早期,人们还不那么重视安全的时候,往往会使用像strcpy这类不安全函数,这种函数对用户的输入不作任何检查,总之,来自不拒,那么,分配的内存空间是有限的,如果输入超长的字符串,必然会导致溢出。

讲了这么多,小伙伴会不会有点晕吗?其实,缓冲区溢出很容易理解的。下面我们看一个具体的例子:

#include<stdio.h>#include<string.h>int main(){char str[8];char input[256];gets(input);strcpy(str,input);return 0;}

这段代码存在一个经典的缓冲区溢出漏洞strcpy,为str变量分配了8个字节的空间,输入小于等于8个字符,那没问题:

但是当我们输入超长的数据时,问题出现了

2、缓冲区溢出带来的危害

上面是我们自己写的程序,存在漏洞这没什么大惊小怪并不会造成什么恶劣的影响。但是,如果问题出现在我们常用的一些软件,比如操作系统,浏览器,QQ,那后果不堪想象。

缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到系统权限,然后为所欲为。

利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,它可被利用来执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。

有可能小伙伴你会对病毒/蠕虫没有概念,那我们来举一个简单的例子吧。平时玩电脑的时候,你正在听歌,突然间收到未知的“朋友”发给你的一个m3u音频文件,并引导你进行电击——“这首歌很好听呢,你也听听”。

凑巧的是,你电脑刚好了就装了VUPlayer.exe 这个播放器,不多想,就打开这个音乐想听听看,奇怪的是,软件闪了一下就退出了,你以为是文件损坏了了吧。其实,这个时候,你已经被黑了,没错!这就是那个播放器。

很普通的播放器,但是它存在致命缓冲区溢出漏洞。我们构造10000个A的m3u文件,然后用调试器附加VUPlayer.exe,打开文件:

我们看到下面的内存全部被字符A覆盖了,其实就是使用了不安全的lstrcpyA函数导致溢出,这个是栈溢出,还有一种是堆溢出,但本质是一样的。

证明有溢出漏洞之后,往往需要进一步分析写利用代码,不同的人目的不竟相同,类似我的很多安全爱好者之时弹弹计算器(在桌面上不停地弹出计算器工具),可是黑市上的人就会攻击你的系统,盗取机密文件等等。当然,这只是一个简单的实验。

3、目前常见的保护措施

缓冲区攻击的日渐泛滥,微软并未任其张扬,陆陆续续推出了各种保存措施。其中重要的有GS,SafeSeh,ASLR,DEP等,接下来我们针对这些措施进行原理分析:

①.GS保护原理:

通过VC++编译器在函数前后添加额外的处理代码,前部分用于由伪随机数生成的cookie并放入.data节段,当本地变量初始化,就会向栈中插入cookie,它位于局部变量和返回地址之间在缓冲区溢出利用时,如果将恶意代码从局部变量覆盖到返回地址,那么自然就会覆写cookie,当检测到与原始cookie不同时,就会触发异常,最后终止进程。

②.SafeSeh保护

为了防止SEH节点被攻击者恶意利用,微软在.net编译器中加入/sdeseh编译选项引入SafeSEH技术。编译器在编译时将PE文件所有合法的异常处理例程的地址解析出来制成一张表,放在PE文件的数据块(LQAJ)一C0N—FIG)中,并使用shareuser内存中的一个随机数加密,用于匹配检查。

如果该PE文件不支持safesEH,则表的地址为0。当PE文件被系统加载后,表中的内容被加密保存到ntdl1.dll模块的某个数据区。在PE文件运行期间,如果发生异常需要调用异常处理例程,系统会逐个检查该例程在表中是否有记录:如果没有则说明该例程非法,进而不执行该异常例程。

③.ASLR保护

ASLR(地址空间布局随机化)技术的主要功能是通过对系统关键地址的随机化,防止攻击者在堆栈溢出后利用固定的地址定位到恶意代码并加以运行。

④.DEP保护

数据执行保护 (DEP) 是一套软硬件技术,能够在内存上执行额外检查以防止在不可运行的内存区域上执行代码

这些保护机制的出现,一度使得攻击难度大大增加,但攻击者们也不是吃素的,他们也在研究绕过这些保护的办法。所谓千里之堤溃于蚁穴,对于上面的保护,攻击者只要找到了它们的一个弱点,便可以突破所有防线,实现攻击。攻击与防护,不断在对抗,可以预见,在未来一段时间,这种游戏还将持续上演。

但是,现在的漏洞门槛比十年前高了N倍,笔者在实际中也常常遇到有漏洞却不能利用的情况。但是也不要灰心,老的技术被淘汰,新的技术又会出来,本属正常,但像缓冲区溢出这种经典的东西,无论什么时候,都值得我们学习。

注:

本文来自:https://zhuanlan.zhihu.com/p/21924662

溢出实例见:
https://www.cnblogs.com/clover-toeic/p/3737011.html

操作系统——缓冲区溢出相关推荐

  1. linux缓冲区溢出攻击步骤,如何防范Linux操作系统下缓冲区溢出攻击

    (2)改写"rc.local"文件.默认情况下,当登录Linux系统时系统运行rc.local文件,显示该Linux发行版本的名字.版本号.内核版本和服务器名称等信息,这使得大量系 ...

  2. 一个简单的缓冲区溢出的思考

    从大二开始真正接触技术开始,从最早的HTML,PHP,WEB开发.一直以为以后可能会从事开发的工作,碰巧大三上的时候和同专业的郭子,邹豪参加了南京的一个信息安全技能大赛,才真正找到了兴趣的方向,也从懵 ...

  3. 使用Linux进行缓冲区溢出实验的配置记录

    在基础的软件安全实验中,缓冲区溢出是一个基础而又经典的问题.最基本的缓冲区溢出即通过合理的构造输入数据,使得输入数据量超过原始缓冲区的大小,从而覆盖数据输入缓冲区之外的数据,达到诸如修改函数返回地址等 ...

  4. Android中的防缓冲区溢出技术

    Android系统提供了非常严格的多层次的安全保护措施,包括代码.为了防止恶意用户采用恶意软件进行缓冲区溢出***或者进行"越狱"操作,自Android 4.0版本之后,内核就引入 ...

  5. 缓冲区溢出_了解Java缓冲池

    缓冲区溢出 了解Java缓冲池 缓冲池空间位于垃圾收集器管理的内存之外. 这是分配本地堆外内存的一种方法. 使用缓冲池有什么好处? 为了回答这个问题,让我们首先了解什么是字节缓冲区. 字节缓冲区 非直 ...

  6. 从函数调用过程中的堆栈变化理解缓冲区溢出

    一.说明 本来是想直接写一个缓冲区溢出的例子,但是一是当前编译器和操作系统有溢出的保护措施没有完全弄清怎么取消,二是strcpy等遇到00会截断需要进行编码这比较难搞,所以最终没有实现. 但已经双看了 ...

  7. 网络安全系列之三十五 缓冲区溢出

    缓冲区溢出的大名可谓如雷贯耳,我们不必去探究缓冲区溢出的原理,只需知道他能做什么就可以了.如果能够成功地对远程计算机进行缓冲区溢出,那么就可以获得远程计算机的Shell,也就可以直接以管理员的身份在远 ...

  8. 缓冲区溢出漏洞攻击——Shellcode编写

    一.实验内容 利用一个程序漏洞,编写shellcode,达成效果:蹦出对话框,显示"You have been hacked!(by JWM)" 二.实验原理 因为输入了过长的字符 ...

  9. 安全编程: 防止缓冲区溢出

    防止如今最常见的程序缺陷 本文讨论 Linux/UNIX 系统中最常见的缺陷:缓冲区溢出.本文首先解释什么是缓冲区溢出,以及它们为何如此常见和如此危险.然后讨论广泛用于解决缓冲区溢出的新 Linux ...

最新文章

  1. 在linux中如何高效的使用帮助
  2. 本周ASP.NET英文技术文章推荐[06/03 - 06/09]
  3. Python 计算机视觉(四)—— OpenCV进行图像算数与逻辑运算
  4. nginx下rewrite规则中参数超过10 $10 解决方案
  5. 3pc在mysql的实现_面试官:了解分布式事务?讲讲你理解的2PC和3PC原理
  6. [代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传
  7. 给定一个用户,获取其密码警告期限;而后判断用户密码使用期限是否已经小于警告期限...
  8. 【NOIP考前模拟赛】纯数学方法推导——旅行者问题
  9. 《Hive编程指南》14.3 投影变换的实践出错原因分析
  10. 操作系统和数据库的知识梳理(思维导图)
  11. w7系统计算机里没有摄像头,win7系统没有摄像头不能视频的几种原因和解决方法...
  12. 企业靠一套数据平台实现“低成本运营战略”,降低成本600万
  13. JavaScript从父页面获取子页面的值(子页面又如何访问父页面)
  14. java8 32位和64位资源分享 Windows 版本:8u311
  15. 1500_1763 全球统一 伊比利亚 俄罗斯 西欧
  16. html中的分页条怎么写,html如何制作分页
  17. bilibili缓存视频批量转换成mp4格式,方便学习
  18. web前端_腾讯校招一面
  19. 几种常用的Web安全认证方式
  20. java 埋点_数据采集之js埋点

热门文章

  1. ftp服务器客户端修改密码,如何在客户端修改FTP密码
  2. 王道408数据结构——第七章 查找
  3. arraylist从大到小排序_经典排序方法的python实现和复杂度分析
  4. 通过这个方法竟然可以看到声音传播的速度!?
  5. 上班骚扰男同事被抓到......
  6. 用数学模型向你解释离婚
  7. sql企业管理器_Valentina Studio for mac(开源数据库管理器)
  8. winform能连MySQL吗_c# winform中怎么连接mysql
  9. java中如何运行小程序_一起学java(一)——运行第一个小程序
  10. 下学期计算机教学工作计划,初中信息技术下学期教学工作计划