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

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

Ссылки на предыдущие части:

Эксплуатация бинарных уязвимостей или учимся «пывнить» (Часть 1 / Stack0)

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

Stack2

Начнем мы, как обычно, со статического анализа. Запускаем GHIDRA:

Загрузка змеи :)

Загрузка змеи :)

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

520eb87110ead9d49de5ccbbe7ffaa99.jpg

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

07b47a28ed0c331825d2b9f044ea6740.jpg

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

998b2eade7d5dc35924506fbeeaefc8e.jpg

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

eae60dac23108ff36de1e52fc9d56a22.jpg

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

617ab689df9d6877772008544b8aeaca.jpg50c8c0663fdd79d091b0793b95d655e4.jpg

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

69dbb05ff27c611f44de61091d0f2fbd.jpg

Дальше все, казалось бы, просто, но мы должны «перезаписать» переменную «local_18» символами «x0d», «x0a», …! Те, кто «воевал» знают, что это управляющие символы CRLF:

  • \x0d — это символ возврата каретки (Carriage Return, CR), код ASCII 13.

  • \x0a — это символ перевода строки (Line Feed, LF), код ASCII 10.

7bf51a9205affd5ba9d61cf6ecc9314c.jpg

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

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

1f7cbd22cbc97f81c6d175ac13114063.jpg

Разбираемся с кодом. Var1 присваиваем строку из 64 символов 'A', за которой следует «упакованный» 0×0d0a0d0a в формате Little-Endian (

Выполним скрипт:

Profit!

Profit!

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

Если понравилась статья — палец вверх! Также подписывайтесь на мой TG!

Увидимся в следующей части! :)

© Habrahabr.ru