Section outline

  • 本实验在 SEEDUbuntu20.04 VM 中测试可行。你可以在本页面右端选择虚拟机版本为 SEEDUbuntu20.04,点击“创建虚拟机”来获取虚拟机平台的临时用户名与密码,登录虚拟机平台即可获得一台预先构建好的 SEEDUbuntu20.04 VM,该虚拟机以及用户名密码将在开启 24 小时后自动销毁。
     
    你也可以在其他 VM、物理机器以及云端 VM 上自行配置环境进行实验,但我们不保证实验能在其他 VM 下成功。实验所需的文件可从下方下载,解压后会得到一个名为 Labsetup 的文件夹,该文件夹内包含了完成本实验所需的所有文件。
      • 现代操作系统已实现多种安全机制以使缓冲区溢出攻击更加困难。为了简化我们的攻击,我们首先需要先禁用它们。稍后我们将启用这些保护措施并观察攻击是否仍然成功。
         
        Ubuntu 和其他几种 Linux 系统使用地址空间随机化来随机化堆和栈的起始地址。这使得猜测确切地址变得困难;猜测地址是缓冲区溢出攻击的关键步骤之一。 可以使用以下命令禁用此功能:
         
        $ sudo sysctl -w kernel.randomize_va_space=0
      • 在最近版本的 Ubuntu 操作系统中,/bin/sh 符号链接指向另一个 shell /bin/dash。程序 dash 以及 bash 实现了一种安全措施来防止它们在 setuid 进程中执行。基本来说,如果检测到它们被以 setuid 方式执行,则会立即更改有效用户 ID 为进程的真实用户 ID,实质上放弃权限。

        由于我们的目标程序是一个 setuid 程序,并且攻击依赖于运行 /bin/sh,/bin/dash 中的防御措施使攻击更加困难。因此,我们将 /bin/sh 链接到另一个没有这种防御机制的 shell(稍后我们会展示,在一些努力之后,可以轻松地击败 /bin/dash 的防御机制)。我们在 Ubuntu 20.04 虚拟机中安装了一个名为 zsh 的 shell 程序。使用以下命令可将 /bin/sh 链接到 zsh:

        $ sudo ln -sf /bin/zsh /bin/sh