一、实验原理
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况,在上一学期的信息安全概论实验课程中我们就已经了解相关的内容。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
二、实验过程
1.准备环境
打开指定网址进入学习界面,用该界面的环境进行缓冲区溢出的相关实验,输入命令安装一些用于编译 32 位 C 程序的软件包:
关闭地址随机化后,linux 系统中,/bin/sh 实际是指向 /bin/bash 或 /bin/dash 的一个符号链接。为了重现这一防护措施被实现之前的情形,我们要使用另一个 shell 程序(zsh)代替 /bin/bash,并在32位环境中使用bash:
2.编辑漏洞
在 /tmp 目录下新建一个 stack.c 文件并进行编译:
编译该程序,并设置 SET-UID:
3.编辑攻击程序
在 /tmp 目录下新建一个 exploit.c 文件:
进行gdb调试并str 的起始地址:
在地址 0x080484ee 处设置断点:
最后获得的这个 0xffffd4c0 就是 str 的地址。
根据语句 strcpy(buffer + 100,shellcode);
我们计算 shellcode 的地址为 0xffffd4c0 + 0x64 = 0xffffd524,
再修改 exploit.c 文件,将 x??x??x??x??
修改为计算的结果 x24xd5xffxff:
4.实验结果
编译 exploit.c 程序,再运行攻击程序 exploit,再运行漏洞程序 stack:
攻击成功,获得了root权限。