ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.xyz/forumdisplay.php?f=112)
-   -   Реверсинжиниринг PWN-тасков или эксплуатируем бинарные уязвимости (Часть 3 / Stack2) (https://forum.antichat.xyz/showthread.php?t=1643731)

CyberDen 24.07.2024 12:15

Друзья, всех приветствую! Это третья часть нашего "пывна" Сегодня будем изучать работу Stack2.exe (скачать можно ТУТ).

Часть 4
Часть 2
Часть 1
Stack2
Начнем мы, как обычно, со статического анализа. Запускаем GHIDRA:

https://forum.antichat.xyz/attachments/29113105/1.png

Закидываем "бинарь" в проект и нажимаем на Code Browser:

https://forum.antichat.xyz/attachments/29113105/2.png

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

https://forum.antichat.xyz/attachments/29113105/3.png

Получаем декомпилированный код. Обращаем внимание на переменную "local_14". Ей присваивается значение переменной окружения "GREENIE". Далее идет проверка. Если переменная "local_14" эквивалентна 0x0 (NULL), то программа выводит сообщение "Пожалуйста установите переменную окружения GREENIE":

https://forum.antichat.xyz/attachments/29113105/4.png

Смотрим дальше... Переменной "local_18" присваивается "0" (эту переменную и будем перезаписывать). Небезызвестно-небезопасная функция strcpy() копирует значение "local_14" в "local_58" (массив из 64-х байт). З.Ы. Прошу прощения, объявление массива не попало на скриншот. Далее идет проверка. Если переменная "local_14" эквивалентна "0xd0a0d0a", то PWN! (получаем сообщение, что мы молодцы, корректно модифицировали переменную). Если нет, то "Try again":

https://forum.antichat.xyz/attachments/29113105/5.png

Супер! Разобрались как работает программка. Сделаем небольшой тест. Идем в переменные окружения и добавляем переменную "GREENIE" с значением 64 символа "A" (т.к. массив - 64 байта) и "BCDE" (этими символами попробуем перезаписать переменную "local_18"):

https://forum.antichat.xyz/attachments/29113105/6.png

https://forum.antichat.xyz/attachments/29113105/7.png

Открываем x64dbg, ставим "бряк" на инструкции CMP (мы это уже делали, на этом не будем останавливаться). Видим, что регистр EAX содержит наши "буковки" BCDE:

https://forum.antichat.xyz/attachments/29113105/8.png

Дальше все, казалось бы, просто, но мы должны "перезаписать" переменную "local_18" символами "x0d", "x0a", ...! Те, кто "воевал" знают, что это управляющие символы CRLF:
  • \x0d - это символ возврата каретки (Carriage Return, CR), код ASCII 13.
  • \x0a - это символ перевода строки (Line Feed, LF), код ASCII 10.

https://forum.antichat.xyz/attachments/29113105/9.png

Но как же нам записать управляющие символы в значение переменной окружения "GREENIE"?

Сразу скажу, что управляющие символы можно записывать в переменных окружения и сейчас мы напишем маленький эксплойт (скрипт) на Python:

https://forum.antichat.xyz/attachments/29113105/10.png

Разбираемся с кодом. Var1 присваиваем строку из 64 символов 'A', за которой следует "упакованный" 0x0d0a0d0a в формате Little-Endian (<I). Далее, значение Var1 используем в качестве значения переменной окружения "GREENIE". Ну и запускаем сам EXE-файл. Выполним скрипт:

https://forum.antichat.xyz/attachments/29113105/11.png

Нам успешно удалось проэксплуатировать небезопасную функцию strcpy() и получить заветную строчку! З.Ы. Даже эксплойтик написали Всем спасибо за внимание! Увидимся в следующей части!


Время: 00:00