#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 и языка оболочки.