01 缓冲区溢出概述_第1页
01 缓冲区溢出概述_第2页
01 缓冲区溢出概述_第3页
01 缓冲区溢出概述_第4页
01 缓冲区溢出概述_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

缓冲区溢出原理教师:姚砺办公室:计算机学院楼121Email:内容软件开发的平安性缓冲区溢出原理软件质量软件质量问题引发的事故根据美国航空业的调查说明,由于软件质量问题导致的经济损失巨大:1996年损失6.4亿美元、1997年损失1.17亿美元、1998年损失2.55亿美元、1999年损失16亿美元。“运行正确〞的程序就是高质量的程序吗?也许运行速度很低并且浪费内存;(性能差)也许代码的平安性很差;(有漏洞)也许代码写得一塌糊涂;(可维护性差)也许…已经没有也许软件质量McCall的软件质量模型产品运行产品修改产品转移正确性可靠性效率安全性完整性易用性可维护性灵活性可测试性可移植性重复使用性伸缩性软件开发的平安性随着企业一窝蜂似地采用电子商务,平安性不再是一件微缺乏道的事情了,它已经开始成为一个重要的问题。作为开发人员,必须保证所编写的系统的平安性。但是,平安性不是一个可被添加到现有系统的功能部件。和许多用收缩性薄膜包装用户商品的供给商所认为的相反,不能在完成系统之后把有效的平安性象拧螺丝一样拧到系统中去。平安性是软件系统在系统范围存在的特性。因此,从设计软件的最开始就应该考虑到平安性。平安性就象保险、可依赖性、可靠性或任何其它的软件特性。就如同使用一个不可靠系统再添加一个“可靠性〞模块然后希望获得无错的软件是不可能的一样,把平安性象另外一个功能部件一样添加到应用程序也是不可能的。“插入修补〞方法不是一个好方法许多众所周知的软件供给商好象不理解平安性不是一种可添加的功能部件。他们继续以惊人的速度设计并生产产品,而很少注意平安性。他们只有在其产品遭到公开地〔并且经常是突如其来地〕损害时才开始担忧平安性。然后,他们匆忙赶制出一个补丁程序,而不是意识到从一开始就考虑平安性是更好的方法。软件开发的平安性这种方法在电子商务应用程序中行不通。问题包括:开发人员只能够修补他们知道的问题。攻击者可能会找到他们决不会向开发人员报告的问题。由于系统管理员通常工作过度,并且他们不想更改“有效〞的系统,因此他们一般不会应用补丁程序。有时管理员甚至没有意识到应该将某一重要的补丁程序应用到系统上。供给商们通常是迫于市场压力才赶制出补丁程序,因此经常会在补丁程序中引入新的问题。补丁程序仅仅只是修补某一问题的病症,它们不能解决根本的原因。因此,我们应该防止遇到试图修补一个遭到攻击者猛烈攻击的问题的绝望局面。从简单的经济性考虑,在发布软件系统之前找到并除去错误的本钱比发布后再试图修复系统的本钱要低得多也有效得多。通过设计平安系统、仔细实现该系统、然后在发布之前全面测试该系统,我们可以消除这些问题,并开发出一个不依赖补丁程序的真正平安的系统。平安保证的四招:平安性保证设计系统时要有平安性观念。应该在开发周期的所有阶段中考虑平安性,而不是事后想到它时再补救。平安性并不是一个随时都可以添加到系统中的根本功能部件。平安性就象容错;它是一个需要有效、仔细地规划和设计的遍布于整个系统的特性。例如:从运行支撑环境平安角度出发,应考虑操作系统、数据库、应用效劳器、第三方控件等的平安性;从用户的使用角度出发,应考虑权限管理、身份验证;从数据的平安性出发,信用卡号是敏感信息,应该保护它们防止可能的窃听〞……根据和预期的风险分析系统。识别潜在的风险、发生这些风险的可能性以及它们可能到达的严重程度。首先识别的攻击可能会应用到身边系统的何处,然后按严重性给它们划分等级。风险的相对严重性非常依赖于身边系统的需要和目标。风险评估是确定如何分配测试和分析资源的关键。编写平安代码平安性测试技术进行风险测试。从设计过程开始对破坏的系统重复以上步骤。静态分析,它不实际运行代码而只是通过查看代码以找出潜在的脆弱性动态分析,它通过实际运行代码来测试代码。应用常见平安性技术许多系统架构设计师的一个常见的误解是,使系统平安的方法归根结底是防火墙和密码术。漏洞概述Bug与漏洞漏洞挖掘漏洞分析漏洞利用缓冲区溢出漏洞—十年来最大的平安问题在信息平安日益被人们所关注的今天,缓冲区溢出毫无疑问的是最大的平安威胁之一。Internet上的第一例蠕虫〔Morris〕攻击,就是利用了fingerd的缓冲区溢出漏洞。SANS评选出的2005年威胁最大的20个漏洞中,有8个跟缓冲区溢出有关。根据CERT的统计数据,近几年与缓冲区溢出有关的平安事件在50%以上。代码注入攻击是指攻击者本地或者远程向进程的线性地址空间注入一段可执行的二进制代码,然后通过某种手段修改进程的正常控制流程,使进程执行这段代码,从而到达预定目的的攻击行为。缓冲区溢出攻击在严格意义上是指这一类攻击的一个子类。由于攻击者注入代码的位置通常在缓冲区,而且修改进程的正常流程往往需要利用对缓冲区缺乏边界检查的编程错误,所以,以“缓冲区溢出攻击〞指代全体。缓冲区溢出的原理当程序写入超过缓冲区的边界时,这就是所谓的“缓冲区溢出〞。发生缓冲区溢出时,会覆盖下一个相邻的内存块。由于C语言本质上的不平安性,所以它允许程序随意〔或者更准确地说是完全出于偶然〕溢出缓冲区。没有运行时检查来这一防止写入超过缓冲区末尾,所以程序员必须在其自己的代码中执行这一检查,否那么继续下去会遇到问题。通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以到达攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:

voidfunction(char*str){

charbuffer[16];

strcpy(buffer,str);

}

为什么缓冲区溢出是平安性问题?问题:往杯子里倒过多的水使水溢出杯子对人能造成多大的伤害?当缓冲区溢出时,额外的数据会摧残程序将来可能要访问的其它有用的数据。有时,这些其它数据的更改会导致平安性问题。读取或写入超过缓冲区的末尾时,会导致许多不同〔并且通常是不可预料的〕行为:1)程序的执行很奇怪,2)程序完全失败,或者3)程序可以继续,而且在执行中没有任何明显不同。缓冲区溢出的副作用取决于:写入的数据中有多少超过缓冲区边界当缓冲区已满并且溢出时,覆盖了哪些数据〔如果有的话〕程序是否试图读取溢出期间被覆盖的数据哪些数据最终替换被覆盖的内存存在缓冲区溢出的程序的不确定行为使得对它们的调试异常棘手。最坏的情况是:程序可能正发生缓冲区溢出,但根本没有任何副作用的迹象。因此,缓冲区溢出问题常常在标准测试期间是发现不了的。认识缓冲区溢出的重要一点是:在发生溢出时,会潜在地修改碰巧分配在缓冲区附近的任何数据。缓冲区溢出漏洞的危害缓冲区溢出漏洞比其他一些黑客攻击手段更具有破坏力和隐蔽性。这也是利用缓冲区溢出漏洞进行攻击日益普遍的原因。它极容易使效劳程序停止运行,效劳器死机甚至删除效劳器上的数据。它的隐蔽性主要表现在下面几点:首先,漏洞被发现之前一般程序员是不会意识到自己的程序存在漏洞,漏洞的发现者往往并非编写程序的程序员,从而疏忽监测;其次,shellcode都很短,执行时间也非常短,很难在执行过程中被发现;第三,由于漏洞存在于防火墙内部,攻击者所发送的字符串一般情况下防火墙不会阻拦,而攻击者通过执行shellcode所获得的是本来不被允许或没有权限的操作,在防火墙看来也是合理合法的。防火墙在对远程缓冲区溢出攻击的监测方面有先天的缺乏;第四,一个完整的shellcode的执行并不一定会使系统报告错误,并可能不影响正常程序的运行;第五,攻击的随机性和不可预测性使得防御攻击变得异常艰难,而没有攻击时,攻击程序并不会有什么变化这和木马有着本质的区别,这也是堆栈溢出最难被发现的原因;最后,缓冲区溢出漏洞的普遍存在,使得针对这种漏洞的攻击防不胜防各种补丁程序也可能存在着这种漏洞。另外,还存在着攻击者成心散布存在漏洞的应用程序的可能。攻击者还可以借用木马植入的方法,成心在被攻击者的系统中留下存在漏洞的程序,这样做不会因为含有非法字段而被防火墙拒绝;或者利用病毒传播的方式来传播有漏洞的程序,和病毒不同的是,它在一个系统中只留下一份拷贝(要发现这种情况几乎是不可能的。缓冲区攻击的目的攻击的目的利用缓冲区漏洞造成被攻击者的效劳拒绝利用缓冲区漏洞提升权限直接利用远程效劳的缓冲区溢出漏洞,从远程得到目标的控制权。攻击程序所要解决的两个问题在被攻击程序的地址空间安排适当的代码。通过适当的初始化存放器和内存,让程序跳转到入侵者安排的地址空间执行。缓冲区溢出攻击策略之瞒天过海—代码植入//以下代码执行数组shellcode[]unsignedcharshellcode[]="\xEB\x42\x8B\x59\x3C\x8B\x5C\x0B\x78\x03\xD9\x8B\x73\x20\x03\xF1""\x33\xFF\x4F\x47\xAD\x33\xED\x0F\xB6\x14\x01\x38\xF2\x74\x08\xC1""\xCD\x03\x03\xEA\x40\xEB\xF0\x3B\x6C\x24\x04\x75\xE6\x8B\x73\x24""\x03\xF1\x66\x8B\x3C\x7E\x8B\x73\x1C\x03\xF1\x8B\x04\xBE\x03\xC1""\x5B\x5F\x53\xC3\xEB\x4F\x33\xC0\x64\x33\x40\x30\x8B\x40\x0C\x8B""\x70\x1C\xAD\x8B\x48\x08\x58\x33\xDB\x33\xFF\x66\xBF\x33\x32\x57""\x68\x75\x73\x65\x72\x8B\xFC\x53\x51\x53\x50\x50\x53\x57\x68\x54""\x12\x81\x20\xE8\x8A\xFF\xFF\xFF\xFF\xD0\x8B\xC8\x68\x25\x59\x3A""\xE4\xE8\x7C\xFF\xFF\xFF\xFF\xD0\x59\x68\x97\x19\x6C\x2D\xE8\x6F""\xFF\xFF\xFF\xFF\xD0\xE8\xAC\xFF\xFF\xFF""hello,world!";voidmain(){((void(*)())&shellcode[0])();}将需要运行的代码放从文件中读入#include<stdio.h>voidmain(){ unsignedcharshellcode[1000]; FILE*fp=fopen("shellcode.txt","r"); fread(shellcode,166,1,fp); shellcode[166]='\0'; fclose(fp); ((void(*)())&shellcode[0])();

}进一步联想,如果是一个网络程序〔例如效劳器〕,从网络接收一串数据保存到数组中并运行,而这串代码又是恶意代码……….傻不傻啊,居然会有这样的软件设计—学生甲留!OK,他不能,我们让他能!缓冲区溢出攻击之第二招:劫持EIP。缓冲区溢出攻击策略之瞒天过海—代码植入缓冲区溢出攻击策略之劫持EIPEIP的作用函数调用的本质改变程序的执行流程#include<string.h>voidMyCopy(char*str){

charbuff[4];

strcpy(buff,str);}voidmain(){

charinput[]="aaaaaaaaaaaa";

MyCopy(input);}#include"string.h"

voidMyCopy(char*str)

{

charbuff[4];

strcpy(buff,str);

}intmain()

{

charbuffer[]=

"aaaaaaaa\x12\x45\xfa\x7f"

"\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x4D\xC6\x45\xF5\x53"

"\xC6\x45\xF6\x56\xC6\x45\xF7\x43\xC6\x45\xF8\x52\xC6\x45\xF9\x54\xC6\x45\xFA\x2E\xC6"

"\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C\xBA"

"\x77\x1d\x80\x7c"

"\x52\x8D\

温馨提示

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

评论

0/150

提交评论