欢迎访问然逝娱乐站!

首页 >  采暖设备  >  缓冲溢出(缓冲溢出是什么意思)

    缓冲溢出(缓冲溢出是什么意思)

      

    本篇文章给大家谈谈缓冲溢出,缓冲缓冲以及缓冲溢出是溢出溢出什么意思对应的知识点,希望对各位有所帮助,什意思不要忘了收藏本站喔。缓冲缓冲

    什么叫缓冲区溢出

    缓冲区溢出

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

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

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

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

    缓冲区溢出的原理:

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

    void function(char *str) {

    char buffer[16];

    strcpy(buffer,str);

    }

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

    漏洞:

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

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

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

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

    以上内容参考:百度百科-缓冲区溢出

    什么是缓冲区 溢出

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

    缓冲溢出的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于缓冲溢出是什么意思、缓冲溢出的信息别忘了在本站进行查找喔。


    版权声明:本文为「然逝娱乐站」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  
    原文链接:http://coxbd.autobahn-craftwerks.com/news/006a9799896.html
  • 超级神婿(超级神婿苏长弓)

  • 恒河猴(恒河猴是什么意思)

标签列表
友情链接