缓冲区溢出初探.doc
上传人:sy****28 上传时间:2024-09-13 格式:DOC 页数:4 大小:25KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

缓冲区溢出初探.doc

缓冲区溢出初探.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

缓冲区溢出初探作者:sysdog前言:之前跟老师做项目,涉及到对协议漏洞分析,特地学习了下缓冲区溢出漏洞,也就整理出了这篇文章,全当是对漏洞的一点小科普知识吧!由于个人理解原因,文章难免出现不足之处,欢迎大家指正。(一)缓冲区理论学习PE文件(进程)装入内存:PE文件(进程)在内存中按照功能大致划分4个部分(1)代码区(程序段).text主要存储被装入执行的二进制代码,ALU会到这个取指令并执行,这个段通常是只读,对它的写操作是非法的(2)数据区.data主要是存储的全局变量,主要存储静态数据(3)堆区程序在堆区可以动态的请求分配一定大小的内存,并在用完后归还给堆区,动态分配和回收是堆区的主要特点,主要存储动态数据(4)栈区用于动态的存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行缓冲区:缓冲区是程序运行时内存中的一个连续的块,随着程序动态分配变量而出现,用来保存数据。缓冲区溢出:缓冲区溢出也就是堆栈溢出。C语言不检查缓冲区的边界,在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区。一个程序在内存中通常分为程序段,数据端和堆栈三部分。程序段里放着程序的机器码和只读数据,这个段通常是只读,对它的写操作是非法的。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。缓冲区溢出是利用堆栈段的溢出的。一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误。但是如果是黑客精心构造的数据,用来覆盖堆栈来让程序执行黑客的攻击代码。堆栈:程序动态分配的一定大小的内存,主要用于传递参数及函数调用和递归,是一种先进后出的数据结构,栈的操作主要有2种:PUSH(压栈)POP(出栈),栈的主要属性有2个:TOP(栈顶)BASE(栈底),堆栈满足平衡原理函数栈帧和指令寄存器:函数在需要调用时,堆栈就会为这个函数开辟一个新的栈帧,并压入堆栈,这个空间被这个函数独占,当函数调用完成返回,堆栈会弹出函数对应的栈帧,同是释放空间。函数栈帧一般包含下面几个重要信息:(1)局部变量:函数局部变量开辟的内存空间(2)栈帧状态值:保存前栈帧的顶部和底部(实际只保存前栈帧的底部,前栈帧的顶部根据堆栈平衡原理可以计算得到),用于在本帧完成调用后恢复前栈帧(3)函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便在函数返回时恢复函数调用前的代码区继续执行执行Win32平台提供2个特殊的寄存器用来标识系统顶端的栈帧(1)ESP:栈指针寄存器,里面存放着一个指针,指针永远指向程序正在运行的函数的栈帧的栈顶(2)EBP:基址指针寄存器,里面放着一个指针,指针永远指向程序正在运行的函数的栈帧的底部EIP:指令寄存器,里面放着一个指针,指针永远指向下一条要执行的指令地址,CPU按照EIP寄存器所指位置取出指令和操作数,送入ALU(运算器)处理。可以说控制了EIP寄存器的内容就控制了应用程序,EIP指向那里,CPU就去那里执行指令,缓冲区溢出也就是精心构造数据来覆盖EIP寄存器的内容,使之执行我们的攻击代码函数调用:不同的操作系统,不同的语言,不同的编译器在参数传递方式,参数入栈顺序及函数返回是恢复堆栈平衡的操作在子函数还是母函数进行都有所不同。调用方式的差异CBASICPASCALFORTRAN编程语言参数入栈顺序右→左左→右左→右左→右恢复堆栈平衡操母函数、子函数子函数子函数作的位置(默认)Test1.cpp代码如下:#include<stdio.h>intfunction(inta,intb){intc;c=a+b;returnc;}intmain(){intd;d=function(1,2)+5;printf("%d\n",d);}当调用function函数时,对应汇编指令(利用OD单步跟踪了下):子函数Push2Push1//参数是从右向左依次压入堆栈Calltest1.00401005//00401005位置指向function函数的所在地址,CALL指令同时完成2项操作(1)向栈中压入当前指令在内存中的位置,即函数的返回地址(2)跳转到函数如后地址Pushebp//保存前栈帧的底部Pushebp,esp//设置新栈帧底部Subesp,XXX//设置新栈帧顶部(抬高栈顶,为新栈帧开辟空间)(二)本地分析漏洞成因测试环境:windowsSP2VC++6.0OD缓冲区漏洞产生原因:Strcpy函数复制字符串未检查长度造成栈溢出Test2.cpp代码如下:#include"stdafx.h"#include<stdio.h>#include<string.h>charname[]="