根据程序的标准输出将二进制数据传递到程序的标准输入

时间:2019-03-11 12:25:57

标签: c windows security stdout stdin

我有一个程序A,该程序打印一些文本数据,然后从stdin中读取gets()。 我想创建一个程序/脚本,该程序将读取A的标准输出(文本数据),并基于输出传递数据(二进制)到其标准输入。

该程序是一个简单的利用演示(格式字符串易受转储堆栈的影响,然后基于转储值的技术利用有效负载,然后通过获取传递,以触发缓冲区溢出并执行精心制作的shellcode)。

int main(int argc, char** argv)
{
    char buffer[20];
    BOOL(__stdcall *getName)(LPSTR lpBuffer, LPDWORD nSize) = GetComputerNameA;

    printf("The argument is: ");
    printf(argv[1]);
    printf("\r\n");

    printf("Enter a message: ");
    gets(buffer);
    printf("Your message is: %s", buffer);

    TCHAR name[20];
    DWORD len = 19;
    getName(name, &len);
    printf("Your computer is called %s", name);
    printf("\r\n");
}

我尝试通过target.stdout.readline()和target.stdin.write()在python中执行此操作,但是readline挂起并且永不返回。 我还通过OutputDataReceived事件在C#中进行了尝试,但只有在没有传递任何输入的情况下,我才能够读取输出。重定向标准输入后,我将无法读取任何内容。也会发生挂起。

我的问题是我该如何实现?

编辑: 执行程序的python代码示例

from subprocess import Popen, PIPE, STDOUT
x = Popen(['test.exe', '"%08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x"', 'start'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

out = x.stdout.readline()
print(out)
input("{press enter}")

data = bytearray(...payload...)
payload = buffer(data)
x.stdin.write(payload)
input("{press enter}")

1 个答案:

答案 0 :(得分:1)

在C中printf使用缓冲的输出。如果将stdout发送到终端,则在每个"\n"之后刷新该缓冲区,但是在这种情况下,输出是发送到管道的,因此将其缓冲到几个k字节的数据。缓冲区永远不会刷新,也不会写入管道。

为避免python永远等待缓冲的数据,可以在每个fflush(stdout)disable buffering altogether之后添加printf