我有一个简单的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脚本)。我只想了解原因,也许想出解决方法。
谢谢!