Python:通过子进程捕获崩溃程序的标准输出

时间:2019-02-07 13:10:09

标签: python c windows stdout buffer-overflow

我有一个简单的C程序,要求输入并回显它,因此本质上是一个gets然后是一个printf。我想通过Python subprocess调用此程序并捕获输出-即使C程序崩溃(试图从Python溢出缓冲区)。

当我尊重缓冲区大小时,一切都正常,但是一旦溢出,我将无法捕获标准输出。在shell中运行该程序可以正常运行,即在崩溃前显示输出。

C程序(echo.exe):

#include <stdio.h>

void echo()
{
    char buffer[20];

    printf("Enter some text:\n");
    gets(buffer);
    printf("You entered: %s\n", buffer);
    printf("Some other output...\n");
}

int main()
{
    echo();
    return 0;
}

通过gcc echo.c -o echo.exe -m32进行编译。

python程序(exploit.py):

from subprocess import Popen, PIPE

payload = 32*"."
payload += "AAAA"

command = "echo.exe"

p = Popen([command], shell=True, stdout=PIPE, stdin=PIPE, stderr=PIPE)
stdout, stderr = p.communicate(input=payload)

print stdout, stderr

当我运行python exploit.py时,程序崩溃并且不打印任何内容。如果为它提供较小的有效负载以不使缓冲区溢出,则它将捕获/打印标准输出,并且不会崩溃。

我想要的东西:调用我的python脚本,崩溃echo.exe并打印出标准输出。

如果我将输入内容通过管道传递到Powershell中的echo.exe,我将得到想要的东西。这将打印输出,然后崩溃:

python -c "print '.'*32 + 'AAAA'" | .\echo.exe

输出:

Enter some text:
You entered: ................................AAAA
Some other output...

问题:如何在Python脚本中调用echo.exe ,将其崩溃并获取输出?为什么在上面的脚本中它不起作用(我可以假定崩溃的C程序未清除缓冲区)?

这是在Win 8.1、32位和Python 2.7上提供的。纯粹是出于好奇,因此,如果我需要修改C程序和/或python脚本,我对此表示满意(不过是python脚本)。我只想了解原因,也许想出解决方法。

谢谢!

0 个答案:

没有答案
相关问题