我目前正在嘗試完成Over the Wire的Bandit'wargame'的所有關卡。自動輸入蠻力程序在Python中運行的cli
其中一個級別(級別24)需要我連接到運行守護程序的端口。這個守護進程要求輸入一個密碼和一個4位數的引腳。密碼是已知的(它在前一級的末尾提供),該引腳是未知的。有跡象表明,有必要「蠻橫」。
輸入一個錯誤的針會導致此消息:「錯了!請輸入正確的PIN碼,再試一次。」
我決定編寫一個自動執行該過程的python腳本。該腳本將: 1)通過netcat連接到端口 2)輸入密碼和一個隨機生成的針腳 3)讀取輸出,如果單詞'again'在其中(意思是引腳錯誤),通過循環重複,直到引腳被猜測。
雖然我的腳本運行並連接,但一旦建立與其端口的連接,它將無法與守護進程通信。
我得到的只是守護進程的提示,請求密碼和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()
都是錯誤的。正如答案和評論所建議的那樣,我需要打開PIPE並使用communicate()
寫入子進程的stdin
(每次修改引腳)並閱讀它的stdout
,但我不確定如何去處理那。
如果該過程要求您通過stdin輸入引腳,也許您需要使用'subprocess.Popen.communicate'。 – Kevin 2015-04-02 11:59:28
謝謝@凱文。我會問你同樣的問題,我問下面的achampion。 – user2331291 2015-04-03 10:32:00
一點都不酷,在SO上給出鑰匙和答案。 – 2015-09-07 08:10:46