Section outline

  • 当我们使用所包含的  docker-compose.yml 文件启动容器时,将启动两个容器,每个容器都运行了一个易受攻击的服务器。对于此任务,我们将使用在 10.9.0.5 上运行的服务器,它运行了一个带有格式化字符串漏洞的 32 位程序。对于 Apple Silicon 机器,两个容器都是一样的,并且它们都运行一个 64 位服务器程序(学生可以在此实验中使用任何一个)。
     
    让我们先给这个服务器发送一个消息。我们将看到目标容器打印出的以下消息(你看到的实际消息可能不同)。
     
    $ echo hello | nc 10.9.0.5 9090
    Press Ctrl+C
    
    // 容器控制台上的打印输出
    server-10.9.0.5 | Got a connection from 10.9.0.1
    server-10.9.0.5 | Starting format
    server-10.9.0.5 | Input buffer (address):        0xffffd2d0
    server-10.9.0.5 | The secret message's address:  0x080b4008
    server-10.9.0.5 | The target variable's address: 0x080e5068
    server-10.9.0.5 | Input size: 6
    server-10.9.0.5 | Frame Pointer inside myprintf() = 0xffffd1f8
    server-10.9.0.5 | The target variable's value (before): 0x11223344
    server-10.9.0.5 | hello
    server-10.9.0.5 | (^_^)(^_^) Returned properly (^_^)(^_^)
    server-10.9.0.5 | The target variable's value (after):  0x11223344
     
    服务器接受最多 1500 字节的数据。你的主要工作是构建不同的有效载荷来实现每个任务中指定的目标。你可以将有效 Payload 保存在文件中,然后使用以下命令将它发送到服务器。
     
    $ cat <file> | nc 10.9.0.5 9090
    Press Ctrl+C  if it does not exit.
     
    你的任务是为服务器提供输入,使得当服务器程序在  myprintf() 函数中打印用户输入时,它会崩溃。你可以通过查看容器的打印输出来判断  format 程序是否崩溃。如果 myprintf() 返回,它会打印出 "Returned properly" 和笑脸。如果你看不到,format 程序可能已经崩溃了。然而,服务器程序是不会崩溃的,崩溃的 format 程序运行在服务器程序创建的子进程中。
     
    由于在这个实验中构建的大多数格式化字符串可能相当长,最好使用程序来完成。如果你不熟悉 Python 语言,在 attack-code 目录中,我们为你准备了一份名为 build_string.py 的示例代码。它展示了如何将各种类型的数据放入一个字符串中。