2016-11-07 39 views
1

我目前使用python腳本來運行AC可執行類似殺死一個C程序由python腳本

os.system("./a.out \"%s\" " %p) 

有很多可用的二進制指令,我(I1,I2,I3執行.... I10準確地說)。我使用python中的itertools生成這些指令(長度爲1,2,3 ... 10)的排列組合。字符串有效載荷p(在上面的片斷中)就是這樣一種排列。我測量對各排列的時間如下:(這可能不是來測量時間最好的方法,但是這是另外一個問題一個問題。)

​​


現在對於一些排列我得到分割故障並且python腳本繼續到另一個排列。但對於一些置換,我沒有得到任何響應(如卡在一個無限循環),如:

58 60 452 547 583 649 756 777 932 965 
key Not found 
(Nothing happens after this. This is due to bad combination 
of instructions or bad payload. 
I have to press ctrl C to proceed to next permutation) 
^C---------------[9 8 ]------------ 
The gadget seq is [mov,ret xor eax,eax,ret ] and time taken is 
0.000254 (this is the bad permutation of instructions) 

(Next permutation..) 

我按後按Ctrl + C,Python腳本去下一個排列。更清楚地說明

perm = itertools.permutations(gadget_list,2) #perm is list of all permutations of 2 instructions 
for string in list(perm): 
#generate the payload p from string which is one of the permutation 
#feed it to c program and measure time 
    start = time.clock() 
    os.system("./a.out \"%s\" " %p) 
    print time.clock() - start 

現在,對於更長的置換長度,對每個錯誤的有效載荷按Ctrl C變得單調乏味。有沒有什麼辦法可以自動化殺死/停止C程序(我按Ctrl C),由於有效負載卡住了,並繼續進行下一個排列?

回答

1

爲了獲得對子進程的更多控制,您需要使用subprocess模塊。

import time 
from subprocess import Popen 
from shlex import split 

proc = Popen(split("./a.out '%s'" % p)) 

rtime, timeout = 0, 10 
while rtime < timeout: 
    rc = proc.poll() 
    if rc is not None: 
     break # process finished. 
    time.sleep(1) 
    rtime += 1 
else: 
    proc.kill() 
+0

那麼,我要用上面的代碼替換我的os.system()行?我應該在哪裏寫我的start = time.clock並打印time.clock() - 開始? – shane

+0

'開始'''在Popen行之後,'''end'''在底部 –

0

嘗試,而像這樣:

os.system("timeout 5 ./a.out \"%s\" " %p) 

5秒實例後殺死進程。

只需打開shell並嘗試:

timeout 2 yes 

看到的。

+0

使用此解決方案,我不需要鍵入Ctrl C.但是有什麼方法可以知道發生了超時,所以在那個特殊的排列我可以打印這個有效載荷是壞的消息? – shane

+0

@shane是的,返回值應該沒問題;比較'{timeout 2 sleep 1; } && echo ok' with'{timeout 2 sleep 3; } && echo ok'並檢查超時是否到期,'timeout'命令的返回值是失敗的。因此,嘗試像'result = os.system(「timeout ...」)''。請參閱https://docs.python.org/2/library/os.html#os.system「在Unix上,返回值是進程的退出狀態」 –

+0

我試過k = os.system(「timeout 2 sleep 1「)並打印k。 k的值是0.然後我試着k = os.system(「timeout 2 sleep 3」)。 k這次的值是31744.所以我可以用這個差異來找到超時發生的時間?但根據這個鏈接:http://unix.stackexchange.com/questions/205076/timeout-function-return-value,我認爲在第二種情況下k的值將是124而不是31744. – shane