IE: все по-старому Крис Касперски ака мыщъх Хакер, номер #090, стр. 090-055-9 Переключаемся на отладчик, переходим в окно CPU, давим <CTRL-G>, вводим адрес конструктора "75AA321B", устанавливаем точку останова на начало функции и перезапускаем отладчик по <Ctrl-F2>. Причем точка останова должна быть не программной (та, что ставится по <F2>), а непременно аппаратной (подводим курсор к строке 75ACC4C0h, нажимаем <Shift+F10>, в появившимся контекстом меню выбираем breakpoint -> hardware, on execution). Поскольку MSHTML.DLL загружается динамически, программная точка останова, представляющая собой машинную инструкцию INT 03h, с опкодом CCh, безжалостно затирается системным загрузчиком и потому не срабатывает. К своему стыду, OllyDbg не сохраняет аргументы командой строки отлаживаемого процесса при его перезапуске, поэтому IE уверенно стартует с домашней страницы, и exploit приходится загружать вручную через "файл -> открыть -> обзор -> IEdie2-3.html". На этот раз IE уже не грохается, а мирно вываливается в отладчик по точке останова! Конструктор вызывается множество раз, и, чтобы проследить за процессом инициализации каждого из объектов, необходимо перейти в окно дампа и сказать <CTRL-G>, "ECX", где ECX – регистр, в котором конструктору передается указатель на объект для конструирования. Начинаем трассировать программу, двигаясь, словно саперы по минному полю, и обращая внимание на малейшие нюансы оперативного окружения. Оказывается, что конструктор выполняет только первичную инициализацию, и над объектом работает множество функций, каждая из которых может оказаться источником разрушения. Чтобы сузить круг поиска, сосредоточимся на одном-единственном поле, расположенном по смещению 10h от начала объекта (именно отсюда функция GetDocPrt считывает инвалидный указатель, приводящий к сбою). Как показывает трассировка, его инициализация осуществляется еще в конструкторе, и делает это пара команд: MOV EAX,[ESP+ARG_4]/MOV [ESI+10H],EAX. Все ясно! Надо установить условную точку останова по этому адресу, срабатывающую, если EAX указывает на инвалидный регион. Наблюдая за разрушенным блоком, можно прийти к заключению, что поле, расположенное по смещению 10h, принимает произвольные значения от 00h до ~100h. Поскольку OllyDbg условные аппаратные точки останова еще не поддерживает, приходится прибегать к помощи могущественного SoftICE. Запускаем IE с "домашней страницы", вызываем SoftICE нажатием на <CTRL-D>, переключаем контекст командой "ADDR IEXPLORE", устанавливаем условную точку останова по исполнению "BPM 75AA322D X IF EAX < 100", выходим из отладчика и открываем в IE наш подопытный "iedie2-3.html". Все равно ничего не выходит. Значит, ошибка сидит не в конструкторе и не в вызывающей его функции. Это очень хитрое переполнение, и, чтобы его запеленговать, необходимо изготовить специальный инструмент — свой собственный отладчик или плагин для OllyDbg или SoftICE, который бы выполнял следующие действия: - устанавливал аппаратную точку останова на конструктор CElement::CElement и запоминал указатель, передаваемый ему через регистр ECX; |