У меня есть простая программа на 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).Я просто хочу понять, почему и, возможно, получить идеи о возможных способах сделать это.
Спасибо!