Section outline

  • 现在我们准备去实现这次攻击的终极目标,代码注入。我们希望能够注入一段二进制格式的恶意代码到服务器的内存中,然后使用格式化字符串漏洞修改函数的返回地址字段。当函数返回时,它可以跳转到我们注入的代码。
     
    此任务中用的技术与前一个任务相似:它们都修改了内存中的一个4字节数字。前一个任务修改了 target 变量,而这个任务修改了函数的返回地址字段。学生需要根据服务器打印出的信息计算出返回地址字段的地址。
      • 要成功完成此任务,必须理解当 printf() 函数在 myprintf() 内部被调用时的栈布局。下图描述了栈布局。
         
        图 1:当 printf() 在 myprintf() 内部被调用时的栈布局
         
        我们有意在 main 和 myprintf 函数之间放置了一个没有用的栈帧,但它没有显示在图中。在开始这项任务之前,你需要回答以下问题(请在你的实验报告中写下你的答案):
         
        • 问题1:标记为 ❷ 和 ❸ 的位置的内存地址是什么?
        • 问题2:我们需要多少个 %x 格式说明符才能将格式字符串参数指针移动到 ❸?记住,参数指针从 ❶ 上方的位置开始。
      • 32 位和 64 位版本的 shellcode 都在 attack-code 文件夹中的 exploit.py 里(对于 Apple Silicon 机器,只有 64 位的 shellcode)。你可以使用它们来构建你的格式字符串。
      • 请构建你的输入,将其提供给服务器程序,并证明你可以成功地让服务器运行你的 shellcode。在你的实验报告中,你需要解释你的格式字符串是如何构建的。请在栈布局图上标记你的恶意代码存储的位置(请提供具体地址)。
         
        我们对运行一些预定的命令不感兴趣。我们希望在目标服务器上获得 root shell,这样我们就可以输入任何我们想要的命令。由于我们在远程机器上,如果简单地让服务器运行 /bin/bash,我们将无法控制该 shell 程序。反向 Shell 是解决这个问题的一个常用技术。请修改你的 shellcode 中的命令字符串,以便你可以在目标服务器上获得反向 shell。请在你的实验报告中包括截图和解释。反向 shell 的详细说明见如下资源。