缓冲区溢出攻击的4.问题

如题所述

第1个回答  2016-05-18

缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:
⒈ 在程序的地址空间里安排适当的代码。
⒉ 通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。
根据这两个目标来对缓冲区溢出攻击进行分类。在4.1节,将描述攻击代码是如何放入被攻击程序的地址空间的。在4.2节,将介绍攻击者如何使一个程序的缓冲区溢出,并且执行转移到攻击代码(这个就是“溢出”的由来)。在4.3节,将综合前两节所讨论的代码安排和控制程序执行流程的技术。
4.1 在程序的地址空间里安排适当的代码的方法
有两种在被攻击程序地址空间里安排攻击代码的方法:
1、植入法
攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的资料是可以在这个被攻击的硬件平台上运行的指令序列。在这里,攻击者用被攻击程序的缓冲区来存放攻击代码。缓冲区可以设在任何地方:堆栈(stack,自动变量)、堆(heap,动态分配的内存区)和静态资料区。
2、利用已经存在的代码
有时,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一些参数。比如,攻击代码要求执行“exec (bin/sh)”,而在libc库中的代码执行“exec (arg)”,其中arg是一个指向一个字符串的指针参数,那么攻击者只要把传入的参数指针改向指向“/bin/sh”。
4.2 控制程序转移到攻击代码的方法
所有的这些方法都是在寻求改变程序的执行流程,使之跳转到攻击代码。最基本的就是溢出一个没有边界检查或者其它弱点的缓冲区,这样就扰乱了程序的正常的执行顺序。通过溢出一个缓冲区,攻击者可以用暴力的方法改写相邻的程序空间而直接跳过了系统的检查。
分类的基准是攻击者所寻求的缓冲区溢出的程序空间类型。原则上是可以任意的空间。实际上,许多的缓冲区溢出是用暴力的方法来寻求改变程序指针的。这类程序的不同之处就是程序空间的突破和内存空间的定位不同。主要有以下三种:
1、活动纪录(Activation Records)
每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击(Stack Smashing Attack),是目前最常用的缓冲区溢出攻击方式。
2、函数指针(Function Pointers)
函数指针可以用来定位任何地址空间。例如:“void (* foo)()”声明了一个返回值为void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在Linux系统下的superprobe程序。
3、长跳转缓冲区(Longjmp buffers)
在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是Perl 5.003的缓冲区溢出漏洞;攻击者首先进入用来恢复缓冲区溢出的的longjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了。
4.3代码植入和流程控制技术的综合分析
最简单和常见的缓冲区溢出攻击类型就是在一个字符串里综合了代码植入和活动纪录技术。攻击者定位一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出,改变活动纪录的同时植入了代码。这个是由Levy指出的攻击的模板。因为C在习惯上只为用户和参数开辟很小的缓冲区,因此这种漏洞攻击的实例十分常见。
代码植入和缓冲区溢出不一定要在在一次动作内完成。攻击者可以在一个缓冲区内放置代码,这是不能溢出的缓冲区。然后,攻击者通过溢出另外一个缓冲区来转移程序的指针。这种方法一般用来解决可供溢出的缓冲区不够大(不能放下全部的代码)的情况。
如果攻击者试图使用已经常驻的代码而不是从外部植入代码,他们通常必须把代码作为参数调用。举例来说,在libc(几乎所有的C程序都要它来连接)中的部分代码段会执行“exec(something)”,其中somthing就是参数。攻击者然后使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。

缓冲区溢出危害
在网络与分布式系统安全领域,超过半数以上的攻击手段源于缓冲区溢出,一个典型的例子是1988年的fingerd漏洞蠕虫事件。其中,堆栈溢出是这种攻击中最具有威胁的一种形式。由于堆栈溢出,攻击者能够利用函数返回时的漏洞,篡改返回地址,使得程序的执行流程转向预设的任意地址,从而引发一系列问题。首先,堆栈溢出...

什么是缓冲区溢出攻击?
缓冲区溢出攻击详解 缓冲区溢出攻击,指黑客试图在预设缓冲区范围外写入数据的行为。这类攻击会引发程序执行流改变,操控函数返回值,甚至执行任意代码。原因在于,程序存储数据(缓冲区)与程序(返回地址)同处于栈上。若数据存储覆盖控制数据,便可能导致缓冲区溢出。实验目标在于掌握缓冲区溢出漏洞原理。通...

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

缓冲区溢出是什么原因造成的
缓冲区溢出是程序设计中的常见错误,尤其在C\/C++中,由于没有数组越界检查,当数据超出分配的内存区域,可能导致栈帧结构被破坏,包括函数返回地址。攻击者通过修改这些值,可以控制程序流程,甚至窃取系统权限。最常见的方式是利用溢出创建一个用户shell,进而执行恶意命令,如果程序具有高权限,攻击者将获得r...

溢出缓冲区溢出
长跳转缓冲区溢出:如Perl 5.003的longjmp缓冲区,攻击者通过溢出此缓冲区,让程序恢复到攻击者预设的代码点。常见的攻击形式是结合代码殖入和激活纪录溢出,攻击者利用大字符串引发溢出,同时殖入恶意代码。此外,缓冲区溢出不一定要一次性完成,可以通过多个步骤,如先放置代码,然后通过溢出其他缓冲区转移...

缓冲区溢出攻击危害
缓冲区溢出攻击是一种严重的网络安全威胁,其核心原理是利用程序设计中的漏洞,使得数据超出预定的内存区域,进而控制程序的执行流程。这种攻击手段具有极大的破坏性,攻击者可以借此执行未经授权的指令,甚至窃取系统的控制权,实施非法操作。这一攻击方式有多种英文名称,如buffer overflow、buffer overrun、...

stack overflow缓冲区溢出
堆栈缓冲区溢出是指程序在运行过程中,由于操作不当导致数据超出了为其分配的堆栈内存空间,从而覆盖相邻内存区域的一种错误。这种情况可能由于编程逻辑错误或外部输入处理不当造成。二、溢出产生的后果 当发生堆栈缓冲区溢出时,可能会导致程序运行异常,如程序崩溃、非法内存访问等。攻击者也可能利用这一漏洞...

溢出攻击缓存区溢出
它被远程攻击者利用,是因为它提供了植入和执行攻击代码的便利条件。在过去的评估和建议中,缓冲区溢出漏洞一直是关注焦点,Bugtraq的调查也显示,它被广泛视为严重安全问题。针对不同类型的缓冲区溢出攻击,防御措施各不相同,将在第四节详细讨论,包括针对每种攻击类型的防护策略。

缓冲区溢出预防缓冲区溢出措施
缓冲区溢出问题是一种常见的代码漏洞,对于预防此类问题,除了在编码阶段注重正确编程,用户层面的防范措施同样重要。首先,管理员应了解系统中安装的软件和服务,及时关闭不必要的端口或服务,确保不被恶意利用。其次,及时更新软件至关重要。当安全漏洞被公开后,知名软件厂商通常会迅速发布补丁,用户应确保...

缓冲区溢出缓冲区攻击
缓冲区溢出攻击的原理是利用程序未能有效检查用户输入,导致数据超出缓冲区预设长度,进而破坏程序堆栈,引发程序错误或执行非预期指令。例如,以下代码中的function函数就存在问题:void function(char *str) { char buffer[16]; strcpy(buffer, str);} 若输入的str长度大于16,strcpy会导致buffer溢出,造成...

相似回答