2013-10-02 34 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') 
相关问题