实验四缓冲区溢出攻击技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验单元四. 缓冲区溢出攻击技术
一、实验目的和要求
1.掌握缓冲区溢出的原理;
2.掌握缓冲区溢出漏洞的利用技巧;
3.理解缓冲区溢出漏洞的防范措施。
二、实验内容和原理
缓冲区溢出的原理:通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的根本原因是程序中缺少错误检测。
当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell 执行其它命令。如果该程序属于root,攻击者就获得了一个有root 权限的shell,可以对系统进行任意操作。缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。缓冲区溢出漏洞和攻击有很多种形式,而相应的防范手段也随者攻击方法的不同而不同。
三、实验项目
缓冲区溢出产生cmd窗口;
改写函数返回地址;
shellcode的编写;
shellcode的植入。
四、实验所需软硬件
1)仪器设备条件:PC及其网络环境;
2)物质条件:Windows XP SP3、Linux、Gcc、Visual C++ 6.0 编译器等,OllyDbg;
3)相关文献资料:课件及网上收集的资料。
五、操作方法与实验步骤
1.缓冲区溢出漏洞产生的的基本原理和攻击方法 缓冲区溢出模拟程序
程序源代码如下:
运行该程序产生访问异常:
由于拷贝字符串时产生缓冲区溢出,用“ABCD”字符串的值覆盖了原来EIP的值,所以main函数返回时EIP指向44434241,引发访问异常。
运行命令窗口的shellcode
shellcode测试代码如下:
shellcode测试代码运行效果如下:
由于把main函数的返回EIP地址替换成了jmp esp的地址,main函数返回的时候就会执行我们的shellcode代码。该shellcode,运行命令窗口。2.MS06-040 缓冲区溢出漏洞分析和利用
溢出点定位
溢出点定位源代码
程序运行效果如下:
可以看到错误访问地址为63636363,即为‘c’的编码,所以成功得定位了溢出点。
漏洞利用
漏洞利用的源代码如下:
漏洞利用的效果如下:
可以看到成功的利用该漏洞,弹出了一个对话框。
3.TFTPD溢出漏洞分析与利用
溢出点定位
1.构造FUZZ
FUZZ中包含288个A,这个值是通过多次测试获得的,运行效果如下,可以看到发生了溢出:
2.确定溢出点
采用284个’A’+’1234’的fuzz,运行效果如下:
可以看到程序转到了34333231,溢出点定位成功。
3.程序中溢出点定位
使用OllyDbg打开程序,首先找到recvfrom函数,方法是右键点击Search for选项,找到Name in current module,在其中找到recvfrom,
如下所示:
从这里找到recvfrom函数的位置,在此设置断点:
然后启动tftp,重新运行fuzz,程序会进入到断点,跟踪程序的运行过程,发现程序运行到一个strcpy函数时造成溢出,如下图所示:
运行004063A4函数之后,栈的状态如下,可以看到EIP被我们的数据覆盖:
运行到下面的代码处,程序跳转到34333231处,至此溢出点定位完毕。
溢出漏洞利用分析
首先肯定是想到利用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:
该shellcode为弹出一个命令窗口的shellcode,EIP指向7FFC01B0,按照上面的分析,程序将运行shellcode。
漏洞利用
直接在fuzz中加入EIP跳转地址7FFC01B0,构造fuzz如下284个’A’ + 0xB0 + 0x01 + 0xFC + 0x7F,发送到服务器端,发现实际地址不对:
发现这是因为tftp发送的时候只能发送有效的字符,而无效的字符无法发送过去,这样我们必须自己实现tftp客户端,程序代码如下:
#include
#include
#include
// 弹出命令框的Shell长度
#define CMD_SHELL_LENGTH 300
// 弹出命令框的shellcode
char cmdshell[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