【问题标题】:program input redirected via python subprocess通过 python 子进程重定向的程序输入
【发布时间】:2013-10-08 12:35:57
【问题描述】:

我以为我可以在 google 上找到这个,但找不到。我正在尝试使用溢出来利用用 C 编写的二进制文件。在 gdb 中,我已经让溢出降落在正确的字节上以重定向函数返回,但似乎无法在那里获得正确的值以降落在我的代码上。

当您运行程序时,它会要求标准输入提供两个输入,我需要能够为其中一些输入提供十六进制值。像\x## 这样的转义在提示符下不起作用。我想我可以用 python 子进程库做点什么。

到目前为止,导入子流程并在提示符处使用 p=subprocess.Popen("bin", stdin=subprocess.PIPE)p.stdin.write("sometext" + "\xhh\xhh\xhh\xhh") 并没有像我希望的那样工作。

有什么建议吗?

谢谢!

【问题讨论】:

  • print 写入sys.stdout 并且是一个语句,你不能在表达式中使用它。直接写字符串不用打印即可。
  • 是的,更明确地将您的代码更改为:p.stdin.write("sometext" + "\xhh\xhh\xhh\xhh")
  • 啊。我写错了那个代码。我正在写p.stdin.write("text" + "\xhh")。那么,它应该这样工作吗?我明天再调查。感谢您的帮助。
  • 为什么不只是"sometext\xhh\xhh\xhh\xhh"
  • 我要拆分成两个字符串,因为我使用的是像 'a'*1000 + '\x76\xff\xff\xbf' 这样的乘数

标签: python buffer-overflow exploit


【解决方案1】:

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

更新:

看起来你也可以:

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

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2022-01-14
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多