Python: захват стандартного сбоя программы через подпроцесс - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть простая программа на C, которая запрашивает ввод и возвращает его обратно, поэтому, по сути, это gets, а затем printf.Я хочу вызвать эту программу через Python subprocess и перехватить вывод - даже когда программа на С вылетает (пытается переполнить буфер из Python).

Все работает, когда я уважаю размер буфера, но как толькопоскольку я переполнен, я больше не могу захватывать стандартный вывод.Запуск программы в оболочке работает нормально, т.е. показывает вывод перед сбоем.

Программа 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, crash echo.exe Инапечатать вывод stdout.

Я мог бы получить то, что хотел, если бы просто направил ввод в echo.exe в Powershell.Это выведет на печать вывод, затем сбой:

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

Вывод:

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

Вопрос: Как я могу вызвать echo.exe в пределах скрипта Python, сбой его и получить вывод?И почему это не работает в приведенном выше сценарии (я мог бы предположить, что буфер не очищается сбой программы C)?

Это на Win 8.1, 32-разрядной и Python 2.7.Это просто упражнение на любопытство, поэтому, если мне нужно изменить программу на C и / или скрипт на python, я в порядке (хотя, скорее, скрипт на python).Я просто хочу понять, почему и, возможно, получить идеи о возможных способах сделать это.

Спасибо!

...