Автор: Михаил
Источник: Купи слона Writeup
Ссылка на таск Codeby
https://codeby.games/categories/pwn/56a160a2-9ca5-43d9-9449-04d1117c1017
Описание задания
Все говорят “хочу флаг”, а ты купи слона
Решение
“Купи слона”
При запуске видим, что сначала у нас запрашивается имя, а затем выводится сообщение “Buy an elephant”, после чего каждое наше сообщение копируется в фразу для ответа.
Открываем файл в IDA, смотрим декомпилированный код:
Для получения флага нам нужно, чтобы выполнилась функция sub_4012B6
. Но чтобы она запустилась необходимо сделать так, чтобы переменная byte_4051A0
была не равна NULL и прервался бесконечный цикл while (1).
Ну с циклом понятно, достаточно ввести q
, чтобы сработал break
. Для изменения переменной byte_4051A0
посмотрим, где она хранится в памяти, нажав по ней дважды ЛКМ.
Видим ее адрес - 4051A0
. Посмотрим, что находится рядом с ней. Пролистав выше замечаем массив dest
по адресу 405120
.
В декомпилированном коде видим, что в массив dest
копируется введенная нами строка s1
длиной до 256
символов. Значит, рассчитав смещение dest
от byte_4051A0
в памяти, мы сможем подать такую строку, которая перезапишет эту переменную:
4051A0 - 405120 = 0x80 = 128
Но перед копированием в dest
нашей строки в массив записывается строка Everyone says "
, а после - строка ", but you need to buy an elephant
Вычтем из 128 длины этих строк: 128 - 15 - 34 = 79.
Таким образом, при вводе 80 символов, последний символ перезапишет byte_4051A0
.
Tags: