有一次和我的朋友聊天时,我想开玩笑说,如果我们只是运行大量随机程序并期望其中一个程序解决我们的问题,我们可能更有可能完成我们的项目。为了证明这一点,我写了这个“概念证明”:
while true; do
dd if=/dev/urandom of=pliczek count=1
chmod +x pliczek
./pliczek
done
Run Code Online (Sandbox Code Playgroud)
令我震惊的是,当我运行这个循环并调用 时ls,我注意到当前目录中有很多文件名看起来随机的文件(在 64 位 x86 上的 Fedora Linux 上测试)。现在我忍不住想知道 - 到底发生了什么?
您正在将 512 个字节写入文件并执行它。所以结果可能是一个 512 字节的程序可能做的任何事情。那是什么取决于你的机器。但是 512 字节是大量指令,因此基本上所有事情都可能发生,例如更改 root 密码、创建随机文件或生成包含项目源代码的 tar 存档。
不需要 ELF 标头。简单的 ASCII 文本就足够了,并且会被当前运行的 shell 解释(因为缺少 shebang 行)。
大于号 ( >) 将输出重定向到文件。因此这个特定的字节已经足以创建文件。例子:
# this will create a file named abc123 in almost every shell
:>abc123
# another variant
>abc123^D
Run Code Online (Sandbox Code Playgroud)
这表明有几种方法可以使用少量字节创建文件,这使得它更有可能发生。