我的命令末尾的这个“&”是如何使脚本如此之快的?

lea*_*erX 18 command-line bash shell-script

在在线解决一些 CTF 挑战时,我遇到了需要对服务器进行暴力破解的情况。这是我写的代码:

#!/bin/bash

for i in {0..9}{0..9}{0..9}{0..9} 
    do
    echo "Now trying code.."
    echo $i
    echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
    done
Run Code Online (Sandbox Code Playgroud)

这是令人难以置信的、令人痛苦的缓慢。我需要尝试从 1000 到 9999 的组合,每 10 次尝试大约需要 5 秒。然后,根据建议,我在这一行的末尾加上了一个“&”:

   echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt &
Run Code Online (Sandbox Code Playgroud)

而且,它在几秒钟内尝试了 100 种组合。我很惊讶。有人可以向我解释逻辑吗?“&”做了什么?

mar*_*nus 30

添加会&产生一个后台进程。

如果你写a; b,它会运行 command a,等待它完成,然后b按顺序运行 command 。

如果您编写a & b,它将a作为后台进程产生。它不会等待它完成,它会b立即开始运行。它将同时运行。

您可以通过在 shell 中进行试验来了解它的作用。如果您已经X安装,xterm是查看会发生什么的好方法:输入

$ xterm
Run Code Online (Sandbox Code Playgroud)

将导致另一个终端窗口打开,第一个窗口将等到您关闭它。只有当你关闭它时,你才能取回你的外壳。如果你输入

$ xterm &
Run Code Online (Sandbox Code Playgroud)

然后它将在后台运行它,您将立即返回您的外壳,同时xterm窗口也将保持打开状态。

所以如果你写

echo "a fixed string" $i | nc localhost *port here* >> /tmp/me/dump.txt
Run Code Online (Sandbox Code Playgroud)

它使连接,发送字符串,商店出来的东西在文件中,只有然后移动到下一个接着一个。

添加&使其不等待。它最终会或多或少地同时运行所有一万个。

您的脚本似乎“结束”得更快,因为它可能实际上并没有在那段时间完成。它只是做了一万个后台作业,然后结束了前台作业。

这也意味着,在您的情况下,它会尝试一次或多或少地打开一万个连接。根据另一端的处理能力,其中一些很可能会失败。不仅如此,而且不能保证它们会按顺序运行,事实上它们几乎肯定不会,所以实际上最终会发生什么/tmp/me/dump.txt是任何人的猜测。

你检查输出是否正确?

  • @intellikid:我无意粗鲁,但这完全是靠运气。不仅顺序无关紧要,服务器的响应也小于 `nc` 的写入缓冲区。如果不是这种情况,服务器的响应很可能是交错的。即,如果您有一个 1 字节的写入缓冲区,并且响应为“1111”和“2222”,那么您可能会看到类似“11221212”的内容,而不是整齐分隔的“1111 2222”。 (16认同)
  • 是的,我解决了这个挑战。如果提供了正确的代码,服务器将使用密码进行响应。我执行这个命令来检查'dump.txt':`$ cat dump.txt | 排序 | uniq -u` ..并且向我透露了包含正确密码的行。 (2认同)