WMF: баг года крис касперски ака мыщъх Хакер, номер #086, стр. 086-066-9 Оттуда, из DllMain, он загружает GDI32.DLL, определяет адрес функции Escape и, предварительно присвоив нужные атрибуты вызовом VirtualProtect, дописывает к ее началу крохотный thunk, анализирующий аргументы, и если func == SETABORTPROC, то возвращает xor eax, eax/pop ebp/retn 14h. Некоторые антивирусные программы и защитные системы (такие, например, как Lavasoft's Ad-Watch) не позволяют приложениям модифицировать ветку AppInit_DLLs, автоматически восстанавливая ее содержимое. В этом случае hotfix не сработает, пока разбушевавшегося «сторожа» не удастся утихомирить вручную. Кстати говоря, чтобы временно отключить hotfix, достаточно просто переименовать wmfhotfix.dll. заключение Найденный баг лишний раз подтверждает печальный тезис: программное обеспечение от Microsoft катастрофически ненадежно и дыряво, как дуршлаг. В критически важных инфрастуктурах лучше использовать альтернативные операционные системы, например, BSD или… Windows 98. Забавно, но атаковать 9x сейчас намного сложнее, чем NT, и черви под ней практически не распространяются. внутри GDI32.DLL Дизассемблирование GDI32.DLL лучше всего начинать с функции PlayMetaFileRecord/ PlayEnhMetaFileRecord. Функция PlayMetaFileRecord представляет собой огромный switch, на case-ветвях которого расположены вызываемые GDI-функции, а PlayEnhMetaFileRecord использует табличный метод вызова: дизассемблерный фрагмент PlayEnhMetaFileRecord из GDI32.DLL W2KSP4 .text:77F70CB7 mov ebx, [ebp+arg_C] .text:77F70CBA push esi .text:77F70CBB push edi .text:77F70CBC mov eax, [ebx] .text:77F70CBE cmp eax, 1 .text:77F70CC1 jb short loc_77F70CDF .text:77F70CC3 cmp eax, 7Ah .text:77F70CC6 ja short loc_77F70CDF .text:77F70CC8 push [ebp+arg_10] .text:77F70CCB mov ecx, ebx .text:77F70CCD push [ebp+arg_8] .text:77F70CD0 push [ebp+arg_4] .text:77F70CD3 call off_77F7B62C[eax*4] Последовательно перебирая одну функцию за другой, смотрим, не принимают ли они callback'и в качестве одного из своих аргументов (эту информацию можно почерпнуть из SDK), и если принимают, то не позволяют ли передавать указатель внутри wmf-файла. Есть подозрение, что это не последняя дыра в GDI :). CD Помимо всего обещанного в статье, на нашем диске ты найдешь полную версию статьи Криса об этом баге. Дело в том, что статья у него по обыкновению получилась просто невероятных размеров, и в журнале нам пришлось ее подсократить. Полная версия статьи Криса лежит на нашем диске - забирай, вчитывайся. |