Как я могу передать строку, состоящую из символа ASCII, повторенного 'n' раз, в качестве аргумента командной строки для простой программы на c? - PullRequest
0 голосов
/ 05 сентября 2018

Я изучаю эксплойты переполнения буфера. Как обычно для начинающих, я работаю от очень простой программы на языке C, которая использует небезопасную, не проверяющую функцию, такую ​​как gets (), для заполнения объявленного буфера фиксированной длины строковым аргументом командной строки, хранящимся в argv [ ]. Для контекста, программа выглядит следующим образом:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    char buffer[512];
    if (argc < 2)
    {
        printf("Please feed the buffer :D");
        exit(0);
    }
    strcpy(buffer, argv[1]);
    printf("delicious input:  %s, buffer);
    return 0;
}

Как видите, ввод аргумента, который переполняет этот буфер, вручную создает неудобства, поэтому я хочу автоматизировать процесс, используя встроенные функции командной строки. В частности, я хочу создать строку, состоящую из символа ASCII, повторенного 'n' раз, и передать ее в качестве аргумента программе. К сожалению, я довольно неграмотен с командной строкой Linux (я работаю над этим). Я читал об этом решении:

user@virtualenv:~$ printf 'somestring%.0s' {1..520}

Однако результирующая строка не сохраняется в argv [1] (printf is). В Python это будет так просто:

'somestring'*2

Возможно ли, используя встроенную функциональность терминала Linux, выдавать команды, создающие строку? Как это можно сделать, чтобы эти команды не передавались в качестве аргументов командной строки - в argv [] сохраняется только полученный строковый продукт?

1 Ответ

0 голосов
/ 05 сентября 2018

Nevermind. Я читал о функции обратной галочки в Linux "` ". Команды, появляющиеся между обратными галочками, будут оцениваться до окончательного единственного типа данных, который может передаваться в качестве аргумента программе.

В моем случае я хочу передать результат следующей команды bash вышеупомянутой программе:

printf 'A%.0s' {1..520}

Это будет выглядеть так:

user@virtualenv$ ./vuln.c `printf 'A%.0s' {1..520}`

В результате строка 520 A, повторяющаяся последовательно, будет передана в argv [1], что приведет к переполнению буфера из 512 символов.

...