章节大纲

  • 本实验中使用的被攻击程序文件名为 format.c,可以在 server-code 文件夹中找到。这个程序有一个格式化字符串漏洞,你的任务是利用这个漏洞。下面列出的代码去除了非必要的信息,所以它与你从实验设置文件中得到的不一样。
     
    // 易受攻击的程序 format.c (去除了非必要信息)
    unsigned int  target = 0x11223344;
    char *secret = "A secret message\n";
    
    void myprintf(char *msg)
    {
        // 此行有一个格式化字符串漏洞
        printf(msg);
    }
    
    int main(int argc, char **argv)
    {
        char buf[1500];
        int length = fread(buf, sizeof(char), 1500, stdin);
        printf("Input size: %d\n", length);
    
        myprintf(buf);
    
        return 1;
    }
     
    上述程序从标准输入中读取数据, 然后将数据传递给 myprintf(),后者调用 printf() 打印数据。输入数据被送入 printf() 函数的方式是不安全的,会导致格式化字符串漏洞。我们将利用这个漏洞。
     
    程序将在具有 root 权限的服务器上运行,其标准输入将被重定向到服务器与远程用户之间的 TCP 连接。因此,程序实际上是从远程用户处获取数据的。如果用户可以利用这个漏洞,他们可以造成损害。
     
    在 server-code 文件夹中,你可以找到一个名为 server.c 的程序。 这是服务器的主要入口点。它监听端口 9090。 当它接收到 TCP 连接时,它调用 format 程序,并将TCP连接设置为 format 程序的标准输入。这样,当 format 从 stdin 读取数据时,它实际上从 TCP 连接中读取,即数据由 TCP 客户端的用户提供,你不需要阅读 server 的源代码。