缓冲区溢出漏洞实验
实验简介
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况,在上一学期的信息安全概论实验课程中我们就已经了解相关的内容,这学期安全编程课的第一次实验也是有关缓冲区溢出攻击的实践。缓冲区溢出漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
实验步骤
初始设置
Ubuntu 和其他一些 Linux 系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能
同时,ubuntu系统的shell还有一个保护措施,即使在溢出后,也让shell没有高级权限,所以需要将这个措施关闭,使用删除现有的sh二进制文件,改为使用较早的zsh实现使用。
linux 系统中,/bin/sh 实际是指向 /bin/bash 或 /bin/dash 的一个符号链接。为了重现这一防护措施被实现之前的情形,我们要使用另一个 shell 程序(zsh)代替 /bin/bash,并在32位环境中使用bash并进入32位模式:
漏洞程序
用vim编写程序stack.c
程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”。
更改生成的可执行文件权限
攻击程序
gdb调试
找到esp对应地址,0x080484ee
在地址 0x080484ee 处设置断点:
最后获得的这个0xffffcfb0就是str的地址。
根据语句 strcpy(buffer + 100,shellcode); 我们计算shellcode 的地址为 0xffffcfb0 + 0x64 = 0xffffd014
再修改 exploit.c 文件,将 x??x??x??x?? 修改为计算的结果 x14xd0xffxff。
实验结果
实施攻击
获得root权限