c语言 - Python:为什么 Popen 返回的进程有一个"none"标准?



我正在尝试用python制作一个程序来暴力破解ctf C程序,您必须在其中找到水果沙拉食谱才能获得标志。

我想做什么:我希望能够用python编写C程序的stdin。

问题:Popen 返回的进程的 stdin 具有 none 值,而 stdout 和 stderr 是正确的。

我的程序输出:

start bruteforce...
<_io.BufferedReader name=3>
<_io.BufferedReader name=5>
None

法典:

如您所见,我正在使用打印然后在循环之前退出以调试进程 std,我不明白为什么我在打印时会Noneprint(process.stdin)

!/usr/bin/python3
import random
import os
import sys
from subprocess import *
from contextlib import contextmanager
from io import StringIO
fruit = ["banana", "raspberry", "orange", "lemon"]
comb = ""
found = False
print("start bruteforce...")
process = Popen(['./fruit'], stdout=PIPE, stderr=PIPE)
print(process.stdout)
print(process.stderr)
print(process.stdin)
sys.exit(1)
while True:    
for i in range(4):
pick = random.choice(fruit)
inp, output = process.stdin, process.stdout
comb += pick
comb += " "
inp.write(pick)
inp.write("n")
out = output.read().decode('utf-8')
if "flag" in out:
found = True
break
if found == True:
print("found : " + com) 
break
print(comb + " : is not valid")
comb = ""
os.kill(p.pid, signal.CTRL_C_EVENT)

谢谢 !

修复了,这要归功于 Ackdari,我替换了:

process = Popen(['./fruit'], stdout=PIPE, stderr=PIPE)

process = Popen(['./fruit'], stdout=PIPE, stdin=PIPE)

因为我无论如何都没有使用 stderr。

我希望能够在stdin上写

这是被禁止的,至少按照POSIX标准是这样,在Linux上是没有意义的。正如其名称所建议的那样stdin是一个标准输入,您的程序应该读取而不是写入它。

当然,请注意 pipe(7(-s 有一个输入和一个输出。你正在写你的stdout,这就是popen-ed过程的stdin

相关内容

最新更新