(一)实验内容
1、理解缓冲区溢出的基本原理。
2、利用函数strcpy()编程实现一个简单的缓冲区溢出实例。
3、总结预防缓冲区溢出的方法。
(二)实验验证原理
1、缓冲区溢出:缓冲区溢出是一种常见且危害很大的系统攻击手段,通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他的指令,以达到攻击的目的。
2、C语言编程中,一些不作边界检查的字符串拷贝函数(如strcpy)容易造成缓冲区溢出。
(三)实验代码
#include <stdio.h>
int main(int argc, char *argv[])
{
char sz1[8];
char sz2[8];
memset(sz1,0x00,sizeof(sz1));
strcpy(sz1,"hello");
printf("sz1=[%s]
",sz1);
while(1)
{
memset(sz2,0x00,sizeof(sz2));
printf("please input passwd:
");
scanf("%s",sz2);
printf("---sz1=[%s]
",sz1);
printf("---sz2=[%s]
",sz2);
if(0 == strcmp(sz1,sz2))
{
printf("----hello world-----
");
break;
}
else
{
printf("----ERROR----
");
continue;
}
}
return 0;
}
(四)实验过程
正常输入:
错误输入:
溢出输入:
(五)预防缓冲区溢出方法:
在编写程序过程中,程序员有责任和义务养成安全编程的思想,应该熟悉那些可能会产生漏洞或需慎用的函数,清楚那些在编程中要小心使用的函数(特别是在使用C语言时),例如:gets()、strcpy()等等。在软件测试阶段,要专门对程序中的每个缓冲区作边界检查和溢出检测。同时,还应该添加保护,让攻击者无法执行缓冲区内的命令。但是,由于程序编写者的经验不足和测试工作不够全面、充分,目前还不可能完全避免缓冲区溢出漏洞,因此这些漏洞在已经使用以及正在开发的软件中还是有存在的可能,还需要在使用软件时,对它做实时的监测。