缓冲区溢出攻击的基本原理是什么?

缓冲区溢出攻击的基本原理是什么?,第1张

缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种 *** 作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法 *** 作。缓冲区溢出攻击有多种英文名称:bufferoverflow,bufferoverrun,smashthestack,trashthestack,scribblethestack,manglethestack,memoryleak,overrunscrew;它们指的都是同一大坦种攻击手段。第一个缓冲区溢出攻击--Morris蠕虫,发生在十年前,它曾造成了全世界6000多台网络服务器瘫痪。

1.概念

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间想匹配,这就为缓冲区溢出埋下隐患. *** 作系统所使用的缓冲区竖禅又被称为"堆栈".在各个滚纤桐 *** 作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。

2.危害

在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。

3.缓冲区攻击

一.缓冲区溢出的原理

通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:

voidfunction(char*str){

charbuffer[16]

strcpy(buffer,str)

}

上面的strcpy()将直接吧str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf()等。

当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentationfault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意 *** 作了。

缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。

在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。

缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。

二、缓冲区溢出的漏洞和攻击

缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:

1.在程序的地址空间里安排适当的代码。

2.通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。

根据这两个目标来对缓冲区溢出攻击进行分类。在二.1节,将描述攻击代码是如何放入被攻击程序的地址空间的。在二.2节,将介绍攻击者如何使一个程序的缓冲区溢出,并且执行转移到攻击代码(这个就是“溢出”的由来)。在二.3节,将综合前两节所讨论的代码安排和控制程序执行流程的技术。

二.1在程序的地址空间里安排适当的代码的方法

有两种在被攻击程序地址空间里安排攻击代码的方法:

1、植入法:

攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的资料是可以在这个被攻击的硬件平台上运行的指令序列。在这里,攻击者用被攻击程序的缓冲区来存放攻击代码。缓冲区可以设在任何地方:堆栈(stack,自动变量)、堆(heap,动态分配的内存区)和静态资料区。

2、利用已经存在的代码:

有时,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一些参数。比如,攻击代码要求执行“exec(“/bin/sh”)”,而在libc库中的代码执行“exec(arg)”,其中arg使一个指向一个字符串的指针参数,那么攻击者只要把传入的参数指针改向指向”/bin/sh”。

二.2控制程序转移到攻击代码的方法

所有的这些方法都是在寻求改变程序的执行流程,使之跳转到攻击代码。最基本的就是溢出一个没有边界检查或者其它弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢出一个缓冲区,攻击者可以用暴力的方法改写相邻的程序空间而直接跳过了系统的检查。

分类的基准是攻击者所寻求的缓冲区溢出的程序空间类型。原则上是可以任意的空间。实际上,许多的缓冲区溢出是用暴力的方法来寻求改变程序指针的。这类程序的不同之处就是程序空间的突破和内存空间的定位不同。主要有以下三种:1、活动纪录(ActivationRecords):

每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击(StackSmashingAttack),是目前最常用的缓冲区溢出攻击方式。

2、函数指针(FunctionPointers):

函数指针可以用来定位任何地址空间。例如:“void(*foo)()”声明了一个返回值为void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在Linux系统下的superprobe程序。

3、长跳转缓冲区(Longjmpbuffers):

在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是Perl5.003的缓冲区溢出漏洞;攻击者首先进入用来恢复缓冲区溢出的的longjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了。

二.3代码植入和流程控制技术的综合分析

最简单和常见的缓冲区溢出攻击类型就是在一个字符串里综合了代码植入和活动纪录技术。攻击者定位一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出,改变活动纪录的同时植入了代码。这个是由Levy指出的攻击的模板。因为C在习惯上只为用户和参数开辟很小的缓冲区,因此这种漏洞攻击的实例十分常见。

代码植入和缓冲区溢出不一定要在在一次动作内完成。攻击者可以在一个缓冲区内放置代码,这是不能溢出的缓冲区。然后,攻击者通过溢出另外一个缓冲区来转移程序的指针。这种方法一般用来解决可供溢出的缓冲区不够大(不能放下全部的代码)的情况。

如果攻击者试图使用已经常驻的代码而不是从外部植入代码,他们通常必须把代码作为参数调用。举例来说,在libc(几乎所有的C程序都要它来连接)中的部分代码段会执行“exec(something)”,其中somthing就是参数。攻击者然后使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。

三、缓冲区溢出攻击的实验分析

2000年1月,Cerberus安全小组发布了微软的IIS4/5存在的一个缓冲区溢出漏洞。攻击该漏洞,可以使Web服务器崩溃,甚至获取超级权限执行任意的代码。目前,微软的IIS4/5是一种主流的Web服务器程序;因而,该缓冲区溢出漏洞对于网站的安全构成了极大的威胁;它的描述如下:

浏览器向IIS提出一个HTTP请求,在域名(或IP地址)后,加上一个文件名,该文件名以“.htr”做后缀。于是IIS认为客户端正在请求一个“.htr”文件,“.htr”扩展文件被映像成ISAPI(InternetServiceAPI)应用程序,IIS会复位向所有针对“.htr”资源的请求到ISM.DLL程序,ISM.DLL打开这个文件并执行之。

浏览器提交的请求中包含的文件名存储在局部变量缓冲区中,若它很长,超过600个字符时,会导致局部变量缓冲区溢出,覆盖返回地址空间,使IIS崩溃。更进一步,在如图1所示的2K缓冲区中植入一段精心设计的代码,可以使之以系统超级权限运行。

四、缓冲区溢出攻击的防范方法

缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。

目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响。在四.1中介绍了通过 *** 作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。在四.2中介绍了强制写正确的代码的方法。在四.3中介绍了利用编译器的边界检查来实现缓冲区的保护。这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言代价比较大。在四.4中介绍一种间接的方法,这个方法在程序指针失效前进行完整性检查。虽然这种方法不能使得所有的缓冲区溢出失效,但它能阻止绝大多数的缓冲区溢出攻击。然后在四.5,分析这种保护方法的兼容性和性能优势。

四.1非执行的缓冲区

通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码,这种技术被称为非执行的缓冲区技术。在早期的Unix系统设计中,只允许程序代码在代码段中执行。但是近来的Unix和MSWindows系统由于要实现更好的性能和功能,往往在数据段中动态地放入可执行的代码,这也是缓冲区溢出的根源。为了保持程序的兼容性,不可能使得所有程序的数据段不可执行。

但是可以设定堆栈数据段不可执行,这样就可以保证程序的兼容性。Linux和Solaris都发布了有关这方面的内核补丁。因为几乎没有任何合法的程序会在堆栈中存放代码,这种做法几乎不产生任何兼容性问题,除了在Linux中的两个特例,这时可执行的代码必须被放入堆栈中:

(1)信号传递:

Linux通过向进程堆栈释放代码然后引发中断来执行在堆栈中的代码来实现向进程发送Unix信号。非执行缓冲区的补丁在发送信号的时候是允许缓冲区可执行的。

(2)GCC的在线重用:

研究发现gcc在堆栈区里放置了可执行的代码作为在线重用之用。然而,关闭这个功能并不产生任何问题,只有部分功能似乎不能使用。

非执行堆栈的保护可以有效地对付把代码植入自动变量的缓冲区溢出攻击,而对于其它形式的攻击则没有效果。通过引用一个驻留的程序的指针,就可以跳过这种保护措施。其它的攻击可以采用把代码植入堆或者静态数据段中来跳过保护。

四.2编写正确的代码

编写正确的代码是一件非常有意义的工作,特别象编写C语言那种风格自由而容易出错的程序,这种风格是由于追求性能而忽视正确性的传统引起的。尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。因此人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序。

最简单的方法就是用grep来搜索源代码中容易产生漏洞的库的调用,比如对strcpy和sprintf的调用,这两个函数都没有检查输入参数的长度。事实上,各个版本C的标准库均有这样的问题存在。

此外,人们还开发了一些高级的查错工具,如faultinjection等。这些工具的目的在于通过人为随机地产生一些缓冲区溢出来寻找代码的安全漏洞。还有一些静态分析工具用于侦测缓冲区溢出的存在。

虽然这些工具帮助程序员开发更安全的程序,但是由于C语言的特点,这些工具不可能找出所有的缓冲区溢出漏洞。所以,侦错技术只能用来减少缓冲区溢出的可能,并不能完全地消除它的存在。

计算机中,溢出是什么意思?

1。数据过大。 数据超过了预定类型的界限,就会出现的皮晌数据溢出。

2。数据量过大。 如定义数组 Array[10], 而在链握段调用时使用 Array[11]! 内存缓冲区就可能会溢出。

溢出原因分析

1。程序员经验不足。 导致内存溢出,程序错乱,甚至死机。

2。程序员水平太高。 超范围棚誉 *** 作内存,以达到不可告人的目的。

这就是溢出漏洞

本词条缺少信息栏、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!

溢出漏洞是一种计算机程序的可更正性缺陷。溢出漏洞的全名:缓冲区溢出漏洞 因为它是在程序执行的时候在缓冲区执行的错误代码,所以叫缓冲区溢出漏洞。

目录

1简介

2何谓溢出漏洞

▪ 溢出原理

▪ 本地溢出

▪ 远程溢出

3相关资料

▪ 在程序的地址空间里安排适当的代码

▪ 控制程序转移到攻击代码的形式

▪ 植入综合代码和流程控制

1简介编辑

它一般是由于编程人员的疏忽造成的。

具体的讲,溢出漏洞是由于程序中的某个或某些输入函数(使用者输入参数)对所接收数据的边界验证不严密而造成。

根据程序执行中堆栈调用原理,程序对超出边界的部分如果没有经过验证自动去掉,那么超出边界的部分就会覆盖后面的存放程序指针的数据,当执行完上面的代码,程序会自动调用指针所指向地址的命令。

根据这个原理,恶意使用者就可以构造出溢出程序。

2何谓溢出漏洞编辑

溢出原理

其实溢出原理很简单(我以前以为很难理解,太菜了,o(∩_∩)o…)。当然,这里为了让大家容易理解,会引用一些程序实例(如果没有编程基础的,可以略过程序不看,影响不大,还是能理解的),而且说得会比较通俗和简单,不会太深入。

从书上找来找去,终于找到一个适合的程序(汗!要找符合的程序简单啊,但是要找特级菜鸟觉得特别简单的程序就不多了,55~~)。大家看看下面这段程序:

#include “stdafx.h”

#include “string.h”

#include “stdio.h”

char buf[255],pass[4]/*声明变量,让计算机分配指定的内存*/

int main (int argc,char* argv[ ])

{

printf(“请输入您的密码:”)/*指定输出的字符*/

scanf(%s,buf); /*输入一个字符串,保存在变量buf中*/

strcpy(pass,buf)/*把字符串buf中的字符串复制到变量pass中*/

if (strcmp(pass,”wlqs”)= =0) /*比较输入的字符串是否为密码*/

printf (“输入正确!”);

else printf(“输入错误!);

return 0

}

(注:“/*”中的中文是对程序的注解)

这是一段密码验证程序,与我们平时输入密码一样,先让用户输入密码,然后在取得真正的密码,与之对比,如果差异为0,则输出密码正确,否则输出密码错误。很多帐号登录的程序都是这样做的,看起来没有非常合理,其实不然,它有一个致命缺陷!这个卖判漏洞很容易就看出来了。那就是它给数据申请了4个字节的储存空间,但是万一用户输入的数据不只4个字节,那么剩余的字节存放在哪里?

先举个例子,有一条一米长的木头,有一张红色纸条从尾巴往头贴,上面写有字,然后又有一张蓝色纸条,上面也写有字,要从木头的头往它的尾巴贴,但是贴了红色纸条过后只剩4cm的长度,贴完后会有人读出后面96cm的字,并且执行字条的命令,但是蓝色纸条却有10cm的长度,怎么办呢?只有把蓝色纸条剩下的部分贴在红色纸条上了。那么红色纸条的一些字就被覆盖了。但是那个人还是会去读那后面96cm的字,所以他就只有读错,前面读的都是蓝色字条的字。先前去执行的是蓝色字条后面6cm的命令。

当然大家看了这个例子也不是很懂,下面来注解一下:

人——CPU

红色字条上的字——CPU要执行的命令

4cm的长度——计算机为数据申请的内存空间

蓝色字条上的字——要储存的数据

可以看见蓝色字条已经覆盖了红色字条上的字,然而那个人还是必须读出后面96cm的字并执行。后面已经不是规定的命令了!他根本就不能执行,根本读不懂!那么他就不能执行了,并且报错。

如图系统只为我的密码分配4个字节的内存,那么我输入的密码是“714718366”循环了6次的,不只4个字节吧扒首,其他剩下的字符将溢出!剩下的数字将占用内存空间,那么系统执行命令的时候将会执行占用内存的数据,而不是执行原先写好的命令了!这些数字系统根本就读不懂,如何执行?那么它只好报错了!说此程序遇到问题需要关闭。那么计算机上的程序将出错而无法执行或关闭。

本地溢出

上面所说的本地计算机因数据溢出而关闭程序或无法执行就叫做本地溢出。输入超长的数据已经把计算机要执行的代码覆盖掉了,可是,计算机不会管中此改指令有没有被更改,依旧取原先存放指令的空间里的数据来运行,取到“shujucuole!shujucuole!shujucuole!”这些不合法的溢出数据,它依旧会执行,可是在计算机里这样的指令是非法指令,也就是不符合计算机逻辑的指令,用户执行它的时候就会出错,于是程序就被强行关闭了。

题外话:(想来想去,还是说一说o(∩_∩)o…我的爱好……损人利己的爱好)利用这样的溢出漏洞可以关闭很多程序,比如各学校机房里安装的那些远程教育系统,学生的计算机被教师的计算机所控制是因为学生机上安装有一个学生端程序,教师机可以通过教师端来对学生端进行远程控制,学生端没有退出功能,学生所在的用户组也没有强行结束进程的权限,当学生不想被老师控制的时候,可以打开学生端自带的远程消息功能,在消息里输入很长的数据,比如几百上千句“敢控制我!看我不宰了你!”,然后发送,就可以令学生端程序出错而被系统强行关闭。这招对某些网吧的收费系统也有用的!^_^

远程溢出

再举个列子:

#include “stdafx.h”

#include <winsock.h>

#pragma comment(lib,”ws2_32”)

int main(int argc,char* argv[ ])

{

char buf[255]=” ”,pass[4]=” ”; //声明变量,让计算机分配内存

//================================================================

//这节的代码功能是初始化网络连接

//并侦听1234端口等待连接

//没有编程基础的特级菜鸟可以略过不看

SOCKET sock1,sock2;

struct sockaddr_in addr1

struct sockaddr_in addr2

addr1 .sin_addr.s_addr=INADDR_ANY

addr1 .sin_family=AF_INET

addr1 .sin_port=htons(1234)

WSADATA * wsadatal=new WSADATA( )

WSAStartup(MAKEWORD(2,2),wsadatal1)

sock1=socket(AF_INET,SOCK_STREAM,0)

bind(sock1,(sockaddr *)&addr1,sizeof(struct sockaddr) )

listen(sock1,10)

int iSin=sizeof(struct sockaddr_in)

//=================================================================

if(sock2=accept(sock1,(sockaddr *)&addr2,&iSin)

{//有用户连接进来

send(sock2,“请输入密码,密码正确,则告诉你我的qq:”,36,0)

//发送提示用户输入密码

if (recv(sock2,buf,255,0))

{//接受用户发送过来的数据并保存在缓冲buf变量里

strcpy (pass,buf)//把缓冲buf变量里的数据复制到pass变量中

if(strcmp(pass,”wlqs”= =0)

//比较pass变量里的数据跟“wlqs”字符串之间的差异是否为0

{//差异为0,则说明两者相等,密码正确

send(sock2,”714718366”,9,0);//发送QQ号给用户

}

else

{//否则就说明密码错误

send (sock2,”密码错误!”,10,0)

}

}

}

//=================[/ft]关闭网络连接并退出=======================

closesocket(sock2)

closesocket(sock1)

return 0

}

这是一个服务器程序,当有用户连接的时候,它会先发送一句话,提示用户输入登录密码。其实它和前面说的本地溢出例子形似,问题也就处在把数据从缓存复制到内存的那句代码里,如果远程用户输入的密码太长,那么同样出现溢出的现象。那么程序就会出错,服务端将被强行关闭。

比如腾讯公司的即时通讯软件服务端程序就曾被黑客不停地攻击导致服务端崩溃,不能正常提供服务,致使很多用户都不能登陆,及时登陆成功也会在几分钟之内再次掉线,就是因为他们的服务端有这样的漏洞存在,被别人利用了,这给他们以及他们的客户造成了不可估计的损失。

3相关资料编辑

缓冲区溢出漏洞攻击方式

缓冲区溢出漏洞可以使任何一个有黑客技术的人取得机器的控制权甚至是最高权限。一般利用缓冲区溢出漏洞攻击root程序,大都通过执行类似“exec(sh)”的执行代码来获得root 的shell。黑客要达到目的通常要完成两个任务,就是在程序的地址空间里安排适当的代码和通过适当的初始化寄存器和存储器,让程序跳转到安排好的地址空间执行。

在程序的地址空间里安排适当的代码

在程序的地址空间里安排适当的代码往往是相对简单的。如果要攻击的代码在所攻击程序中已经存在了,那么就简单地对代码传递一些参数,然后使程序跳转到目标中就可以完成了。攻击代码要求执行“exec(‘/bin/sh’)”,而在libc库中的代码执行“exec(arg)”,其中的“arg”是个指向字符串的指针参数,只要把传入的参数指针修改指向“/bin/sh”,然后再跳转到libc库中的响应指令序列就可以了。当然,很多时候这个可能性是很小的,那么就得用一种叫“植入法”的方式来完成了。当向要攻击的程序里输入一个字符串时,程序就会把这个字符串放到缓冲区里,这个字符串包含的数据是可以在这个所攻击的目标的硬件平台上运行的指令序列。缓冲区可以设在:堆栈(自动变量)、堆(动态分配的)和静态数据区(初始化或者未初始化的数据)等的任何地方。也可以不必为达到这个目的而溢出任何缓冲区,只要找到足够的空间来放置这些攻击代码就够了。

控制程序转移到攻击代码的形式

缓冲区溢出漏洞攻击都是在寻求改变程序的执行流程,使它跳转到攻击代码,最为基本的就是溢出一个没有检查或者其他漏洞的缓冲区,这样做就会扰乱程序的正常执行次序。通过溢出某缓冲区,可以改写相近程序的空间而直接跳转过系统对身份的验证。原则上来讲攻击时所针对的缓冲区溢出的程序空间可为任意空间。但因不同地方的定位相异,所以也就带出了多种转移方式。

(1)Function Pointers(函数指针)

在程序中,“void (* foo) ( )”声明了个返回值为“void” Function Pointers的变量“foo”。Function Pointers可以用来定位任意地址空间,攻击时只需要在任意空间里的Function Pointers邻近处找到一个能够溢出的缓冲区,然后用溢出来改变Function Pointers。当程序通过Function Pointers调用函数,程序的流程就会实现。

(2)Activation Records(激活记录)

当一个函数调用发生时,堆栈中会留驻一个Activation Records,它包含了函数结束时返回的地址。执行溢出这些自动变量,使这个返回的地址指向攻击代码,再通过改变程序的返回地址。当函数调用结束时,程序就会跳转到事先所设定的地址,而不是原来的地址。这样的溢出方式也是较常见的。

(3)Longjmp buffers(长跳转缓冲区)

在C语言中包含了一个简单的检验/恢复系统,称为“setjmp/longjmp”,意思是在检验点设定“setjmp(buffer)”,用longjmp(buffer)“来恢复检验点。如果攻击时能够进入缓冲区的空间,感觉“longjmp(buffer)”实际上是跳转到攻击的代码。像Function Pointers一样,longjmp缓冲区能够指向任何地方,所以找到一个可供溢出的缓冲区是最先应该做的事情。

植入综合代码和流程控制

常见的溢出缓冲区攻击类是在一个字符串里综合了代码植入和Activation Records。攻击时定位在一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出改变Activation Records的同时植入代码(权因C在习惯上只为用户和参数开辟很小的缓冲区)。植入代码和缓冲区溢出不一定要一次性完成,可以在一个缓冲区内放置代码(这个时候并不能溢出缓冲区),然后通过溢出另一个缓冲区来转移程序的指针。这样的方法一般是用于可供溢出的缓冲区不能放入全部代码时的。如果想使用已经驻留的代码不需要再外部植入的时候,通常必须先把代码做为参数。在libc(熟悉C的朋友应该知道,现在几乎所有的C程序连接都是利用它来连接的)中的一部分代码段会执行“exec(something)”,当中的something就是参数,使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。

程序编写的错误造成网络的不安全性也应当受到重视,因为它的不安全性已被缓冲区溢出表现得淋漓尽致了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12457411.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存