Изучение PWN #1

Изучение PWN #1

Михаил

Введение

Начал изучать PWN с помощью задач с https://exploit.education/phoenix/. Сегодня рассмотрим вводную задачку по PWN - Stack Zero. Удобнее всего скачать виртуалку (формат qcow2), поскольку там уже скомпилированы с нужными флагами все бинари. Качаем, запускаем через qemu или VirtualBox (здесь и в дальнейшем я использую qemu и рассматриваю файлы под архитектуру amd64), подключаемся по ssh и начинаем.

Stack Zero

int main(int argc, char **argv) {
 struct {
  char buffer[64];
  volatile int changeme;
 } locals;

 printf("%s\n", BANNER);
 locals.changeme = 0;
 gets(locals.buffer);
 if (locals.changeme != 0) {
  puts("Well done, the 'changeme' variable has been changed!");
 } else {
  puts(
    "Uh oh, 'changeme' has not yet been changed. Would you like to try again?");
 }
 exit(0);
}

Для успешного выполнения этого задания необходимо перезаписать значение переменной locals.changeme так, чтобы оно не было равно нулю.

В исходном коде программы мы видим, что у нас происходит объявление сначала массива buffer,а затем уже переменной changeme , для задания значения переменной buffer используется пользовательский ввод, полученный при помощи функции gets.

Функция gets считывает строку из стандартного потока ввода (stdin) и помещает ее в массив указанный аргументом. Чтение строки производится пока не будет встречен символ «переход на новую строку», или не будет достигнут конец файла. Таким образом, данная функция позволяет записать в переменную buffer больший объем данных, чем выделен для нее на стеке, а, так как данная переменная объявлена раньше целевой переменной changeme, после заполнения выделенной buffer памяти, данные будут записывать в переменную changeme.

Чтобы это реализовать, нам достаточно ввести сначала любые 64 байта, а затем любой не нулевой байт:

python -c "print 'A' * 65" | ./stack-zero

И получаем сообщение об успешном выполнении задания:

Следующая статья - Изучение PWN #2.

Report Page