2015-04-02 112 views
-1

我目前正在嘗試完成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,但我不確定如何去處理那。

+0

如果該過程要求您通過stdin輸入引腳,也許您需要使用'subprocess.Popen.communicate'。 – Kevin 2015-04-02 11:59:28

+0

謝謝@凱文。我會問你同樣的問題,我問下面的achampion。 – user2331291 2015-04-03 10:32:00

+0

一點都不酷,在SO上給出鑰匙和答案。 – 2015-09-07 08:10:46

回答

3

netcat需要在會話期間打開一次,然後需要執行多個讀寫操作。 如果您想要讀取和寫入子流程的數據,您需要創建一個PIPE,然後使用Popen接口,然後您可以使用communicate()

鑑於這是多麼微不足道,爲什麼不直接在Python中打開套接字呢?

import socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.bind(('localhost', 30002)) 
data = sock.recv(64) 
sock.send(pin) 
+0

謝謝你的回答,achampion。一旦我在'Popen'中創建了PIPE,我將如何去使用'communic()'?它必須從子進程的stdout中讀取並寫入其標準輸入(每次修改引腳)。我一直在努力閱讀這些主題,但我不太明白。 – user2331291 2015-04-03 10:31:00

+0

'pipe = subprocess.Popen(('nc','localhost','30002'),stdout = subprocess.PIPE,stdin = subprocess.PIPE);輸出= pipe.communicate(輸入)' – AChampion 2015-04-03 13:55:19

+0

@ user2331291:在這裏使用多個套接字比爲每個引腳產生子進程要快得多,特別是如果守護進程在錯誤嘗試後不斷開連接。 – jfs 2015-04-03 20:23:10