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