当前位置:首页 » 文件管理 » 缓存区溢出

缓存区溢出

发布时间: 2022-01-30 10:06:42

㈠ 什么叫缓冲区溢出

缓冲区溢出
缓冲区是内存中存放数据的地方。在程序试图将数据放到计算机内存中的某一位置,但没有足够空间时会发生缓冲区溢出。

缓冲区是程序运行时计算机内存中的一个连续的块,它保存了给定类型的数据。问题随着动态分配变量而出现。为了不用太多的内存,一个有动态分配变量的程序在程序运行时才决定给他们分配多少内存。如果程序在动态分配缓冲区放入太多的数据会有什么现象?它溢出了,漏到了别的地方。一个缓冲区溢出应用程序使用这个溢出的数据将汇编语言代码放到计算机的内存中,通常是产生root权限的地方。单单的缓冲区溢出,并不会产生安全问题。只有将溢出送到能够以root权限运行命令的区域才行。这样,一个缓冲区利用程序将能运行的指令放在了有root权限的内存中,从而一旦运行这些指令,就是以root权限控制了计算机。总结一下上面的描述。缓冲区溢出指的是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:

example0.c
-----------------------------------------------------------
void function(char *str) {
char buffer[16];

strcpy(buffer,str);
}
-----------------------------------------------------------

上面的strcpy()将直接把str中的内容到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf(),以及在循环内的getc(),fgetc(),getchar()等。在C语言中,静态变量是分配在数据段中的,动态变量是分配在堆栈段的。缓冲区溢出是利用堆栈段的溢出的。一个程序在内存中通常分为程序段,数据端和堆栈三部分。程序段里放着程序的机器码和只读数据,这个段通常是只读,对它的写操作是非法的。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。在内存中,它们的位置如下:

/――――――――\ 内存低端
|程序段|
|―――――――――|
|数据段|
|―――――――――|
|堆栈|
\―――――――――/内存高端

堆栈是内存中的一个连续的块。一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是,后进先出。也就是说,后放入的数据第一个取出。它支持两个操作,PUSH和POP。PUSH是将数据放到栈的顶端,POP是将栈顶的数据取出。在高级语言中,程序函数调用和函数中的临时变量都用到堆栈。参数的传递和返回值是也用到了堆栈。通常对局部变量的引用是通过给出它们对SP的偏移量来实现的。另外还有一个基址指针(FP,在Intel芯片中是BP),许多编译器实际上是用它来引用本地变量和参数的。通常,参数的相对FP的偏移是正的,局部变量是负的。当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容,做为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。

下面举个例子:
example1.c:
------------------------------------------------------------
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}

void main() {
function(1,2,3);
}
-----------------------------------------------------------

为了理解程序是怎样调用函数function()的,使用-S选项,在Linux下,用gcc进行编译,产生汇编代码输出:

$ gcc -S -o example1.s example1.c

看看输出文件中调用函数的那部分:

pushl $3
pushl $2
pushl $1
call function

这就将3个参数压到堆栈里了,并调用function()。指令call会将指令指针IP压入堆栈。在返回时,RET要用到这个保存的IP。在函数中,第一要做的事是进行一些必要的处理。每个函数都必须有这些过程:

pushl %ebp
movl %esp,%ebp
subl $20,%esp

这几条指令将EBP,基址指针放入堆栈。然后将当前SP拷贝到EBP。然后,为本地变量分配空间,并将它们的大小从SP里减掉。由于内存分配是以字为单位的,因此,这里的buffer1用了8字节(2个字,一个字4字节)。Buffer2用了12字节(3个字)。所以这里将ESP减了20。这样,现在,堆栈看起来应该是这样的。

低端内存高端内存
buffer2 buffer1 sfp ret a b c
< ------ [ ][ ][ ][ ][ ][ ][ ]
栈顶栈底

缓冲区溢出就是在一个缓冲区里写入过多的数据。那怎样利用呢,看
一下下面程序:

example2.c
-----------------------------------------------------------
void function(char *str) {
char buffer[16];

strcpy(buffer,str);
}

void main() {
char large_string[256];
int i;

for( i = 0; i < 255; i++)
large_string[i] = 'A';

function(large_string);
}
------------------------------------------------------------

这个程序是一个经典的缓冲区溢出编码错误。函数将一个字符串不经过边界检查,拷贝到另一内存区域。当调用函数function()时,堆栈如下:

低内存端buffer sfp ret *str高内存端
< ------ [ ][ ][ ][ ]
栈顶栈底

很明显,程序执行的结果是"Segmentation fault (core mped)"或类似的出错信息。因为从buffer开始的256个字节都将被*str的内容'A'覆盖,包括sfp, ret,甚至*str。'A'的十六进值为0x41,所以函数的返回地址变成了0x41414141, 这超出了程序的地址空间,所以出现段错误。可见,缓冲区溢出允许我们改变一个函数的返回地址。通过这种方式,可以改变程序的执行顺序。

㈡ 如何防止缓冲区溢出

缓冲区溢出主要是一个 C/C++ 问题。尽管在通常情况下它很容易修补。但它们仍然是一种对安全代码的威胁。不管是用户也好,程序的攻击者也好,当提供的数据长度大于应用程序预期的长度时,便会发生缓冲区溢出,此时数据会溢出到内部存储器空间。有两种缓冲区溢出不明显且难以修复。一是开发人员没有预料到外部提供的数据会比内部缓冲区大。溢出导致了内存中其他数据结构的破坏,这种破坏通常会被攻击者利用,以运行恶意代码。二是数组索引错误也会造成缓冲区下溢和超限,但这种情况没那么普遍。请看以下 C++ 代码片段: void DoSomething(char *cBuffSrc, DWORD cbBuffSrc)
{
char cBuffDest[32];
memcpy(cBuffDest,cBuffSrc,cbBuffSrc);
}

问题在哪里呢?事实上,如果 cBuffSrc 和 cbBuffSrc 来自可信赖的源(例如不信任数据并因此而验证数据的有效性和大小的代码),则这段代码没有任何问题。然而,如果数据来自不可信赖的源,也未得到验证,那么攻击者(不可信赖源)很容易就可以使 cBuffSrc 比 cBuffDest 大,同时也将 cbBuffSrc 设定为比 cBuffDest 大。当 memcpy 将数据复制到 cBuffDest 中时,来自 DoSomething 的返回地址就会被更改,因为 cBuffDest 在函数的堆栈框架上与返回地址相邻,此时攻击者即可通过代码执行一些恶意操作。弥补的方法就是不要信任用户的输入,并且不信任 cBuffSrc 和 cbBuffSrc 中携带的任何数据:

void DoSomething(char *cBuffSrc, DWORD cbBuffSrc)
{
const DWORD cbBuffDest = 32;
char cBuffDest[cbBuffDest];

#ifdef _DEBUG
memset(cBuffDest, 0x33, cbBuffSrc);
#endif
memcpy(cBuffDest, cBuffSrc, min(cbBuffDest, cbBuffSrc));
}

此函数展示了一个能够减少缓冲区溢出的正确编写的函数的三个特性。首先,它要求调用者提供缓冲区的长度。当然,您不能盲目相信这个值!接下来,在一个调试版本中,代码将探测缓冲区是否真的足够大,以便能够存放源缓冲区。如果不能,则可能触发一个访问冲突并把代码载入调试器。在调试时,您会惊奇地发现竟有如此多的错误。最后也是最重要的是,对 memcpy 的调用是防御性的,它不会复制多于目标缓冲区存放能力的数据

㈢ 缓冲区溢出是怎么回事怎么解决啊

缓冲区是内存中存放数据的地方。在程序试图将数据放到计算机内存中的某一位置,但没有足够空间时会发生缓冲区溢出。

㈣ 路由器的缓存溢出导致是什么意思

存溢出又称为缓冲溢出,让我们先从讨论什么是缓冲区开始,缓冲区指一个
程序的记忆范围(领域),该领域是用来储存一些数据,如电脑程序信息,中间
计算结果,或者输入参数。把数据调入缓冲区之前,程序应该验证缓冲区有足够的长度以容纳所有这些调入的数据。否则,数据将溢出缓冲区并覆写在邻近的数据上,当它运行时,就如同改写了程序。
假如溢出的数据是随意的,那它就不是有效的程序代码,当它试图执行这些随
意数据时,程序就会失败。另一方面,假如数据是有效的程序代码,程序将会按照数据提供者所设定的要求执行代码和新的功能。

㈤ 关于电脑!什么是“缓冲区溢出”

什么是缓冲区溢出

单的说就是程序对接受的输入数据没有进行有效的检测导致错误,后果可能造成程序崩溃或者执行攻击者的命令,详细的资料可以看unsecret.org的漏洞利用栏目 。
缓冲区溢出的概念

缓冲区溢出好比是将十磅的糖放进一个只能装五磅的容器里……

堆栈溢出(又称缓冲区溢出)攻击是最常用的黑客技术之一。我们知道,UNIX本身以及其上的许多应用程序都是用C语言编写的,C语言不检查缓冲区的边界。在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区。这称作“堆栈溢出或缓冲溢出”。

一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误。但是,如果输入的数据是经过“黑客”精心设计的,覆盖堆栈的数据恰恰是黑客的入侵程序代码,黑客就获取了程序的控制权。如果该程序恰好是以root运行的,黑客就获得了root权限,然后他就可以编译黑客程序、留下入侵后门等,实施进一步地攻击。按照这种原理进行的黑客入侵就叫做“堆栈溢出攻击”。

为了便于理解,我们不妨打个比方。缓冲区溢出好比是将十磅的糖放进一个只能装五磅的容器里。一旦该容器放满了,余下的部分就溢出在柜台和地板上,弄得一团糟。由于计算机程序的编写者写了一些编码,但是这些编码没有对目的区域或缓冲区——五磅的容器——做适当的检查,看它们是否够大,能否完全装入新的内容——十磅的糖,结果可能造成缓冲区溢出的产生。如果打算被放进新地方的数据不适合,溢得到处都是,该数据也会制造很多麻烦。但是,如果缓冲区仅仅溢出,这只是一个问题。到此时为止,它还没有破坏性。当糖溢出时,柜台被盖住。可以把糖擦掉或用吸尘器吸走,还柜台本来面貌。与之相对的是,当缓冲区溢出时,过剩的信息覆盖的是计算机内存中以前的内容。除非这些被覆盖的内容被保存或能够恢复,否则就会永远丢失。

在丢失的信息里有能够被程序调用的子程序的列表信息,直到缓冲区溢出发生。另外,给那些子程序的信息——参数——也丢失了。这意味着程序不能得到足够的信息从子程序返回,以完成它的任务。就像一个人步行穿过沙漠。如果他依赖于他的足迹走回头路,当沙暴来袭抹去了这些痕迹时,他将迷失在沙漠中。这个问题比程序仅仅迷失方向严重多了。入侵者用精心编写的入侵代码(一种恶意程序)使缓冲区溢出,然后告诉程序依据预设的方法处理缓冲区,并且执行。此时的程序已经完全被入侵者操纵了。

入侵者经常改编现有的应用程序运行不同的程序。例如,一个入侵者能启动一个新的程序,发送秘密文件(支票本记录,口令文件,或财产清单)给入侵者的电子邮件。这就好像不仅仅是沙暴吹了脚印,而且后来者也会踩出新的脚印,将我们的迷路者领向不同的地方,他自己一无所知的地方。

缓冲区溢出的处理

你屋子里的门和窗户越少,入侵者进入的方式就越少……

由于缓冲区溢出是一个编程问题,所以只能通过修复被破坏的程序的代码而解决问题。如果你没有源代码,从上面“堆栈溢出攻击”的原理可以看出,要防止此类攻击,我们可以:

1、开放程序时仔细检查溢出情况,不允许数据溢出缓冲区。由于编程和编程语言的原因,这非常困难,而且不适合大量已经在使用的程序;

2、使用检查堆栈溢出的编译器或者在程序中加入某些记号,以便程序运行时确认禁止黑客有意造成的溢出。问题是无法针对已有程序,对新程序来讲,需要修改编译器;

3、经常检查你的操作系统和应用程序提供商的站点,一旦发现他们提供的补丁程序,就马上下载并且应用在系统上,这是最好的方法。但是系统管理员总要比攻击者慢一步,如果这个有问题的软件是可选的,甚至是临时的,把它从你的系统中删除。举另外一个例子,你屋子里的门和窗户越少,入侵者进入的方式就越少。

㈥ 数据溢出是什么意思

在计算机中,当要表示的数据超出计算机所使用的数据的表示范围时,则产生数据的溢出,这种现象叫做数据溢出。

例如,一数据源不断发送数据,进入缓存区,再从缓存端口输出。但是若数据写入的速率大于数据读出的速率,那么缓存器迟早要被数据占满,若不采取一定措施(如暂停写入数据),那么数据就会溢出,这样会导致数据的丢失。

数据溢出的的原因

当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了N字节大小的内存缓冲区,随后又向其中复制超过N字节的数据),内存缓冲区就可能会溢出。

最重要的是,C/C++编译器开辟的内存缓冲区常常邻近重要的数据结构。假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。

此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。

㈦ 缓冲区溢出的问题

N=2,Student
student[N],这时只有student[0]和student[1]两个数组元素,而
for(i=1;i<=N;i++)
{
cout<<"请输入第"<<i<<"位学生的成绩:"<<endl;
student[i].SetScore();
}
里i是从1开始算得就会出现student[2],当然会溢出了.

㈧ 什么是缓冲区溢出

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是 程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间想匹配,这就为缓冲区溢出埋下隐患.

操作系统所使用的缓冲区又被称为堆栈. 在各个操作进程之间,指令会被临时储存在堆栈当中,堆栈也会出现缓冲区溢出.

缓冲区溢出有时又称为堆栈溢出攻击,是过去的十多年里,网络安全漏洞常用的一种形式并且易于扩充。相比于其他因素,缓冲区溢出是网络受到攻击的主要原因。

例如:计算机在内存中存储了所有的东西,包括程序、数据和图片。如果计算机要求用户输入8位字符密码却接收到了200位字符的密码,多出来的字符可以写在内存中的其他地方。但事实并不是这样。这就是个小错误。

_______________________________________________________
缓冲区溢出的处理

由于缓冲区溢出是一个编程问题,所以只能通过修复被破坏的程序的代码而解决问题。如果你没有源代码,从上面“堆栈溢出攻击”的原理可以看出,要防止此类攻击,我们可以:

1、开放程序时仔细检查溢出情况,不允许数据溢出缓冲区。由于编程和编程语言的原因,这非常困难,而且不适合大量已经在使用的程序;

2、使用检查堆栈溢出的编译器或者在程序中加入某些记号,以便程序运行时确认禁止黑客有意造成的溢出。问题是无法针对已有程序,对新程序来讲,需要修改编译器;

3、经常检查你的操作系统和应用程序提供商的站点,一旦发现他们提供的补丁程序,就马上下载并且应用在系统上,这是最好的方法。但是系统管理员总要比攻击者慢一步,如果这个有问题的软件是可选的,甚至是临时的,把它从你的系统中删除。举另外一个例子,你屋子里的门和窗户越少,入侵者进入的方式就越少。

㈨ 路由器的缓存溢出导致是什么意思

存溢出又称为缓冲溢出,让我们先从讨论什么是缓冲区开始,缓冲区指一个 程序的记忆范围(领域),该领域是用来储存一些数据,如电脑程序信息,中间 计算结果,或者输入参数。把数据调入缓冲区之前,程序应该验证缓冲区有足够的长度以容纳所有这些调入的数据。否则,数据将溢出缓冲区并覆写在邻近的数据上,当它运行时,就如同改写了程序。 假如溢出的数据是随意的,那它就不是有效的程序代码,当它试图执行这些随 意数据时,程序就会失败。另一方面,假如数据是有效的程序代码,程序将会按照数据提供者所设定的要求执行代码和新的功能。

㈩ 缓冲区溢出的概念

计算机程序一般都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存一般称作缓冲区。溢出是指盛放的东西超出容器容量而溢出来了,在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。

热点内容
昆明编程讲师 发布:2024-10-20 09:27:07 浏览:102
二叉树的递归遍历算法 发布:2024-10-20 09:25:42 浏览:467
电脑数据如何传给服务器 发布:2024-10-20 09:23:17 浏览:772
西门子编程代码 发布:2024-10-20 09:19:00 浏览:261
计算器代码java 发布:2024-10-20 09:18:54 浏览:986
哈弗h2哪个配置有天窗 发布:2024-10-20 09:17:17 浏览:807
ftp每隔5分钟就断一次连接 发布:2024-10-20 09:09:43 浏览:483
私有云盘源码 发布:2024-10-20 09:08:15 浏览:478
电脑的上传速度怎么调 发布:2024-10-20 09:01:18 浏览:872
我的世界服务器淬炼要多少钱 发布:2024-10-20 08:54:10 浏览:952