当前位置:首页 » 硬盘大全 » 可能发生缓存区溢出的函数
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

可能发生缓存区溢出的函数

发布时间: 2023-08-31 02:56:36

A. 缓冲区溢出的攻击

通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。
下面通过一个示例来详细看看什么是缓冲区溢出。程序的缓冲区就像一个个格子,每个格子中存放不同的东西,有的是命令,有的是数据,当程序需要接收用户数据,程序预先为之分配了4个格子(下图1中黄色的0~3号格子)。按照程序设计,就是要求用户输入的数据不超过4个。而用户在输入数据时,假设输入了16个数据,而且程序也没有对用户输入数据的多少进行检查,就往预先分配的格子中存放,这样不仅4个分配的格子被使用了,其后相邻的12个格子中的内容都被新数据覆盖了。这样原来12个格子中的内容就丢失了。这时就出现了缓冲区(0~3号格子)溢出了。

在上面示例的基础上来看一个代码实例,程序如下:
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
上面的strcpy()将直接把str中的内容到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年,至少有半数的建议是和缓冲区溢出有关的。在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。
缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。 缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能,这样可以使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。一般而言,攻击者攻击root程序,然后执行类似“exec(sh)”的执行代码来获得root权限的shell。为了达到这个目的,攻击者必须达到如下的两个目标:
1. 在程序的地址空间里安排适当的代码。
2. 通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行。
可以根据这两个目标来对缓冲区溢出攻击进行分类。

B. 缓冲区溢出的基本原理是什么

缓冲区溢出的原理:

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

void function(char *str) {

char buffer[16];

strcpy(buffer,str);

}

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

漏洞:

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

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

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

可以根据这两个目标来对缓冲区溢出攻击进行分类。

以上内容参考:网络-缓冲区溢出

C. 用C语言写一段程序,模拟函数缓冲区溢出攻击(buffer overrun)。

这个基本上没办法给你写例子,受编译环境影响太大。

原理很单纯,就是把函数局部变量作为基址可以直接修改函数的返回地址。用汇编很好办,但C的话很多必要地址只能编译好了才能知道。

----

VS2008 Debug模式编译 关闭Incremental Linking

#include <stdio.h>

void foo();

// __stdcall为了foo2在返回的时候清理foo1调用时候的参数,因为是通过返回进入foo2的,所以foo1的返回地址已经出栈,现在栈里还剩下foo1的两个参数,我们需要第一个参数的位置作为foo2的返回值
// 于是还剩一个参数的位置,foo2也有一个参数,利用__stdcall自己清理参数的特性就可以把剩下的那个参数清理掉。然后我们直接返回到foo1调用后清理参数的代码之后,避免栈混乱。
void __stdcall foo2(void *mmy)
{
printf("foo2...\n当前返回地址: %.8X,位于: %.8X\n", *(&mmy - 1), &mmy - 1);

*(int *)(&mmy - 1) = (int)foo + 0x3A; // 这里的0x3A只有编译后看生成的汇编才能得到。

printf("替换返回地址为foo1返回并清理堆栈后...\n当前返回地址: %.8X,位于: %.8X\n", *(&mmy - 1), &mmy - 1);
}

void foo1(int in_offset, int in_data)
{
int buf[0x10];

printf("foo1...\n当前返回地址: %.8X,位于: %.8X\n", *((void **)&in_offset - 1), (void **)&in_offset - 1);

buf[in_offset] = in_data; // 这里buf + in_offset指向的是foo1的返回地址,foo1返回的时候会跳转的foo2的入口

printf("替换...\n当前返回地址: %.8X,位于: %.8X\n", *((void **)&in_offset - 1), (void **)&in_offset - 1);
}

void foo()
{
printf("foo...\n调用foo1, 通过非法索引将foo1返回地址替换为foo2人口...\n");

foo1(18, (int)foo2); // 这里的18是返回地址相对buf的偏移量,只有编译之后才能获得。VC环境下Debug模式是16个buf元素+1个保护数据+1个过去的帧指针。
}

void main()
{
foo();
}

D. 溢出攻击的缓存区溢出

通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:
void function(char *str) {
char buffer[16];
strcpy(buffer,str);
}
上面的strcpy()将直接把str中的内容到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf()等。
当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid(Set User ID,)权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。
缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。
在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。在Bugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。
缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。