Привет.
Продолжаем.
Смотрим в IDA main.
Видим, что я уже переименовал переменную, которая принимает не безопасный ввод от пользователя. Так же я привел условия if-ов в читабельный вид. В данных условиях нас должна интересовать функция talk, что бы поговорить с осьминогом.
Тут тоже я уже переименовал для удобства. Что тут видно?
Для условий уязвимый ввод.
В условии 2 у нас увеличивается "репа" (репутация), это уже кое что.
В условии 4 если наша "репа" равна 10000, то приложуха печатает флаг. Если пользоваться вариантом 2 для получении такой репы - можно поседеть.
А вот условие 3 в первом приближении говорит, что все ок - ввод тут контролируемый (на скрине не видно, но там массив 8, два других для \n и \0, если я правильно помню), проэксплуатировать не выйдет. Казалось бы нам надо долго и усердно мучаться вместе с осьминогом, что бы получить флаг, но нет.
Если присмотреться внимательно к массиву records
то увидим, что размер его 10, цикл который выводит из него данные тоже рассчитан на 10 элементов. Но то что вводит пользователь через безопасный fgets очень не безопасно ложиться за границы массива.
В самом начале функции у нас records_index = 0.
Мы 10 раз вводим значения в массив records, увеличивая records_index на 1 и не обнуляем его после достижения предела массива. Наш любимый C позволяет нам всякие безрассудства, которые приводят к безудержному веселью потом, и в данном случае позволяет нам положить за пределы массива любое число (т.к. там atoi). Что же у нас находится сразу за массивом? Пральна, "репа". Так как pwn, то используем pwn.
В двух словах по сплоиту. После перехода к разговору с осьминогом в цикле 10 раз передаем в массив число, я для удобства передавал счетчик цикла. После цикла поставил снова костыль для отладки в IDA. И далее передаю в 11 элемент массива, а на самом деле в "репу" число 10000, что бы дальше запросить флаг.
PWNED
Продолжаем.
Смотрим в IDA main.
Видим, что я уже переименовал переменную, которая принимает не безопасный ввод от пользователя. Так же я привел условия if-ов в читабельный вид. В данных условиях нас должна интересовать функция talk, что бы поговорить с осьминогом.
Тут тоже я уже переименовал для удобства. Что тут видно?
Для условий уязвимый ввод.
В условии 2 у нас увеличивается "репа" (репутация), это уже кое что.
В условии 4 если наша "репа" равна 10000, то приложуха печатает флаг. Если пользоваться вариантом 2 для получении такой репы - можно поседеть.
А вот условие 3 в первом приближении говорит, что все ок - ввод тут контролируемый (на скрине не видно, но там массив 8, два других для \n и \0, если я правильно помню), проэксплуатировать не выйдет. Казалось бы нам надо долго и усердно мучаться вместе с осьминогом, что бы получить флаг, но нет.
Если присмотреться внимательно к массиву records
то увидим, что размер его 10, цикл который выводит из него данные тоже рассчитан на 10 элементов. Но то что вводит пользователь через безопасный fgets очень не безопасно ложиться за границы массива.
C:
records[records_index] = atoi(buffer_4_atoi);
puts("The number is recorded!");
++records_index;
В самом начале функции у нас records_index = 0.
Мы 10 раз вводим значения в массив records, увеличивая records_index на 1 и не обнуляем его после достижения предела массива. Наш любимый C позволяет нам всякие безрассудства
В двух словах по сплоиту. После перехода к разговору с осьминогом в цикле 10 раз передаем в массив число, я для удобства передавал счетчик цикла. После цикла поставил снова костыль для отладки в IDA. И далее передаю в 11 элемент массива, а на самом деле в "репу" число 10000, что бы дальше запросить флаг.
PWNED