您的位置:首页 > 其它

缓冲区和缓冲区溢出[整理]

2010-05-11 16:58 134 查看
转自http://nforcex.blogbus.com/logs/6204589.html

In computing, a buffer is a region of memory used to temporarily hold data while it is being moved from one place to another. Typically, the data is stored in a buffer as it is retrieved from an input device (such as a keyboard) or just before it is sent to an output device (such as a printer). However, a buffer may be used when moving data between processes within a computer. This is comparable to buffers in telecommunication. Buffers can be implemented in either hardware or software, but the vast majority of buffers are implemented in software. Buffers are typically used when there is a difference between the rate at which data is received and the rate at which it can be processed, or in the case that these rates are variable, for example in a printer spooler.
缓冲区是内存中存放数据的地方,是程序运行时计算机内存中的一个连续的块,它保存了给定类型的数据。
问题随着动态分配变量而出现。为了不用太多的内存,一个有动态分配变量的程序在程序运行时才决定给他们分配多少内存。当程序试图将数据放到计算机内存中的某一位置,但没有足够空间时会发生缓冲区溢出。另一种说法,就是说程序在动态分配缓冲区放入太多的数据会有什么现象?它会溢出,会漏到了别的地方。
一个缓冲区溢出应用程序使用这个溢出的数据将汇编语言代码放到计算机的内存中,通常是产生root权限的地方。单单的缓冲区溢出,并不会产生安全问题。只有将溢出送到能够以root权限运行命令的区域才行。这样,一个缓冲区利用程序将能运行的指令放在了有root权限的内存中,从而一旦运行这些指令,就是以root权限控制了计算机。
所以我们更多的时候把缓冲区溢出指的是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。
一个程序在内存中通常分为程序段,数据段、堆栈和系统数据段四部分。代码段里放着程序的机器码和只读数据(只读)。用户数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。系统数据段是操作系统内核内的数据,每个进程对应一套数据,包括页表(page table)和进程控制块(process control block,PCB)。在内存中,它们的位置是:

+------------------+ 内存低端
| 指令段 |
|------------------|
| 用户数据段 |
|------------------|
| 用户堆栈 |
+------------------+ 内存高端

-----------------------------OS内核kernel32------------------------------

+-----------------|
| 系统数据段 |
|------------------|

当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容做为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: