Передача двоичных данных в стандартный поток программы на основе его стандартного вывода - PullRequest
0 голосов
/ 11 марта 2019

У меня есть программа A, которая печатает некоторые текстовые данные, а затем читает get () из stdin.Я хочу создать программу / сценарий, который будет читать стандартный вывод A (текстовые данные) и на основе выходных данных прохода (двоичный) в свой стандартный ввод.

Программа представляет собой простую демонстрационную версию эксплуатации (уязвимость строки формата)выгрузить стек, а затем на основе выгруженных значений обработать полезную нагрузку craft exploit, которая затем передается через get для запуска переполнения буфера и выполнения созданного шелл-кода).

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");
}

Я пытался сделать это в python через target.stdout.readline () и target.stdin.write (), но readline зависает и никогда не возвращается.Я также пытался в C # с помощью события OutputDataReceived, но я мог читать только вывод, если я не передавал ввод.Как только я перенаправил стандартный ввод, я ничего не смог прочитать.Также происходили зависания.

Мой вопрос: как мне этого добиться?

РЕДАКТИРОВАТЬ: Пример кода 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 Ответ

1 голос
/ 11 марта 2019

В C printf используется буферный вывод.Когда stdout находится на терминале, то буфер сбрасывается после каждого "\n", но в этом случае выходные данные передаются в канал, поэтому он буферизуется до нескольких килобайтовых данных.Буфер никогда не сбрасывается и не записывается в конвейер.

Чтобы избежать Python, ожидающего буферизованные данные навсегда, вы можете добавить fflush(stdout) после каждого printf или , вообще отключить буферизацию .

...