Секс с IFRAME Крис Касперски ака мыщъх Хакер, номер #074, стр. 074-060-2 7178EC0A ; теперь уже затертому и содержащему подложные данные Двойной косвенный вызов функции по указателю причиняет хакеру дикую головную боль, разрывая напополам мозги с задницей изнутри. Засунуть в EAX указатель на произвольную область памяти не проблема. Сложнее добиться, чтобы по этому адресу был расположен указатель на shell-код, местоположение которого наперед неизвестно. Как же быть? Колбасим эксплоит Первым эту задачу решил нидерландский хакер Berend-Jan Wever совместно с blazde и HDM, сконструировавший более-менее работоспособный эксплоит с кодовым названием BoF PoC exploit, демонстрационный вариант которого можно скачать с домашней странички автора: www.edup.tudelft.nl/~bjwever. Как он работает? Сначала запускается JavaScipt-код, заполняющий практически всю доступную динамическую память nopslides-блоками. В начале каждого такого блока расположено большое количество указателей на адрес 0D0D0D0Dh (произвольное значение), а в конце находится непосредственно сам shell-код. Если хотя бы один nopslides-блок накроет своей тушей адрес 0D0D0D0Dh, в ячейке 0D0D0D0Dh с некоторой вероятностью окажется указатель на 0D0D0D0Dh. И какова же эта вероятность? Попробуем рассчитать. Куча (она же динамическая память) состоит из блоков размером в 1 Мбайт. Из них 60 (3Ch) байт съедает служебный заголовок, а все остальное отдано под нужды пользователя. Стартовые адреса выделяемых блоков округлятся по границе в 64 Кбайт, поэтому блок, перекрывающий адрес 0D0D0D0Dh, может быть расположен по любому из следующих адресов: 0D010000h, 0D020000h … 0D0D0000h. В худшем случае расстояние между ячейкой 0D0D0D0D и концом nopslides-блока будет составлять 775 байт, если служебный заголовок идет вначале, и 695 байт, если служебный заголовок идет в конце. Таким образом, если размер shell-кода не превышает 651 байт (695 байт минус длина 32-разрядного указателя) и хотя бы один nopslides-блок перекрывает адрес 0D0D0D0Dh (что вовсе не факт!), вероятность его срабатывания равна единице. Следует заметить, что значение указателя выбрано достаточно удачно. В IE версии 5.х куча начинается с адреса 018C0000h и простирается вплоть до 10000000h, так что адрес 0D0D0D0Dh попадает в окрестности вершины. По умолчанию IE открывает все окна в контексте одного и того же процесса, и с каждым открытым окном нижняя граница кучи перемещается вверх, поэтому трогать младшие адреса нежелательно. Тем не менее, если заменить 0D0D0D0Dh на 0A0A0A0Ah, можно обойтись значительно меньшим количеством nopslides-блоков. Стратегию выделения динамической памяти удобно исследовать в утилите LordPE Deluxe (см. рис. 2) или любой другой, способной отображать карту виртуальной памяти произвольного процесса. Но мы, похоже, забрели не в ту степь. Оставим теоретические дебри и вернемся к нашим баранам. На второй стадии атаки в игру вступает тэг IFRAME, вызывающий переполнение буфера и засовывающий в регистр EAX значение 0D0D0D0Dh. Уязвимый код, расположенный в динамической библиотеке SHDOCVW.DLL, считывает двойное слово по адресу 0D0D0D0Dh (а оно, как мы помним, при благоприятном стечении обстоятельств будет равно 0D0D0D0Dh) и передает на него управление, попадая внутрь принадлежащего ему nopslide-блока. 0D0D0D0Dh-указатели, в большом количестве расположенные в его начале, интерпретируются процессором как машинные команды OR EAX, 0D0D0D0Dh, которые не делают ничего полезного. Управление спокойно докатывается до shell-кода, и он, следуя зову природы, подчиняет удаленную машину воле атакующего. |