一、在实验楼上进行实验出现错误
如图所示:
所以接下来的实验在自己的虚拟机上完成。
二、在自己的虚拟机上完成实验
安装32位c语言程序编译器,sudo apt-get lib32z1 libc6-dev-i386
,sudo apt-get install lib32readline6-dev
准备32位实验环境
在实际中为了防范缓冲区溢出等攻击,通常会降低shell程序的权限,即无法保持root权限,为了绕过这个问题,我们使用另一个shell程序,zsh来代替/bin/bash 。并且上面说过,现在为了防止代码的注入,操作系统对于代码所分配的堆栈地址都是随机的,这也不利于我们找到之后我们需要找到的/bin/sh``system函数``exit函数的地址完成地址注入,所以我们要事先关闭掉地址随机化
新建 retlib.c
文件
编译该程序,并设置 SET-UID。命令如下:
上述程序有一个缓冲区溢出漏洞,它先从一个叫 badfile
的文件里把 40 字节的数据读取到 12 字节的 buffer
,引起溢出。fread()
函数不检查边界所以会发生溢出。由于此程序为 SET-ROOT-UID 程序,如果一个普通用户利用了此缓冲区溢出漏洞,他有可能获得 root shell
。应该注意到此程序是从一个叫做badfile
的文件获得输入的,这个文件受用户控制。现在我们的目标是为 badfile
创建内容,这样当这段漏洞程序将此内容复制进它的缓冲区,便产生了一个 root shell。
我们还需要用到一个读取环境变量的程序,新建 getenvaddr.c
文件,文件内容如下:
编译一下:
新建 exploit.c
文件,内容如下:
代码中“0x11111111”、“0x22222222”、“0x33333333”分别是 BIN_SH、system、exit 的地址,需要我们接下来获取。
用刚才的 getenvaddr 程序获得 BIN_SH 地址:
gdb 获得 system 和 exit 地址:
修改 exploit.c
文件,填上刚才找到的内存地址:
删除刚才调试编译的 exploit 程序和 badfile 文件,重新编译修改后的 exploit.c:
先运行攻击程序 exploit,再运行漏洞程序 retlib:
此时并没有出现预期的结果,原因可能是/bin/sh没有指向zsh。