2013-10-02 61 views
0

以爲我能在google上找到這個,但不能。我正在嘗試利用溢出來利用C編寫的二進制文件。在gdb中,我已經在正確的字節溢出着陸來重定向函數返回,但似乎無法得到正確的值到我的代碼。通過python子進程重定向的程序輸入

當你運行程序時,它要求輸入stdin的兩個輸入,我需要能夠爲其中一些提供十六進制值。在提示符下如\x##轉義不起作用。我想我可以用python子進程庫做些什麼。

到目前爲止,導入子流程並在提示符下使用p=subprocess.Popen("bin", stdin=subprocess.PIPE)p.stdin.write("sometext" + "\xhh\xhh\xhh\xhh")並不像我所希望的那樣工作。

有什麼建議嗎?

謝謝!

+1

'print'寫入'sys.stdout',是*聲明*,你不能在表達式中使用它。只需直接寫*字符串*而不打印。 –

+0

是的,要更明確地改變你的代碼:'p.stdin.write(「sometext」+「\ xhh \ xhh \ xhh \ xhh」)' –

+0

啊。我寫錯了代碼。我在寫'p.stdin.write(「text」+「\ xhh」)''。那麼,它應該像那樣工作?明天我會重新調查。謝謝您的幫助。 –

回答

0

parent.py

import subprocess 
import sys 

p = subprocess.Popen([sys.executable, 'sub.py'], stdin=subprocess.PIPE) 
p.stdin.write('foo') # not even a newline seems to be required for this to work, oddly 
# p.stdin.flush() # optional; seems like not required 

_, _ = p.communicate() # this is required--otherwise it just seems to block 

sub.py

print raw_input() 

然後運行parent.py輸出foo如預期。

如果你關心的communicate()的返回值,只是out, err替換_, _(或如out, _,如果你只關心STDOUT);我只是想用_來標記未使用的變量,儘管可以簡單地完全忽略communicate()的返回值...但是看起來像communicate什麼也沒有返回。

參見:http://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate

UPDATE:

看起來你也可以直接:

p = subprocess.Popen([sys.executable, 'sub.py'], stdin=subprocess.PIPE) 
_, _ = p.communicate(input='foo') 
相關問題