ОБСУЖДЕНИЕ CTF 

Реверсинжиниринг PWN-тасков или эксплуатируем бинарные уязвимости (Часть 4 / Stack3)

0 ответов 4,4 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Всем доброго времени суток! Набираем обороты... Сегодня мы будем 'пывнить" stack3.exe (ссылочка на файл, как обычно, на Github).

Часть 3
Часть 2
Часть 1

Stack3​

Закидываем в Ghidra:

1.jpg


Анализируем...

2.jpg


Получаем декомпилированный код. Нас встречает все тот же массив из 64-х байт. Небезопасная функция gets(). Функция gets() считывает строку символов из стандартного потока ввода (stdin) и помещает ее в массив local_54. Также в коде есть указатель (local_14) на функцию и проверка (if), не является ли local_14 - NULL. Т.е. если мы "перезапишем" local_14, то попадем в ветку THEN и получим сообщение "calling function pointer, jumping to...", а также перейдем по адресу, которым мы перезапишем local_14:

3.jpg


Вроде бы все понятно, но есть ощущение, что чего-то нехватает? :)

Обращаем внимание на функцию "win":

4.jpg


Функция "win" просто выводит сообщение "code flow successfully changed":

5.jpg


Фактически, нам нужно использовать BOF, чтобы изменить значение указателя функции, сделав так, чтобы он указывал на адрес функции "win" (это и будет успешным прохождением таска "Stack3"). Переходим к "динамике". Делаем поиск по strings:

6.jpg


Кликаем по строчке с "code flow successfully changed" и смотрим адрес инструкции "push ebp" (З.Ы. Это начало функции "win". Кому интересно, почему так, читайте про пролог/эпилог процедуры):

7.jpg


Супер! Адрес есть. Давайте посмотрим на наш "пейлоад", который мы подадим на стандартный поток ввода (stdin):

8.jpg


Эксплуатируем. Указатель изменён и мы попали в функцию "win" (о чем говорит сообщение "code flow successfully changed"):

9.jpg


Всем спасибо за внимание!
 
  • Нравится
Реакции: down, Мажужв, Сергей Сталь и ещё 1 человек
4