Обзор эксплойтов Крис Касперски ака мыщъх Хакер, номер #091, стр. 091-060-5 Bernhard Mueller, работающий в австрийской компании SEC Consult Unternehmensberatung GmbH, нашел одно из таких мест (о чем и рапортовал разработчикам Оперы, немедленно исправившим версию 8.54 и текущую — 9.0), однако в программе по-прежнему присутствует большое количество ошибок подобного типа, которые ждут своего хакера, поэтому нелишне присмотреться к уже заткнутой дырке поподробнее. Листинг 6: дизассемблерный листинг уязвимой функции n2k_vulnerably со знакомым переполнением .text:67B8CEFE n2k_vulnerably proc near ; CODE XREF: sub_67B4DB72+9D6?p .text:67B8CEFE ; sub_67B8AE6E+1B4?p .text:67B8CEFE .text:67B8CEFE arg_src = dword ptr 4 .text:67B8CEFE arg_len = dword ptr 8 .text:67B8CEFE .text:67B8CEFE A1 60 EF F9 67 mov eax, dword_67F9EF60 ; pObj .text:67B8CF03 53 push ebx ; сохраняем ebx .text:67B8CF04 56 push esi ; сохраняем esi .text:67B8CF05 57 push edi ; сохраняем edi .text:67B8CF06 8B 7C 24 14 mov edi, [esp+0Ch+arg_len] ; edi := arg_len .text:67B8CF0A 8B 70 40 mov esi, [eax+40h] ; pDestination .text:67B8CF0D 81 FF 00 10 00 cmp edi, 1000h ; проверка длины arg_len .text:67B8CF13 8B D9 mov ebx, ecx ; this call .text:67B8CF15 7C 05 jl short loc_67B8CF1C ; see! over here! .text:67B8CF17 BF FF 0F 00 00 mov edi, 0FFFh ; «усечение» arg_len .text:67B8CF1C .text:67B8CF1C loc_67B8CF1C: ; CODE XREF: n2k_vulnerably+17?j .text:67B8CF1C 57 push edi ; size_t .text:67B8CF1D FF 74 24 14 push [esp+10h+arg_src] ; wchar_t * .text:67B8CF21 56 push esi ; wchar_t * .text:67B8CF22 E8 E9 C0 31 00 call _wcsncpy ; копируем имя шрифта .text:67B8CF27 66 83 24 7E 00 and word ptr [esi+edi*2],0 ; ставим завершающий нуль .text:67B8CF2C 83 C4 0C add esp, 0Ch ; выталкиваем аргументы .text:67B8CF2F 8B CB mov ecx, ebx ; this call .text:67B8CF31 56 push esi ; скопированный arg_len .text:67B8CF32 E8 D9 FD FF FF call sub_67B8CD10 ; обрабатываем имя шрифта .text:67B8CF37 66 85 C0 test ax, ax ; все ок? .text:67B8CF3A 7D 0C jge short loc_67B8CF48 ; имеем хэндл .text:67B8CF3C 8B 8B D0 05 00 mov ecx, [ebx+5D0h] ; обработчик ошибки .text:67B8CF42 E8 75 F8 FF FF call sub_67B8C7BC ; eax := [ecx] .text:67B8CF47 40 inc eax ; eax++ .text:67B8CF48 .text:67B8CF48 loc_67B8CF48: ; CODE XREF: n2k_vulnerably+3C?j .text:67B8CF48 5F pop edi ; восстанавливаем edi .text:67B8CF49 5E pop esi ; восстанавливаем edi .text:67B8CF4A 5B pop ebx ; восстанавливаем ebx .text:67B8CF4B C2 08 00 retn 8 ; выталкиваем аргументы |