CyberDen
26.07.2024, 21:41
Всем доброго времени суток! Набираем обороты... Сегодня мы будем 'пывнить" stack3.exe (ссылочка на файл, как обычно, на Github).
Часть 3 (https://forum.antichat.xyz/threads/1643731/)
Часть 2 (https://forum.antichat.xyz/threads/1643714/)
Часть 1 (https://forum.antichat.xyz/threads/1643686/)
Stack3
Закидываем в Ghidra:
https://forum.antichat.xyz/attachments/29113141/1.png
Анализируем...
https://forum.antichat.xyz/attachments/29113141/2.png
Получаем декомпилированный код. Нас встречает все тот же массив из 64-х байт. Небезопасная функция gets(). Функция gets() считывает строку символов из стандартного потока ввода (stdin) и помещает ее в массив local_54. Также в коде есть указатель (local_14) на функцию и проверка (if), не является ли local_14 - NULL. Т.е. если мы "перезапишем" local_14, то попадем в ветку THEN и получим сообщение "calling function pointer, jumping to...", а также перейдем по адресу, которым мы перезапишем local_14:
https://forum.antichat.xyz/attachments/29113141/3.png
Вроде бы все понятно, но есть ощущение, что чего-то нехватает?
Обращаем внимание на функцию "win":
https://forum.antichat.xyz/attachments/29113141/4.png
Функция "win" просто выводит сообщение "code flow successfully changed":
https://forum.antichat.xyz/attachments/29113141/5.png
Фактически, нам нужно использовать BOF, чтобы изменить значение указателя функции, сделав так, чтобы он указывал на адрес функции "win" (это и будет успешным прохождением таска "Stack3"). Переходим к "динамике". Делаем поиск по strings:
https://forum.antichat.xyz/attachments/29113141/6.png
Кликаем по строчке с "code flow successfully changed" и смотрим адрес инструкции "push ebp" (З.Ы. Это начало функции "win". Кому интересно, почему так, читайте про пролог/эпилог процедуры):
https://forum.antichat.xyz/attachments/29113141/7.png
Супер! Адрес есть. Давайте посмотрим на наш "пейлоад", который мы подадим на стандартный поток ввода (stdin):
https://forum.antichat.xyz/attachments/29113141/8.png
Эксплуатируем. Указатель изменён и мы попали в функцию "win" (о чем говорит сообщение "code flow successfully changed"):
https://forum.antichat.xyz/attachments/29113141/9.png
Всем спасибо за внимание!
Часть 3 (https://forum.antichat.xyz/threads/1643731/)
Часть 2 (https://forum.antichat.xyz/threads/1643714/)
Часть 1 (https://forum.antichat.xyz/threads/1643686/)
Stack3
Закидываем в Ghidra:
https://forum.antichat.xyz/attachments/29113141/1.png
Анализируем...
https://forum.antichat.xyz/attachments/29113141/2.png
Получаем декомпилированный код. Нас встречает все тот же массив из 64-х байт. Небезопасная функция gets(). Функция gets() считывает строку символов из стандартного потока ввода (stdin) и помещает ее в массив local_54. Также в коде есть указатель (local_14) на функцию и проверка (if), не является ли local_14 - NULL. Т.е. если мы "перезапишем" local_14, то попадем в ветку THEN и получим сообщение "calling function pointer, jumping to...", а также перейдем по адресу, которым мы перезапишем local_14:
https://forum.antichat.xyz/attachments/29113141/3.png
Вроде бы все понятно, но есть ощущение, что чего-то нехватает?
Обращаем внимание на функцию "win":
https://forum.antichat.xyz/attachments/29113141/4.png
Функция "win" просто выводит сообщение "code flow successfully changed":
https://forum.antichat.xyz/attachments/29113141/5.png
Фактически, нам нужно использовать BOF, чтобы изменить значение указателя функции, сделав так, чтобы он указывал на адрес функции "win" (это и будет успешным прохождением таска "Stack3"). Переходим к "динамике". Делаем поиск по strings:
https://forum.antichat.xyz/attachments/29113141/6.png
Кликаем по строчке с "code flow successfully changed" и смотрим адрес инструкции "push ebp" (З.Ы. Это начало функции "win". Кому интересно, почему так, читайте про пролог/эпилог процедуры):
https://forum.antichat.xyz/attachments/29113141/7.png
Супер! Адрес есть. Давайте посмотрим на наш "пейлоад", который мы подадим на стандартный поток ввода (stdin):
https://forum.antichat.xyz/attachments/29113141/8.png
Эксплуатируем. Указатель изменён и мы попали в функцию "win" (о чем говорит сообщение "code flow successfully changed"):
https://forum.antichat.xyz/attachments/29113141/9.png
Всем спасибо за внимание!