我目前正在努力完成所有关卡上的窃贼'战争游戏'。在
其中一个级别(级别24)要求我连接到一个端口,该端口上正在运行守护程序。此守护程序要求输入密码和4位pin。密码已知(在上一级末尾提供),pin未知。有迹象表明,有必要对其进行“暴力”处理。在
输入错误的pin会导致以下消息:“错误!请输入正确的密码。再试一次。”。在
我决定编写一个python脚本来自动执行这个过程。脚本将:
1) 通过netcat连接到端口
2) 输入密码和随机生成的pin
3) 读取输出,如果其中有单词“again”(再次),则通过循环重复,直到猜到pin。在
但是,尽管我的脚本运行并连接,但是一旦与它的端口建立了连接,它就无法与守护进程通信。在
我得到的只是守护进程的提示,请求密码和pin。在
这是我的代码:import subprocess
import random
# Initialise variables
pin = ''
output = "Wrong! Please enter the correct pincode. Try again."
# Connect to the port
def connect_to_port():
subprocess.call(["nc localhost 30002"], shell=True)
# Generate pin
# TO DO: skip pins that were proven incorrect
def generate_pin():
pin = ''
pin_len = 0
while pin_len < 4:
pin += str(random.randint(0, 9))
pin_len += 1
return pin
# Connect to port
# Loop: check if 'again' is in 'output',
# if it is, generate a pin and input password and pin
def main():
connect_to_port()
while 'again' in output:
pin = generate_pin()
out = subprocess.check_output(["UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ", pin])
output = out.decode("utf-8")
main()
我怀疑我没有正确地使用subprocess模块,但我真的不明白如何使用。为什么我的剧本不起作用?在
请原谅我对相关术语的初步使用。在
编辑:我发现subprocess.check_out()的用法是完全错误的。正如答案和注释中所建议的,我需要的是打开一个管道并使用communicate()来写入子进程的stdin(每次修改pin)并读取它的stdout,但我不知道该怎么做。在