Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #45, АВГУСТ 2004 г.

Защитись и замети!

Коваленко Дмитрий aka Ingrem

Спецвыпуск Xakep, номер #045, стр. 045-068-8


Теперь остается только изменить вызов по адресу 0x00453CE5, чтобы он указывал на наш код:

Листинг

.00453CE3: 8BC3 mov eax,ebx

.00453CE5: E916C4FAFF jmp .000453100

.00453CEA: 54 push esp

Все. Запускаем winrar.exe, открываем 29A.RAR.

Никакого аварийного завершения, хотя архив отображается пустым (оно и неудивительно, ведь внутри он содержит ошибки, из-за которых собственно и происходило переполнение).

А как насчет других файлов? Советую тебе потестировать пропатченный архиватор: создай десяток-другой архивов, распакуй что-то, сделай SFX. Убедись, что все в порядке и патч "прижился" хорошо ;-). Я тестировал свой пропатченный WinRAR около часа – ни одного глюка. Кстати, инсталляцию WinRAR 3.0 rus вместе с пропатченным winrar.exe ты можешь найти на диске. Ну вот, теперь у тебя есть некоторый опыт закрытия дыр в чужих прогах. Как видишь, все оказалось не так-то сложно – просто нужно знание ассемблера и много терпения. Думаю, и то и другое у тебя есть, так что особых трудностей не будет. Удачных патчей! :-)

Немного экзотики: неисполняемый стек

Кроме элементарных приемов защиты, существуют и более навороченные техники. Одна из них – неисполняемый стек. О нем я расскажу лишь вкратце. Идея состоит в присваивании сегментам стека и данных атрибуты только записи и чтения. Это позволяет защитить приложение от внедрения исполняемого кода, но не спасает от других видов атак (например, от подделки структур). Неисполняемый стек также плохо совместим с компиляторами и интерпретаторами, которые часто генерируют и выполняют код динамически. Существует несколько реализаций неисполняемого стека в виде патчей к ОС Solaris и Linux, но все они не очень удачны. Вот, пожалуй, и все.

Дизассемблированный рар

.text:00473648 sub_473648 proc near

.text:00473648 arg_0 = dword ptr 8;

.text:00473648 arg_4 = dword ptr 0Ch;

.text:00473648

; строим стековый фрейм и сохраняем регистры ===

.text:00473648 push ebp

.text:00473649 mov ebp, esp

.text:0047364B push esi

.text:0047364C push edi

; собственно, работа процедуры ===

.text:0047364D mov edi, [ebp+arg_4]

.text:00473650 mov esi, edi

.text:00473652 mov ecx, 0FFFFFFFFh

.text:00473657 xor al, al

.text:00473659 cld

.text:0047365A repne scasb

.text:0047365C not ecx

.text:0047365E mov edi, [ebp+arg_0]

.text:00473661 mov eax, edi

.text:00473663 mov edx, ecx

.text:00473665 shr ecx, 1

.text:00473667 shr ecx, 1

.text:00473669 cld

.text:0047366A repe movsd

.text:0047366C mov ecx, edx

.text:0047366E and ecx, 3

.text:00473671 repe movsb

; восстанавливаем регистры ======

.text:00473673 pop edi

.text:00473674 pop esi

.text:00473675 pop ebp

.text:00473676 retn; выход

.text:00473676 sub_473648 endp

Код пачта к WinRar в HIEW

00000100: 60 pushad

00000101: 9C pushfd

00000102: B9FFFFFFFF mov ecx,0FFFFFFFF

00000107: 8BFA mov edi,edx

00000109: 32C0 xor al,al

0000010B: FC cld

0000010C: F2AE repne scasb

Назад на стр. 045-068-7  Содержание  Вперед на стр. 045-068-9