Как я могу предоставить ввод stdin из командной строки? - PullRequest
3 голосов
/ 27 июля 2011

Я пытаюсь выполнить атаку переполнения буфера на программу для назначения класса.И программа атаки, и уязвимая программа написаны мной.

Уязвимый код использует scanf для чтения данных из стандартного ввода.

./vulnerable < malicious_payload_file.txt работает нормально.more malicious_payload | ./vulnerable и echo JUNK_JUNK_JUNK_JUNK | ./vulnerable также работают, как и ожидалось.

Однако я хотел бы использовать программу атаки, чтобы постепенно увеличивать полезную нагрузку до тех пор, пока не произойдет сбой программы.Итак, мне нужно динамически генерировать большие полезные нагрузки мусора.Я использую system ("./vulnerable"); для многократного вызова и проверки на ненормальный выход.

Как мне указать такую ​​полезную нагрузку?

Есть ли способ запустить ./vulnerable < malicious_payload_binary или каким-либо другим образом такойчто мне не нужно помещать вредоносную полезную нагрузку в файл, но я могу указать ее в командной строке?

Ответы [ 4 ]

8 голосов
/ 27 июля 2011

Как насчет этого?

echo "your payload goes here" | ./vulnerable

Вы можете заменить команду echo любой командой, которая генерирует ввод для ./vulnerable, который вы хотите.Одним из таких примеров является постоянный поток мусора в качестве входных данных, вы можете сделать это:

cat /dev/urandom | ./vulnerable
2 голосов
/ 27 июля 2011

Вместо того, чтобы пытаться использовать командную строку, вы можете попробовать использовать popen вместо system:

FILE *fp = popen("./vulnerable", "w");
// write stuff to fp -- it goes to vulnerable's stdin
int exitcode = pclose(fp);

Код выхода, который вы получаете от pclose, такой же, как тот, который вы получили бы от system, если бы вы использовали другой процесс для создания данных и передали их через оболочку в ./vulnerable

0 голосов
/ 27 июля 2011

РЕДАКТИРОВАТЬ: Я думаю, я наконец понял ваш вопрос (может быть), вы хотите прочитать аргументы командной строки? Что-то вроде

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("the name of this program is %s\n", argv[0]);
    printf("%d command line arguments were provided\n", argc);
    printf("the input file is %s\n", argv[1]);
    // could do something like: fopen(argv[1]) here
    return 0;
}

Если вы скомпилируете его в двоичный файл с именем stdintest и запустите его так:

./stdintest somefile.txt

будет выводиться:

the name of this program is ./stdintest
2 command line arguments were provided
the input file is somefile.txt

OLD:

Как упоминал дельфи, просто напишите в стандартный вывод в malicious_payload_binary, прочитайте из стандартного ввода в vulnerable и соедините их с помощью трубы: ./malicious_payload_binary | ./vulnerable

0 голосов
/ 27 июля 2011

Попробуйте использовать конвейер вместо перенаправления:

./malicious_payload_binary | ./vulnerable
...