一、缓冲区溢出攻击的基本概念

缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。

缓冲区溢出攻击有多种英文名称:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the stack, memory leak,overrun screw;它们指的都是同一种攻击手段。第一个缓冲区溢出攻击--Morris蠕虫,发生在1988年,由罗伯特,莫里斯(R ob。rtMorris)制造,它曾造成全世界6000多台网络服务器瘫痪。

计算机程序一般都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存一般称作缓冲区。溢出是指盛放的东西超出容器容量而溢出来了,在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。

通过往程序的缓冲区写超出其长度的内容,比如定义一个字符串变量,只允许他存储最多15个字符串(IP地址的最大字符数),但用户输入的时候误操作输入了15个以上的字符,加上程序本身没有去校验用户输入的字符数量,而直接存储到这个变量的内存地址空间,就造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。

 二、缓冲区溢出漏洞攻击方式

缓冲区溢出漏洞可以使任何一个有黑客技术的人取得机器的控制权甚至是最高权限。一般利用缓冲区溢出漏洞攻击root程序,大都通过执行类似“exec(sh)”的执行代码来获得root 的shell。黑客要达到目的通常要完成两个任务,就是在程序的地址空间里安排适当的代码和通过适当的初始化寄存器和存储器,让程序跳转到安排好的地址空间执行。

1)在程序的地址空间里安排适当的代码

在程序的地址空间里安排适当的代码往往是相对简单的。如果要攻击的代码在所攻击程序中已经存在了,那么就简单地对代码传递一些参数,然后使程序跳转到目标中就可以完成了。攻击代码要求执行“exec(‘/bin/sh’)”,而在libc库中的代码执行“exec(arg)”,其中的“arg”是个指向字符串的指针参数,只要把传入的参数指针修改指向“/bin/sh”,然后再跳转到libc库中的响应指令序列就可以了。当然,很多时候这个可能性是很小的,那么就得用一种叫“植入法”的方式来完成了。

当向要攻击的程序里输入一个字符串时,程序就会把这个字符串放到缓冲区里,这个字符串包含的数据是可以在这个所攻击的目标的硬件平台上运行的指令序列。缓冲区可以设在:堆栈(自动变量)、堆(动态分配的)和静态数据区(初始化或者未初始化的数据)等的任何地方。也可以不必为达到这个目的而溢出任何缓冲区,只要找到足够的空间来放置这些攻击代码就够了。

2)控制程序转移到攻击代码的形式

缓冲区溢出漏洞攻击都是在寻求改变程序的执行流程,使它跳转到攻击代码,最为基本的就是溢出一个没有检查或者其他漏洞的缓冲区,这样做就会扰乱程序的正常执行次序。通过溢出某缓冲区,可以改写相近程序的空间而直接跳转过系统对身份的验证。原则上来讲攻击时所针对的缓冲区溢出的程序空间可为任意空间。但因不同地方的定位相异,所以也就带出了多种转移方式。

(1)Function Pointers(函数指针)

在程序中,“void (* foo) ( )”声明了个返回值为“void” Function Pointers的变量“foo”。Function Pointers可以用来定位任意地址空间,攻击时只需要在任意空间里的Function Pointers邻近处找到一个能够溢出的缓冲区,然后用溢出来改变Function Pointers。当程序通过Function Pointers调用函数,程序的流程就会实现。

(2)Activation Records(激活记录)

当一个函数调用发生时,堆栈中会留驻一个Activation Records,它包含了函数结束时返回的地址。执行溢出这些自动变量,使这个返回的地址指向攻击代码,再通过改变程序的返回地址。当函数调用结束时,程序就会跳转到事先所设定的地址,而不是原来的地址。这样的溢出方式也是较常见的。

(3)植入综合代码和流程控制

常见的溢出缓冲区攻击类是在一个字符串里综合了代码植入和Activation Records。攻击时定位在一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出改变Activation Records的同时植入代码(权因C在习惯上只为用户和参数开辟很小的缓冲区)。植入代码和缓冲区溢出不一定要一次性完成,可以在一个缓冲区内放置代码(这个时候并不能溢出缓冲区),然后通过溢出另一个缓冲区来转移程序的指针。这样的方法一般是用于可供溢出的缓冲区不能放入全部代码时的。如果想使用已经驻留的代码不需要再外部植入的时候,通常必须先把代码做为参数。在libc(熟悉C的朋友应该知道,现在几乎所有的C程序连接都是利用它来连接的)中的一部分代码段会执行“exec(something)”,当中的something就是参数,使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。

程序编写的错误造成网络的不安全性也应当受到重视,因为它的不安全性已被缓冲区溢出表现得淋漓尽致了。

三、缓冲区溢出攻击的防范策略

缓冲区溢出攻击的防范是和整个系统的安全性分不开的。如果整个网络系统的安全设计很差,则遭受缓冲区溢出攻击的机会也大大增加。针对缓冲区溢出,可以采取多种防范策略。

(1)系统管理上的防范策略

一要关闭不需要的特权程序。

二要及时给程序漏洞打补丁。

(2)软件开发过程中的防范策略

发生缓冲区溢出的主要及各要素是:数组没有边界检查而导致的缓冲区溢出;函数返回地址或函数指针被改变,使程序流程的改变成为可能;植入代码被成功的执行等等。所以针对这些要素,从技术上可以采取一定的措施。

 1)强制写正确的代码的方法。

只要在所有拷贝数据的地方进行数据长度和有效性的检查,确保目标缓冲旦中数据不越界并有效,则就可以避免缓冲区溢出,更不可能使程序跳转到恶意代码上。

 2)通过操作系统使得缓冲区不可执行,从而阻止攻击者殖入攻击代码。

通过使被攻击程序的数据段地址空间不可执行,从商使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码,这种技术被称为缓冲区不可执行技术。

3)改进C语言函数库。

C语言中存在缓冲区溢出攻击隐患的系统匾数有很多。例如gets(),sprintf(),strcpy(),strcat(),fscanf(),scanf(),vsprintf()等。可以开发出更安全的封装了若干己知易受堆栈溢出攻击的岸函数。

4)使堆栈向高地址方向增长。

使用的机器堆栈压入数据时向高地址方向前进,那么无论缓冲区如何溢出,都不可能覆盖低地址处的函数返回地址指针,也就避免了缓冲区溢出攻击。但是这种方法仍然无法防范利用堆和静态数据段的缓冲区进行溢出的攻击。

5)在程序指针失效前进行完整性检查。

原理是在每次在程序指针被引用之前先检测该指针是否己被恶意改动过,如果发现被改动,程序就拒绝执行。

6)利用编译器将静态数据段中的函数地址指针存放地址和其他数据的存放地址分离。

如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!
C语言C++学习企鹅圈子】,分享(源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

编程学习书籍:

编程学习视频:

划重点!关于缓冲区溢出攻击,这份防范策略一定要收好!相关推荐

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

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

  2. 缓冲区溢出攻击指什么?如何防御?

    缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行为,是一种非常普遍.非常危险的漏洞,也是最常见的网络攻击手段,该攻击虽然简单但危害性极大.那么缓冲区溢出攻击是什么?如何防御?本文详细介绍一下. 缓冲区 ...

  3. 黑客中级技术--缓冲区溢出攻击(转)

    黑客中级技术--缓冲区溢出攻击(转)[@more@] 缓冲区溢出是一种非常普遍.非常危险的漏洞,在各种操作系统.应用软件中广泛存在.利用缓冲区溢出攻击,可以导致程序运行失败.系统当机.重新启动等后果. ...

  4. 缓冲区溢出攻击原理分析

    <缓冲区溢出攻击实践>以实践者角度介绍了初级缓冲区溢出攻击方法,本文从原理上对该方法做原理性介绍. 函数帧结构 现在高级语言C(或者C++),在函数开头的几指令要建立好函数帧结构,而函数返 ...

  5. 缓冲区溢出攻击-C语言中的危险函数

    1.缓冲区溢出攻击 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上.理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符.但是绝大多 ...

  6. 缓冲区溢出攻击初学者手册(更新版)

    译者:IDF_Lab 来源:缓冲区溢出攻击初学者手册(更新版) 说明 ‍‍之前版本翻译质量不佳,本人赵阳在这里对本文的读者表示深深的歉意.由于本人的疏忽和大意导致您不能很好的读完这篇文章,同时也对原文 ...

  7. Linux开发_反编译开发_破解简单登录程序外加缓冲区溢出攻击

    缓冲区溢出攻击即破坏指定buff的缓冲区大小,使其溢出到别的空间上去,破坏堆栈. 比如有如下代码: #include <stdio.h> #include <string.h> ...

  8. 计算机系统基础学习笔记(7)-缓冲区溢出攻击实验

    缓冲区溢出攻击实验 实验介绍 实验任务 实验数据 目标程序 bufbomb 说明 bufbomb 程序接受下列命令行参数 目标程序bufbomb中函数之间的调用关系 缓冲区溢出理解 目标程序调用的ge ...

  9. 网络安全实验:CCProxy缓冲区溢出攻击

    CCProxy缓冲区溢出实验 一.实验环境说明 溢出对象:CCProxy(一款代理服务器软件,支持FTP和Telnet) 调试工具:CDB.WinDbg.OllyDBG.IDA Pro etc 实验环 ...

最新文章

  1. js数组中forEach/some/every/map/filter/reduce的区别
  2. 基于ZooKeeper实现HA高可用性以及自动主备切换
  3. 【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)
  4. Android 系统(271)---进程、守护进程的实现及进程拉活
  5. iPhone 13 Pro系列被抢疯:官网已推迟36天发货
  6. Pwn2Own黑客大赛战况:iPhone 20秒被黑
  7. appium java动态等待_appium封装显示等待Wait类和ExpectedCondition接口
  8. (转)知乎:一文读懂比特币私钥、公钥、钱包地址的来历和关系
  9. 【图像融合】基于matlab对比度和结构提取多模态解剖图像融合【含Matlab源码 1539期】
  10. The VMRC console has disconnected solution
  11. 根据身份证号计算周岁年龄
  12. Lync 2013安装要点
  13. fastboot简介(android烧录指令)
  14. 金丹期前期:1.4、python语言-python的程序的核心数据类型:字符串、列表、元组、字典
  15. 网络中超难的75道逻辑题及答案
  16. 基于SSM的家政服务管理系统
  17. spring入门之Spring 常用的三种注入方式
  18. django设置为中文语言
  19. string转blob
  20. 什么是进修编程言语之前

热门文章

  1. 童年往事!怀念44款经典任天堂FC游戏[FC]
  2. 名著赏读 | 《教育思想的演进》读书报告
  3. 我爷爷都看的懂的《栈和队列》,学不会来打我
  4. 【散分】庆祝自己的csdn博客突破100万访问量
  5. 车辆运动学模型到动力学模型推导
  6. 百度Q2净利润同比增长45% 百家号成信息流营收源动力
  7. android 大字体,大字体下载-大字体Big Font 3.21 安卓版-我游网
  8. JavaScript 深拷贝与浅拷贝
  9. C C++ 调用第三方DLL库失败 LoadLibrary 返回NULL 并报 126 错误 解决办法
  10. Go语言内嵌C语言教程