**大学**学院信息安全产品开发实践课程设计报告题目缓冲区溢出的保护学生姓名学号_____年级指导老师指导老师评阅意见:指导老师评分:提交时间:2007年12月缓冲区溢出的保护(软件工程专业)学生学号指导教师摘要:1999年Bugtraq(一个讨论安全缺陷的邮件列表)进行的一次非正式调查发现,三分之二的参与者认为第一号的缺陷就是缓冲区溢出。从1997年到2007年3月,CERT/CC发出的半数安全警报都基于缓冲区缺陷。面对如此大的威胁,我们需要知道什么是缓冲区溢出,如何防止它们,可以采用哪些最新的自动化工具来防止它们以及为什么这些工具还不足够,还有如何在编写程序的程序中防止它们。关键字:缓冲区溢出;溢出保护;溢出防御DetectionOfBufferOverflowAbstract:FromaninformalinvestigationonBugtraq(amaillistwhichdiscussalimitationonsecurity)in1999,wecanfindthattwo-part’sparticipantsthoughtthattheNo.1limitationisbufferoverflow.From1997toMay,2007,almosthalfthesecurewarningssentbyCERT/CCwerebasedonthelimitationofbuffer.Facingsuchahugemenace,weneedtolearnwhatisthebufferoverflow,howtodefendthem,whichkindsofthelatestautomatizationtoolswecanusedforavoidthem,whythesetoolsstillnotenough,andhowtopreventtheminprogramming.Keywords:BufferOverflow,OverflowDetection,,OverflowDefense正文1绪论1.1立题背景缓冲区溢出是当前一些软件存在的最常见的安全隐患之一,通过提供一个恶意的输入黑客可以改变进程的执行流程,缓冲区溢出能够威胁到整个进程,机器,甚至相关的系统领域。如果运行的进程是在权限比较高的用户下面,比如administrator或者本地的系统帐户(LocalSystemAccount),那么黑客破坏所导致的损失将会很严重而且将会面临更广泛的潜在危胁。最近时期爆发的一些众所周知的病毒像,红色代码病毒和震荡波蠕虫病毒,都是C/C++代码里存在着缓冲区溢出的结果。1.2研究内容在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比如通过引发一个异常或根据需要给缓冲区添加更多空间)。但是有两种语言不是这样:C和C++语言。C和C++语言通常只是让额外的数据乱写到其余内存的任何位置,而这种情况可能被利用从而导致恐怖的结果。更糟糕的是,用C和C++编写正确的代码来始终如一地处理缓冲区溢出则更为困难;很容易就会意外地导致缓冲区溢出。除了C和C++使用得非常广泛外,上述这些可能都是不相关的事实;例如,RedHatLinux7.1中86%的代码行都是用C或C++编写的。因此,大量的代码对这个问题都是脆弱的,因为实现语言无法保护代码避免这个问题。在C和C++语言本身中,这个问题是不容易解决的。该问题基于C语言的根本设计决定(特别是C语言中指针和数组的处理方式)。由于C++是最兼容的C语言超集,它也具有相同的问题。存在一些能防止这个问题的C/C++兼容版本,但是它们存在极其严重的性能问题。而且一旦改变C语言来防止这个问题,它就不再是C语言了。许多语言(比如Java和C#)在语法上类似C,但它们实际上是不同的语言,将现有C或C++程序改为使用那些语言是一项艰巨的任务。有些语言存在允许缓冲区溢出发生的“转义”子句。Ada一般会检测和防止缓冲区溢出(即针对这样的尝试引发一个异常),但是不同的程序可能会禁用这个特性。C#一般会检测和防止缓冲区溢出,但是它允许程序员将某些例程定义为“不安全的”,而这样的代码可能会导致缓冲区溢出。因此如果您使用那些转义机制,就需要使用C/C++程序所必须使用的相同种类的保护机制。许多语言都是用C语言来实现的(至少部分是用C语言来实现的),并且用任何语言编写的所有程序本质上都依赖用C或C++编写的库。因此,所有程序都会继承那些问题,所以了解这些问题是很重要的。2.缓冲区溢出的概述2.1缓冲区溢出的起源内存溢出已经是软件开发历史上存在了近40年的“老大难”问题2.2缓冲区溢出如何工作计算机还有由程序共享,随机访问内存(RAM)。为了简化,内存管理WindowsXPSP2有功能控制当前正在使用哪段的RAM。如果启动程序,释放内存分配给程序...