什么叫缓冲区溢出

什么叫缓冲区溢出问题补充说明:具体一点好伐

什么叫缓冲区溢出

文章插图
缓么善积频才国每德突冲区溢出
缓冲区是内存中存放数据的地方 。在程序试图将数据放到计算机内存中的某一位置,但没有足够空间时会发生缓冲区溢出 。
缓冲区是程序运行时计算机内存中的一个连续的块,它保存了给定类型的数据 。问题来自随着动态分配变量而出现 。为了不360问答用太多的内存,一个有动态分配底然之边专断变量的程序在程序运行时才决定给他们分配多少内存 。如果程序在动态分配缓冲区放入太多的数据会有什么现象?它溢出了,漏到了别的地方 。一个缓冲区溢出应用程序使用这个溢出的数据将汇编语言代码放到计算机的内存中,通常是产生root权限的地方 。单氧练益哥单的缓冲区溢出,并不会产生安全问题 。只有将溢出送到能够以root权限运行命令的区域才行 。这样,红势群往呀季生见金映促一个缓冲区利用程序将能运行的指令放在了有root权限的内面存中,从而一旦运行这些指令,就是以root权限控制了计算机 。总结一下上面的描述 。缓冲区溢出指的是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的 。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的8是州古左0%以上 。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数 。例如下面纪支尔液尽住批组兵实之程序:
example0.c
-------------------四士指者血底外罪棉可----------------------------------------
voidfunction(char*str){
charbuffer[队终消去味酸直16];
strcpy(buffer,str);
}
-----------------------------------------------------立派生早晚------
上面的str贵率磁派cpy()将直接把str中的内容copy到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减去适当的数值 。

推荐阅读