实验:缓冲区溢出
缓冲区溢出
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
实验过程
启动云主机
使用实验楼平台的云主机,是一个Ubuntu系统的云主机。开启系统后需要安装实验使用的软件包。
配置实验环境
Ubuntu系统使用地址空间随机化来随机堆和栈的初始地址,使得猜测准确的内存地址变得困难,提高了系统安全性。为完成实验目的,本实验先使用命令sudo sysctl -w kernel.randomize_va_space=0
关闭了这一功能。
同时,ubuntu系统的shell还有一个保护措施,即使在溢出后,也让shell没有高级权限,所以需要将这个措施关闭,使用删除现有的sh二进制文件,改为使用较早的zsh实现使用,使用ln指令相当于是创建了一个链接(符号链接:类似win下快捷方式)
进入32位模式:
使用vim编写漏洞程序和攻击程序
程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”。
编辑攻击程序。
进入调试
获得str的地址
根据所得的地址计算应填入的地址
修改地址
进行攻击
进行攻击并获得结果:
我们发现通过攻击已经获得了root权限。
练习
地址空间随机化
通过命令 sudo sysctl -w kernel.randomize_va_space=2
打开系统的地址空间随机化机制,重复用 exploit 程序攻击 stack 程序,观察能否攻击成功,能否获得root权限。
发现如果使用开启了地址空间随机化,就会出现段错误,从而无法成功攻击,重复多次也没有奏效。由此可见系统的自带的保护机制来防止缓冲区溢出还是很有效果的。
重新关闭地址空间随机化,又可以攻击成功。
使用新shell
将 /bin/sh 重新指向 /bin/bash(或/bin/dash),观察能否攻击成功,能否获得 root 权限。
修改后,发现仍然会导致缓冲区溢出,但溢出后也无法获取到root权限。
重新尝试,连接为zsh后,又可以成功攻击,获得root权限。