防止缓冲区溢出杜绝如今最常见的程序缺陷方案

防止缓冲区溢出杜绝如今最常见的程序缺陷方案

ID:17393730

大小:35.41 KB

页数:16页

时间:2018-08-30

防止缓冲区溢出杜绝如今最常见的程序缺陷方案_第1页
防止缓冲区溢出杜绝如今最常见的程序缺陷方案_第2页
防止缓冲区溢出杜绝如今最常见的程序缺陷方案_第3页
防止缓冲区溢出杜绝如今最常见的程序缺陷方案_第4页
防止缓冲区溢出杜绝如今最常见的程序缺陷方案_第5页
资源描述:

《防止缓冲区溢出杜绝如今最常见的程序缺陷方案》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、防止缓冲区溢出杜绝如今最常见的程序缺陷方案什么是缓冲区溢出?  缓冲区以前可能被定义为“包含相同数据类型的实例的一个连续计算机内存块”。在C和C++中,缓冲区通常是使用数组和诸如malloc()和new这样的内存分配例程来实现的。极其常见的缓冲区种类是简单的字符数组。溢出是指数据被添加到分配给该缓冲区的内存块之外。    如果攻击者能够导致缓冲区溢出,那么它就能控制程序中的其他值。虽然存在许多利用缓冲区溢出的方法,不过最常见的方法还是“stack-smashing”攻击。EliasLevy(又名为AlephOne)的一篇经典文章“SmashingtheStackfor

2、FunandProfit”解释了stack-smashing攻击,EliasLevy是Bugtraq邮件列表(请参阅参考资料以获得相关链接)的前任主持人。    为了理解stack-smashing攻击(或其他任何缓冲区攻击)是如何进行的,您需要了解一些关于计算机在机器语言级实际如何工作的知识。在类UNIX系统上,每个进程都可以划分为三个主要区域:文本、数据和堆栈。文本区域包括代码和只读数据,通常不能对它执行写入操作。数据区域同时包括静态分配的内存(比如全局和静态数据)和动态分配的内存(通常称为堆)。堆栈区域用于允许函数/方法调用;它用于记录函数完成之后的返回位置,存

3、储函数中使用的本地变量,向函数传递参数,以及从函数返回值。每当调用一个函数,就会使用一个新的堆栈帧来支持该调用。了解这些之后,让我们来考察一个简单的程序。    清单1.一个简单的程序    voidfunction1(inta,intb,intc){   charbuffer1[5];   gets(buffer1);/*DON'TDOTHIS*/  }    voidmain(){   function(1,2,3);  }    假设使用gcc来编译清单1中的简单程序,在X86上的Linux中运行,并且紧跟在对gets()的调用之后中止。此时的内存内容看起来像什

4、么样子呢?答案是它看起来类似图1,其中展示了从左边的低位地址到右边的高位地址排序的内存布局。    内存的底部    内存的顶部   buffer1 sfp ret a b c   <---增长--- [] [] [] [] [] [] ...   堆栈的顶部    堆栈的底部     许多计算机处理器,包括所有x86处理器,都支持从高位地址向低位地址“倒”增长堆栈。因此,每当一个函数调用另一个函数,更多的数据将被添加到左边(低位地址),直至系统的堆栈空间耗尽。在这个例子中,当main()调用function1()时,它将c的值压入堆栈,然后压入b的值,最后压入a的值

5、。之后它压入return(ret)值,这个值在function1()完成时告诉function1()返回到main()中的何处。它还把所谓的“已保存的帧指针(savedframepointer,sfp)”记录到堆栈上;这并不是必须保存的内容,此处我们不需要理解它。在任何情况下,function1()在启动以后,它会为buffer1()预留空间,这在图1中显示为具有一个低地址位置。    现在假设攻击者发送了超过buffer1()所能处理的数据。接下来会发生什么情况呢?当然,C和C++程序员不会自动检查这个问题,因此除非程序员明确地阻止它,否则下一个值将进入内存中的“下

6、一个”位置。那意味着攻击者能够改写sfp(即已保存的帧指针),然后改写ret(返回地址)。之后,当function1()完成时,它将“返回”——不过不是返回到main(),而是返回到攻击者想要运行的任何代码。    通常攻击者会使用它想要运行的恶意代码来使缓冲区溢出,然后攻击者会更改返回值以指向它们已发送的恶意代码。这意味着攻击者本质上能够在一个操作中完成整个攻击!AlephOn的文章(请参阅参考资料)详细介绍了这样的攻击代码是如何创建的。例如,将一个ASCII0字符压入缓冲区通常是很困难的,而该文介绍了攻击者一般如何能够解决这个问题。    除了smashing-s

7、tack和更改返回地址外,还存在利用缓冲区溢出缺陷的其他途径。与改写返回地址不同,攻击者可以smashing-stack(使堆栈上的缓冲区溢出),然后改写局部变量以利用缓冲区溢出缺陷。缓冲区根本就不必在堆栈上——它可以是堆中动态分配的内存(也称为“malloc”或“new”区域),或者在某些静态分配的内存中(比如“global”或“static”内存)。基本上,如果攻击者能够溢出缓冲区的边界,麻烦或许就会找上你了。然而,最危险的缓冲区溢出攻击就是stack-smashing攻击,因为如果程序对攻击者很脆弱,攻击者获得整个机器的控制权就特别容易。   

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。