缓冲区溢出漏洞实验
1.实验准备
本实验使用的实验环境是64 位 Ubuntu linux,为了方便观察汇编语句,我们需要在 32 位环境下作操作,因此输入以下命令安装一些用于编译 32 位 C 程序的软件包
sudo apt-get update
sudo apt-get install -y lib32z1 libc6-dev-i386 lib32readline6-dev
sudo apt-get install -y python3.6-gdbm gdb
2.初始设置
Ubuntu 和其他一些 Linux 系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能:
使用另一个 shell 程序(zsh)代替 /bin/bash
输入命令 linux32 进入32位linux环境,并输入/bin/bash使用bash
3.漏洞程序
在 /tmp 目录下新建一个 stack.c 文件,并输入实验指导中的代码:
编译该程序,并设置 SET-UID
4.攻击程序
找到shellcode在内存中的地址,输入命令进入 gdb 调试:
gdb stack
disass main
结果如图所示:
esp 中就是 str 的起始地址,所以我们在地址 0x080484ee 处设置断点。
最后获得的这个 0xffffcfb0 就是 str 的地址。根据语句 strcpy(buffer + 100,shellcode); 我们计算 shellcode 的地址为 0xffffcfb0 + 0x64 = 0xffffd014
在 /tmp 目录下新建一个 exploit.c 文件,输入以下内容并编译:
5.攻击结果
运行攻击程序exploit和漏洞程序stack,输入whoami,发现获得了root权限:
通过命令 sudo sysctl -w kernel.randomize_va_space=2 打开系统的地址空间随机化机制,重复用 exploit 程序攻击 stack 程序,发现出现错误
将 /bin/sh 重新指向 /bin/bash(或/bin/dash)并运行攻击程序exploit和漏洞程序stack,发现同样出现段错误,无法获得root权限: