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

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

Помимо всего обещанного в статье, на нашем диске ты найдешь полную версию статьи Криса об этом баге. Дело в том, что статья у него по обыкновению получилась просто невероятных размеров, и в журнале нам пришлось ее подсократить. Полная версия статьи Криса лежит на нашем диске - забирай, вчитывайся.

Назад на стр. 086-066-8  Содержание