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

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

ID:14084900

大小:109.00 KB

页数:15页

时间:2018-07-25

安全编程:防止缓冲区溢出_第1页
安全编程:防止缓冲区溢出_第2页
安全编程:防止缓冲区溢出_第3页
安全编程:防止缓冲区溢出_第4页
安全编程:防止缓冲区溢出_第5页
资源描述:

《安全编程:防止缓冲区溢出》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、安全编程:防止缓冲区溢出防止如今最常见的程序缺陷本文讨论Linux/UNIX系统中最常见的缺陷:缓冲区溢出。本文首先解释什么是缓冲区溢出,以及它们为何如此常见和如此危险。然后讨论广泛用于解决缓冲区溢出的新Linux和UNIX方法――以及为什么这些方法还不足够。随后将展示C/C++程序中防止缓冲区溢出的各种方法,同时包括静态调整大小的方法(比如标准的C库和OpenBSD/strlcpy解决方案)和动态调整大小的解决方案,以及一些将为您提供帮助的工具。最后,本文以一些关于缓冲区溢出缺陷的未来发展形势的预测来结束全

2、文的讨论。标记本文!发布日期: 2004年3月01日级别: 初级访问情况 3782次浏览建议: 0 (添加评论)平均分(共4个评分)1988年11月,许多组织不得不因为“Morris蠕虫”而切断Internet连接,“Morris蠕虫”是23岁的程序员RobertTappanMorris编写的用于攻击VAX和Sun机器的程序。据有关方面估计,这个程序大约使得整个Internet的10%崩溃。2001年7月,另一个名为“CodeRed”的蠕虫病毒最终导致了全球运行微软的IISWebServer的300,000多

3、台计算机受到攻击。2003年1月,“Slammer”(也称为“Sapphire”)蠕虫利用MicrosoftSQLServer2000中的一个缺陷,使得南韩和日本的部分Internet崩溃,中断了芬兰的电话服务,并且使得美国航空订票系统、信用卡网络和自动出纳机运行缓慢。所有这些攻击――以及其他许多攻击,都利用了一个称做为缓冲区溢出的程序缺陷。1999年Bugtraq(一个讨论安全缺陷的邮件列表)进行的一次非正式调查发现,三分之二的参与者认为第一号的缺陷就是缓冲区溢出(要了解相关背景,请参阅本文后面参考资料部分

4、列出的“BufferOverflows:AttacksandDefensesfortheVulnerabilityoftheDecade”一文)。从1997年到2002年3月,CERT/CC发出的半数安全警报都基于缓冲区缺陷。如果希望自己的程序是安全的,您需要知道什么是缓冲区溢出,如何防止它们,可以采用哪些最新的自动化工具来防止它们(以及为什么这些工具还不足够),还有如何在您自己的程序中防止它们。什么是缓冲区溢出?缓冲区以前可能被定义为“包含相同数据类型的实例的一个连续计算机内存块”。在C和C++中,缓冲区通

5、常是使用数组和诸如malloc()和new这样的内存分配例程来实现的。极其常见的缓冲区种类是简单的字符数组。溢出是指数据被添加到分配给该缓冲区的内存块之外。如果攻击者能够导致缓冲区溢出,那么它就能控制程序中的其他值。虽然存在许多利用缓冲区溢出的方法,不过最常见的方法还是“stack-smashing”攻击。EliasLevy(又名为AlephOne)的一篇经典文章“SmashingtheStackforFunandProfit”解释了stack-smashing攻击,EliasLevy是Bugtraq邮件列表

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

7、。每当调用一个函数,就会使用一个新的堆栈帧来支持该调用。了解这些之后,让我们来考察一个简单的程序。清单1.一个简单的程序voidfunction1(inta,intb,intc){charbuffer1[5];gets(buffer1);/*DON'TDOTHIS*/}voidmain(){function(1,2,3);}假设使用gcc来编译清单1中的简单程序,在X86上的Linux中运行,并且紧跟在对gets()的调用之后中止。此时的内存内容看起来像什么样子呢?答案是它看起来类似图1,其中展示了从左边的低

8、位地址到右边的高位地址排序的内存布局。图1.堆栈视图内存的底部内存的顶部buffer1sfpretabc<---增长---[][][][][][]...堆栈的顶部堆栈的底部许多计算机处理器,包括所有x86处理器,都支持从高位地址向低位地址“倒”增长堆栈。因此,每当一个函数调用另一个函数,更多的数据将被添加到左边(低位地址),直至系统的堆栈空间耗尽。在这个例子中,当main()调用function1(

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

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

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