Section outline

  • 我们的第一个目标是在 10.9.0.5 上运行的服务器(端口号为 9090,该程序 stack 是一个 32 位的程序)。我们首先向此服务器发送一条正常消息。你将会看到目标容器打印出来以下信息(实际显示的消息可能不同)。
     
    // 在虚拟机上(即攻击者机器)
    $ echo hello | nc 10.9.0.5 9090
    Press Ctrl+C
    
    // 目标容器中打印出的消息
    server-1-10.9.0.5 | Got a connection from 10.9.0.1
    server-1-10.9.0.5 | Starting stack
    server-1-10.9.0.5 | Input size: 6
    server-1-10.9.0.5 | Frame Pointer (ebp) inside bof():  0xffffdb88    ☆
    server-1-10.9.0.5 | Buffer's address inside bof():     0xffffdb18    ☆
    server-1-10.9.0.5 | ==== Returned Properly ====
     
    服务器会接受用户最多 517 字节的数据,但实际的缓冲区没有那么大,这会导致缓冲区溢出。你的任务是构建攻击载荷以利用此漏洞。如果你把攻击 Payload 保存在一个文件中,可以使用以下命令将其发送给服务器。
     
    $ cat <file> | nc 10.9.0.5 9090
     
    如果服务器程序正常返回,将会打印出 "Returned Properly"。如果没有看到这个消息,则表示 stack 程序可能已经崩溃。服务器仍将继续运行并接受新的连接。
     
    在这个任务中,我们把缓冲区溢出攻击需要的一些关键信息作为提示显示给你,这包括帧指针的值和缓冲区的地址。在 x86、amd64 和 arm64 架构中,帧寄存器分别被命名为 ebp、rbp 及 x29。你可以利用提供的信息构建你的攻击 Payload。
     
    我们在程序中增加了一点随机性,使得不同的同学会看到不同的缓冲区地址和帧指针值。这些数值只有当容器重启时才会改变,因此只要你保持容器运行状态不变,就会看到相同的数字(不同同学的数字仍然不同)。这种随机性与地址随机化机制不同。