Выполнение скомпилированного файла C в терминале Linux: понимание синтаксиса (приложение переполнения буфера)

#c #terminal #buffer-overflow

Вопрос:

Я пытаюсь изучить функциональность переполнения буфера, и я нашел:

 ouah@weed:~$ ./vuln1 `perl -e 'print "A"x300'`
 

где vuln1 — это скомпилированный файл C vuln1.c :

 #include <stdio.h>

main (int argc, char *argv[])
{ 
   char buffer[256];
   if (argc > 1)
      strcpy(buffer,argv[1]);
}
 

Итак, я хотел бы знать значение этих странных `perl -e ‘print » A «x300»: что здесь означают «perl -e» и «print» (я знаю, что должны быть аргументы main()), и то же самое для «A»x300, который выглядит как умножение, но меньше «*» (потому что целью этой команды является переполнение буфера) и в то же время шестнадцатеричная запись…

Комментарии:

1. Я не эксперт по perl, но я уверен, что он просто генерирует 300 A символов. Более чем достаточно для переполнения буфера.

2. Итак, ваш вопрос о pearl, а не о C?

3. Что вы получаете при запуске perl -e 'print "A" x 300' ? Вы должны увидеть 300 прописных букв A. Итак, оболочка запускается perl и передает программе строку из 300 букв как argv[1] ( argv[0] это имя исполняемого файла, ./vuln1 ).

Ответ №1:

Perl — это язык сценариев. perl с -e помощью переключателя следующий аргумент вычисляется непосредственно как код (вместо запуска файла сценария).

print это встроенная функция Perl, которая выводит свои аргументы.

x является оператором повторения в Perl. "A" x 3 результаты "AAA" .

Последняя часть головоломки заключается в том, что backticks ( ` ` ) в bash выполнит их содержимое как команду и выдаст все, что эта команда напечатает в стандартный вывод.

Итак, это быстрый и простой способ сгенерировать 300 A в качестве аргумента ./vuln1 , который будет переполнять 256-байтовый буфер при чтении аргумента.

Замените ./vuln1 на обычный echo , чтобы увидеть, какой аргумент в конечном итоге передается.

Комментарии:

1. Okkk! Теперь все ясно, извините, что перенес тему на канал C, я не понял, что perl был языком.

2. Это смесь языка Perl и языка оболочки.