Друзья, всех приветствую! Это третья часть нашего "пывна" :) Сегодня будем изучать работу Stack2.exe (скачать можно ТУТ).
Ссылки на предыдущие части:
Эксплуатация бинарных уязвимостей или учимся «пывнить» (Часть 1 / Stack0)
Реверсинжиниринг PWN-тасков или эксплуатируем бинарные уязвимости (Часть 2 / Stack1)
Stack2
Начнем мы, как обычно, со статического анализа. Запускаем GHIDRA:
![Загрузка змеи :) Загрузка змеи :)](https://habrastorage.org/getpro/habr/upload_files/59f/88e/c16/59f88ec1644085600393422dee3c4ffc.jpg)
Закидываем "бинарь" в проект и нажимаем на Code Browser:
![](https://habrastorage.org/getpro/habr/upload_files/520/eb8/711/520eb87110ead9d49de5ccbbe7ffaa99.jpg)
Анализируем...
![](https://habrastorage.org/getpro/habr/upload_files/07b/47a/28e/07b47a28ed0c331825d2b9f044ea6740.jpg)
Получаем декомпилированный код. Обращаем внимание на переменную "local_14". Ей присваивается значение переменной окружения "GREENIE". Далее идет проверка. Если переменная "local_14" эквивалентна 0x0 (NULL), то программа выводит сообщение "Пожалуйста установите переменную окружения GREENIE":
![](https://habrastorage.org/getpro/habr/upload_files/998/b2e/ade/998b2eade7d5dc35924506fbeeaefc8e.jpg)
Смотрим дальше... Переменной "local_18" присваивается "0" (эту переменную и будем перезаписывать). Небезызвестно-небезопасная функция strcpy() копирует значение "local_14" в "local_58" (массив из 64-х байт). З.Ы. Прошу прощения, объявление массива не попало на скриншот. Далее идет проверка. Если переменная "local_14" эквивалентна "0xd0a0d0a", то PWN! (получаем сообщение, что мы молодцы, корректно модифицировали переменную). Если нет, то "Try again":
![](https://habrastorage.org/getpro/habr/upload_files/eae/60d/ac2/eae60dac23108ff36de1e52fc9d56a22.jpg)
Супер! Разобрались как работает программка. Сделаем небольшой тест. Идем в переменные окружения и добавляем переменную "GREENIE" с значением 64 символа "A" (т.к. массив - 64 байта) и "BCDE" (этими символами попробуем перезаписать переменную "local_18"):
![](https://habrastorage.org/getpro/habr/upload_files/617/ab6/89d/617ab689df9d6877772008544b8aeaca.jpg)
![](https://habrastorage.org/getpro/habr/upload_files/50c/8c0/663/50c8c0663fdd79d091b0793b95d655e4.jpg)
Открываем x64dbg, ставим "бряк" на инструкции CMP (мы это уже делали, на этом не будем останавливаться). Видим, что регистр EAX содержит наши "буковки" BCDE:
![](https://habrastorage.org/getpro/habr/upload_files/69d/bb0/5ff/69dbb05ff27c611f44de61091d0f2fbd.jpg)
Дальше все, казалось бы, просто, но мы должны "перезаписать" переменную "local_18" символами "x0d", "x0a", ...! Те, кто "воевал" знают, что это управляющие символы CRLF:
\x0d
- это символ возврата каретки (Carriage Return, CR), код ASCII 13.\x0a
- это символ перевода строки (Line Feed, LF), код ASCII 10.
![](https://habrastorage.org/getpro/habr/upload_files/7bf/51a/920/7bf51a9205affd5ba9d61cf6ecc9314c.jpg)
Но как же нам записать управляющие символы в значение переменной окружения "GREENIE"?
Сразу скажу, что управляющие символы можно записывать в переменных окружения и сейчас мы напишем маленький эксплойт скрипт на Python:
![](https://habrastorage.org/getpro/habr/upload_files/1f7/cbd/22c/1f7cbd22cbc97f81c6d175ac13114063.jpg)
Разбираемся с кодом. Var1 присваиваем строку из 64 символов 'A', за которой следует "упакованный" 0x0d0a0d0a в формате Little-Endian (<I). Далее, значение Var1 используем в качестве значения переменной окружения "GREENIE". Ну и запускаем сам EXE-файл.
Выполним скрипт:
![Profit! Profit!](https://habrastorage.org/getpro/habr/upload_files/940/8d4/aa3/9408d4aa37384b669e9fc7aca4d8e037.jpg)
Нам успешно удалось проэксплуатировать небезопасную функцию strcpy() и получить заветную строчку! З.Ы. Даже эксплойтик написали :)
Если понравилась статья - палец вверх! Также подписывайтесь на мой TG!
Увидимся в следующей части! :)