


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
缓冲区溢出 缓冲区是内存中存放数据的地方。在程序试图将数据放到计算机内存中的某一位置,但没有足够空间时会发生缓冲区溢出。 缓冲区是程序运行时计算机内存中的一个连续的块,它保存了给定类型的数据。问题随着动态分配变量而出现。为了不用太多的内存,一个有动态分配变量的程序在程序运行时才决定给他们分配多少内存。如果程序在动态分配缓冲区放入太多的数据会有什么现象?它溢出了,漏到了别的地方。一个缓冲区溢出应用程序使用这个溢出的数据将汇编语言代码放到计算机的内存中,通常是产生root权限的地方。单单的缓冲区溢出,并不会产生安全问题。只有将溢出送到能够以root权限运行命令的区域才行。这样,一个缓冲区利用程序将能运行的指令放在了有root权限的内存中,从而一旦运行这些指令,就是以root权限控制了计算机。总结一下上面的描述。缓冲区溢出指的是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序: example0.c - void function(char *str) char buffer16; 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 buffer15; char buffer210; 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 buffer16; strcpy(buffer,str); void main() char large_string256; int i; for( i = 0; i 255; i+) large_stringi = A; function(large_string); - 这个程序是一个经典的缓冲区溢出编码错误。函数将一个字符串不经过边界检查,拷贝到另一内存区域。当调用函数function()时,堆栈如下: 低内存端buffer sfp ret *str高内存端 - 栈顶栈底 很明显,程序执行的结果是Segmentation fault (core dumped)或类似的出错信息。因为从buffer开始的256个字节都将被*str
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-湖南-湖南兽医防治员一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-湖南-湖南中式烹调师五级(初级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖北-湖北医技工二级(技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖北-湖北保安员二级(技师)历年参考题库含答案解析
- 汽车与交通设备行业:汽车安全带技术发展趋势报告
- 2025年事业单位工勤技能-浙江-浙江工程测量工四级(中级工)历年参考题库含答案解析(5套)
- 2025年生态修复工程中生态系统服务功能评估与生态修复工程技术创新
- 2025年事业单位工勤技能-河南-河南地质勘查员二级(技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-河北-河北造林管护工二级(技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-江苏-江苏地图绘制员五级(初级工)历年参考题库含答案解析
- 村流动人口管理办法细则
- HY/T0305-2024养殖大型藻类和双壳贝类碳汇计量方法碳储量变化法
- 中式婚礼知识培训课件
- 2025年4月安全生产会议记录
- 2025年试题辅警面考试练习题目及答案
- 2025年江苏省苏豪控股集团有限公司校园招聘笔试备考试题及答案详解(各地真题)
- 存款保险宣传培训
- 质量检查员基础知识培训
- 燃气施工安全培训课件
- 具有履行合同所必需的设备和专业技术能力的承诺书完整版
- 茶馆门店运营管理制度
评论
0/150
提交评论