视频链接:https://drive.google.com/open?id=1oJTRT0R0OIpoCc5rv5crlsOxbW3vRUnY
课程编写 | ||
类别 | 内容 | |
实验课题名称 | 栈溢出实验 | |
实验目的与要求 | 学习和理解栈溢出的原理和危害,了解栈溢出的攻击方式和防范措施 | |
实验环境 | VPC1(虚拟PC) | 操作系统类型:Windows XP 网络接口:本地连接 |
VPC1连接要求 | PC网络接口,本地连接与实验网络直连 | |
软件描述 | 学生机要求安装Java环境 VPC1安装VC6.0 | |
实验环境描述 | 学生机与实验室网络直连 | |
预备知识 | 如果向栈上声明的缓冲区中复制数据,但是复制到数据量又比缓冲区大的时候,就会发生栈溢出。在栈上声明的各种变量的位置紧临函数调用程序的返回地址。若用户输入的数据未经验证就传递给strcpy这样的函数,则会导致变量值被攻击者指定的值所改写或调用函数的返回地址将被攻击者选择的地址所覆盖,打乱程序正常运行流程,转而执行恶意代码。 防范栈溢出的有效方法有:禁止栈执行,从而阻止攻击者植入恶意代码;编写安全可靠的代码,始终对输入的内容进行验证;利用编译器的边界检查实现栈保护。 | |
实验内容 | 利用栈溢出修改变量值 | |
实验步骤 | 1、打开控制台。 学生单击“试验环境试验”进入实验场景,单击L005001004xp01_1中的“打开控制台”按钮,进入目标主机。
图1 2、找到桌面上的Microsoft Visual C++ 6.0,双击打开。新建一个C++ Source File,可以取名为zhanyichu。
图2 3、输入以下代码,并编译、组建。(代码位于d:\tools\zhanyichu.txt中)
图3 #include <iostream> #include <string> #include <cstdlib> #include <cstring> using namespace std;
void function(string str) { int x = 10; char buf[10]; strcpy(buf, str.c_str()); cout << "x = " << x << endl; }
int main(int argc, char* argv[]) { string test; cout << "Please input a string:\t"; cin >> test; function(test); system("pause"); return 0; } 4、运行程序,先输入10个字符以内的字符串,得到一个x的值;再输入大于10个的字符串。可以看出,字符串超过了一定长度之后,会导致x的值的变化,这就是溢出的结果。 图4
图5 5、实验结束。 |