Section outline

  • 让我们假设这台机器非常慢,在 access() 和 fopen() 之间存在 10 秒的时间窗口。为了模拟这种情况,我们可以在两者之间添加一个sleep(10)。程序如下:
    if (!access(fn, W_OK)) {
         sleep(10);
         fp = fopen(fn, "a+");
         ...
     
    加上这行以后,重新编译后的 vulp 程序将暂停 10 秒。你的任务是在这 10 秒内做一些事情,以便当程序在 10 秒后恢复运行时可以帮您添加一个具有root权限的帐户。请演示如何实现这一点。
     
    我们是没法修改文件名 /tmp/XYZ 的,因为它被硬编码在程序里,但是可以通过符号链接来改变其含义。例如,可以将 /tmp/XYZ 重定向到 /dev/null 文件上。当我们向 /tmp/XYZ 写入数据时,实际的内容会写入 /dev/null。以下是一个示例("f" 选项表示如果链接已存在,则先删除旧的链接):
     
    $ ln -sf /dev/null /tmp/XYZ
    $ ls -ld /tmp/XYZ
    lrwxrwxrwx 1 seed seed 9 Dec 25 22:20 /tmp/XYZ -> /dev/null