Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #48, НОЯБРЬ 2004 г.

Эксплоит для сетевого чата

sba (sba@list.ru)

Спецвыпуск: Хакер, номер #048, стр. 048-034-3


Скармливаем полученную программу в DeDe, после чего получаем выходной файл Unit1.pas. Так как программа маленькая, то смотреть там почти не на что, и вот что мы видим:

TForm1.CheckBox1: TCheckBox – это название и класс нашего CheckBox, TCheckBox.GetChecked – функция, которая берет значение флажка и возвращает значение на выходе. Последние две строчки кода - это проверка if – then. Вот примерно такой код нам и нужно найти. Делаем ту же операцию с Насси. DeDe выплевывает нам кучу непонятных файлов с расширением *.pas. Посмотрим, что там за названия. Setup.pas - то, что надо. Так называется раздел меню, где находятся настройки. Теперь ищем строку GetChecked. После длительных поисков мы пришли к выводу, что название нашего CheckBox - TSetupForm.CB2Х, где Х принимает значения от 0 до 6, то есть всего существует семь CheckBox.

В листинге можно видеть, как вызывают функцию взятия флага TCheckBox.GetChecked и результат кладут в некую переменную. Здесь как раз и начинается самое интересное. Если возвращать не результат, а ноль, то Network Assistant будет думать, что CheckBox не выбран. Визуально нет никаких изменений, когда мы его выбираем - он выбран, а когда снимаем флажок - он снимается. Но этот финт будет работать, только если мы зайдем в меню Setup. А требуется, чтобы это работало всегда, когда есть такое желание :). Пожалуй, надо полюбопытствовать, а где же проверяют этот флаг, когда мы нажимаем на кнопку просмотра списка процессов. Тут нам понадобится отладчик. Загружаем программу в отладчик по нажатию клавиш <Ctrl> +<G> . Переходим по адресу 004A98BA (см. рисунок 7) и ставим брейкпоинт на этот адрес. По <F9> запускаем программу, входим в Setup и сразу, без всяких изменений, жмем Ok. В отладчике активируется брейкпоинт. Нажимаем <Ctrl> +<G> в окне памяти программы и выбираем в регистр EDX. Теперь мы находимся по адресу переменной (004CB558), в которую помещают результат (см. рисунок 8). Адрес может отличаться в различных версиях Windows. Как показано на рис. 8, вызываем контекстное меню и ставим брейк на доступ к памяти, то есть - на чтение/запись. Трассируем программу дальше.

Сразу же выползает тетя Оля и сообщает, что попалась-таки проверочка флага. В этом месте мы и будем возвращать при любых условиях 0 (см. рисунок 5). Для Network Assistant это - сброшенный флаг, то есть удаленный доступ будет разрешен. Аналогичным способом ищем и меняем другие флаги.

Поиск дыры в Network Assistant

Структура пакетов Network Assistant нам уже известна. Попробуем из имеющейся информации выжать максимум. Для нас особый интерес представляют всевозможные массивы и стринги (кстати, перестань каждый раз улыбаться при слове «стринги» - мы люди старой закалки и употребляем это слово в исключительно компьютерном смысле :)). Первое, что бросается в глаза, – это стринги с названием хоста-отправителя и ником пользователя. Попробуем сформировать и отправить пакет с максимально возможной длиной стринга (равной 255).

Отправив пакет с названием хоста-отправителя длиной в 255 байт, получаем аварийное завершение программы. Переполнение найдено! К сожалению, показать скриншот не представляется возможным - Network Assistant слетает намертво без единого писка. Объяснение этому явлению очень простое – программа написана на Delphi, а сие творение гениальной Борланд очень любит размещать в стеке (сразу за адресом возврата из процедуры) фрейм SEH (структурная обработка исключений). Таким образом, мы не только поменяли адрес возврата процедуры-обработчика поступивших пакетов, нарушив нормальный ход выполнения программы, но и с успехом завалили цепочку обработчиков SEH. С этим последним ударом Network Assistant уже не в силах справиться. Узнать точный размер переполняемого буфера и другие важные нюансы методом тыка не удастся, поэтому далее полагаемся на дебагер.

Назад на стр. 048-034-2  Содержание  Вперед на стр. 048-034-4