软件工程专业缓冲区溢出的保护实践.docx
《软件工程专业缓冲区溢出的保护实践.docx》由会员分享,可在线阅读,更多相关《软件工程专业缓冲区溢出的保护实践.docx(8页珍藏版)》请在三一文库上搜索。
1、大学*学院信息平安产品开发实践课程设计报告题目缓冲区溢出的保护学生姓名学号年级指导老师指导老师评阅意见:指导老师评分:提交时间:2007年12月微软用户1:缓冲区溢出的保护(软件工程专业)学生学号指导教师摘要:1999年Bugtraq(一个讨论平安缺陷的邮件列表)进行的一次非正式调查发现,三分之二的参与者认为第一号的缺陷就是缓冲区溢出。从1997年到2007年3月,CERT/CC发出的半数平安警报都基于缓冲区缺陷。面对如此大的威胁,我们需要知道什么是缓冲区溢出,如何防止它们,可以采用哪些最新的自动化工具来防止它们以及为什么这些工具还缺乏够,还有如何在编写程序的程序中防止它们。关键字:缓冲区溢
2、出;溢出保护;溢出防御DetectionOfBufferOverflowAbstract:FromaninformalinvestigationonBugtraq(amaillistwhichdiscussalimitationonsecurity)in1999,wecanfindthattwo-part,sparticipantsthoughtthattheNo.1limitationisbufferoverflow.From1997toMay,2007,almosthalfthesecurewarningssentbyCERT/CCwerebasedonthelimitationofbuf
3、fer.Facingsuchahugemenace,weneedtolearnwhatisthebufferoverflow,howtodefendthem,whichkindsofthelatestautomatizationtoolswecanusedforavoidthem,whythesetoolsstillnotenough,andhowtopreventtheminprogramming.Keywords:BufferOverflow,OverflowDetection,OverflowDefense正文1绪论1.1 立题背景缓冲区溢出是当前一些软件存在的最常见的平安隐患之一,通过
4、提供一个恶意的输入黑客可以改变进程的执行流程,缓冲区溢出能够威胁到整个进程,机器,甚至相关的系统领域。如果运行的进程是在权限比较高的用户下面,比方administrator或者本地的系统帐户(LOCaISystemACCOUnt),那么黑客破坏所导致的损失将会很严重而且将会面临更广泛的潜在危胁。最近时期爆发的一些众所周知的病毒像,红色代码病毒和震荡波蠕虫病毒,都是C/C+代码里存在着缓冲区溢出的结果。1.2 研究内容在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比方通过引发一个异常或根据需要给缓冲区添加更多空间)。但是有两种语言不
5、是这样:C和C+语言。C和C+语言通常只是让额外的数据乱写到其余内存的任何位置,而这种情况可能被利用从而导致恐怖的结果。更糟糕的是,用C和C+编写正确的代码来始终如一地处理缓冲区溢出则更为困难;很容易就会意外地导致缓冲区溢出。除了C和C+使用得非常广泛外,上述这些可能都是不相关的事实;例如,RedHatLinux7.1中86%的代码行都是用C或C+编写的。因此,大量的代码对这个问题都是脆弱的,因为实现语言无法保护代码防止这个问题。在C和C+语言本身中,这个问题是不容易解决的。该问题基于C语言的根本设计决定(特别是C语言中指针和数组的处理方式)。由于C+是最兼容的C语言超集,它也具有相同的问题。
6、存在一些能防止这个问题的C/C+兼容版本,但是它们存在极其严重的性能问题。而且一旦改变C语言来防止这个问题,它就不再是C语言了。许多语言(比方Java和C#)在语法上类似C,但它们实际上是不同的语言,将现有C或C+程序改为使用那些语言是一项艰巨的任务。有些语言存在允许缓冲区溢出发生的Qdquo;转义”子句。Ada一般会检测和防止缓冲区溢出(即针对这样的尝试引发一个异常),但是不同的程序可能会禁用这个特性。Ctt一般会检测和防止缓冲区溢出,但是它允许程序员将某些例程定义为“不平安的,而这样的代码可能会导致缓冲区溢出。因此如果您使用那些转义机制,就需要使用C/C+程序所必须使用的相同种
7、类的保护机制。许多语言都是用C语言来实现的(至少局部是用C语言来实现的),并且用任何语言编写的所有程序本质上都依赖用C或C+编写的库。因此,所有程序都会继承那些问题,所以了解这些问题是很重要的。2.缓冲区溢出的概述2.1 缓冲区溢出的起源内存溢出已经是软件开发历史上存在了近40年的“老大难问题计算机还有由程序共享,随机访问内存(RAM)O为了简化,内存管理WindowsXPSP2有功能控制当前正在使用哪段的RAMo如果启动程序,释放内存分配给程序。该内存被分为三段: 代码段此处存储程序特定执行命令。 数据段此处程序特定数据存储。 堆栈是数据段(一局部)此处存储所有与程序函数。这包括参数、缓冲区
8、存储本地变量以及,最重要、返回地址。返回地址指定执行函数后,程序将继续从。作为是由用户输入该信息也注册作为变量,一切,发送到堆栈用户类型。不通常,此行为不提出问题。但是,如果因编程错误,超过缓冲区限制堆栈成为容易控制。整个段被指定为本地变量例如,如果攻击者选择适当项对于攻击,可能会覆盖用指令。止匕外,后续返回地址可更改为指向恶意代码。因此,程序不再正常,但盲目执行攻击者的命令。内存的底部内存的顶部buffer1sfpretabc增长-堆栈的顶部堆栈的底部许多计算机处理器,包括所有x86处理器,都支持从高位地址向低位地址“倒增长堆栈。因此,每当一个函数调用另一个函数,更多的数据将被添加到左边(低
9、位地址),直至系统的堆栈空间耗尽。在这个例子中,当main()调用functionl()时,它将C的值压入堆栈,然后压入b的值,最后压入a的值。之后它压入return(ret)值,这个值在functionl()完成时告诉functionl()返回到main()中的何处。它还把所谓的“已保存的帧指针(savedframepointer,sfp)记录到堆栈上;这并不是必须保存的内容,此处我们不需要理解它。在任何情况下,functionl()在启动以后,它会为bufferl()预留空间,这在图1中显示为具有一个低地址位置。现在假设攻击者发送了超过bufferl()所能处理的数据。接下来会发生什么情况
10、呢?当然,C和C+程序员不会自动检查这个问题,因此除非程序员明确地阻止它,否则下一个值将进入内存中的“下一个位置。那意味着攻击者能够改写sfp(即已保存的帧指针),然后改写ret(返回地址)。之后,当functionl()完成时,它将“返回一一不过不是返回到main(),而是返回到攻击者想要运行的任何代码。通常攻击者会使用它想要运行的恶意代码来使缓冲区溢出,然后攻击者会更改返回值以指向它们已发送的恶意代码。这意味着攻击者本质上能够在一个操作中完成整个攻击!AlephOn的文章(请参阅参考资料)详细介绍了这样的攻击代码是如何创立的。例如,将一个ASCII0字符压入缓冲区通常是很困难的,而该文介绍
11、了攻击者一般如何能够解决这个问题。除了smashing-stack和更改返回地址外,还存在利用缓冲区溢出缺陷的其他途径。与改写返回地址不同,攻击者可以SmaShing-stack(使堆栈上的缓冲区溢出),然后改写局部变量以利用缓冲区溢出缺陷。缓冲区根本就不必在堆栈上一一它可以是堆中动态分配的内存(也称为“maHoc或“new区域),或者在某些静态分配的内存中(比方“global”或static”内存)。根本上,如果攻击者能够溢出缓冲区的边界,麻烦或许就会找上你了。然而,最危险的缓冲区溢出攻击就是stack-smashing攻击,因为如果程序对攻击者很脆弱,攻击者获得整个机器的控制权就特别容易2
12、3.1.在程序的地址空间里安排适当的代码2. 3.1.1殖入法攻击者用被攻击程序的缓冲区来存放攻击代码。攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的数据是可以在这个被攻击的硬件平台上运行的指令序列。2.3. L2利用已经存在的代码有时候,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一些参数,然后使程序跳转到指定目标。比方,在C语言中,攻击代码要求执行“exec(/bin/sh),而在IibC库中的代码执行“exec(arg),其中arg是指向一个字符串的指针参数,那么攻击者只要把传入的参数指针指向binsh”,就可以调转到Iib
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程 专业 缓冲区 溢出 保护 实践
