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

Обзор эксплойтов

Крис касперски

Хакер, номер #093, стр. 093-056-4


Дизассемблерный фрагмент NetpIsRemote() с потенциально опасными функциями wcscpy() и wcscat()

7CD25C24 lea eax,[ebp+var_20C]

7CD25C2A push esi

7CD25C2B push eax

7CD25C2C mov eax,[ebp+arg_4]

7CD25C2F push dword ptr [eax+4]

7CD25C32 push edi

7CD25C33 call I_NetNameCanonicalize

7CD25C38 cmp [ebp+var_4],edi

7CD25C3B jz loc_7CD25C48

7CD25C3D mov eax,[ebp+arg_C]

7CD25C40 lea ebx,[ebp+var_20C]

…

7CD25C6E push asc_7CD17CF4

7CD25C73 push [ebp+arg_C]

7CD25C76 call ds:__imp_wcscpy

7CD25C7C pop ecx

7CD25C7D pop ecx

7CD25C7E push ebx

7CD25C7F push [ebp+arg_C]

7CD25C82 call ds:__imp_wcscat

Но ведь в нашем распоряжении есть готовая заплатка! Давай, чтобы не блуждать впотьмах, просто сравним дизассемблерные листинги функции NetpIsRemote() до и после обновления — все изменения станут сразу очевидны!

Скачиваем заплатку с официального сервера Microsoft (для моей Windows 2000 SP4 это download.microsoft.com/download/9f06d3f3-87d0-445d-8a41-d2ffef9a40ba/windows2000-kb921883-x86-rus.exe), представляющую собой обыкновенный самораспаковывающийся cab-архив. в прошлом ревю мы показывали как извлечь его содержимое с помощью hiew'а, однако, есть и более короткий путь — достаточно "скормить" исполняемый файл rar'у и все упакованные файлы предстанут перед нашими глазами!

Извлекаем из архива NetApi32.DLL, переименовываем ее, например, в NetApi32-new.DLL и загружаем в дизассемблер. какие различия между старой и новой версией NetpIsRemote() мы увидим? В первую очередь это гнусная выходка компилятора, инвертировавшего условные переходы, в результате чего ветви программы поменялись местами:

JNZ branch_A ? JZ branch_B

breanch_B breanch_A

Листинг Функции NetpIsRemote() идентичен в обоих версиях, но порядок машинных команд поменялся местами, ослепляя большинство анализаторов типа fc.exe и wnindiff, которыми мы пользовались ранее. Как же быть? А вот как! Берем блок A из строй версии NetApi32.DLL и ищем похожий на него блок в NetApi32-new.DLL, затем добиваемся, чтобы первые строки блоках в обоих окнах дизассемблера совпадали (что легко осуществляется мышью или курсорными клавишами). теперь начинаем быстро переключаться с одного окна дизассемблера на другое по <ALT TAB>, при этом, несовпадающие строки начинают интенсивно мерцать, выдавая различия с головой (аналогичным образом астрономы ищут и новые звезды — т.е. звезды меняющий свой блеск — попеременно проецируя на экран несколько слайдов снятых в разное время они смотрят — не начнет ли какая точка ритмично мигать. способ древний как мамонт, но очень надежный).

действуя таким образом, мы довольно быстро найдем "линую" функцию wcslen(), которой не было ранее и которая контролирует длину строки перед копированием:

Старая (слева) и новая (справа) версии NetpIsRemote()

7CD25C2C mov eax, [ebp+arg_4] 7CD2318D mov eax,[ebp+arg_0]

7CD25C2F push dword ptr [eax+4] 7CD23190 push dword ptr [eax+4]

Назад на стр. 093-056-3  Содержание  Вперед на стр. 093-056-5