Как использовать уязвимость

Тема в разделе "WASM.NT.KERNEL", создана пользователем Clerk, 27 апр 2008.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Доброго времени суток.
    Сегодня разбирал win32k.sys. На глаза попались три сервиса:
    NtUserCallNoParam
    NtUserCallOneParam
    NtUserCallTwoParam
    Оказывается это расширенные сервисы. Вот прототип NtUserCallOneParam():
    NtUserCallOneParam(
    IN DWORD Parameter,
    IN ULONG Service
    ):ULONG
    Он помешает в стек параметр и передаёт управление на обработчик из таблицы, который индексируется пар. Service.
    Взглянув на обработчики из таблицы, заметил что если вызывающий поток не принадлежит csrss.exe, то при передаче указателей выполняются проверки валидности памяти, а если поток принадлежит csrss то никакие проверки не выполняются. Чтобы выполнить код в процессе csrss необходимы отладочные привилегии.
    Вот один из сервисов:
    Код (Text):
    1. Service38h:
    2.     mov edi,edi
    3.     push ebp
    4.     mov ebp,esp
    5.     push esi
    6.     call ntoskrnl.PsGetCurrentProcess
    7.     cmp eax,dword ptr ds:[1B6DA4]   ;CsrssProcess:PEPROCESS
    8.     jnz short 00127375
    9.     test byte ptr ds:[7FFE02D0],10  ;KUSER_SHARED_DATA.SuiteMask, default
    10.     je short 00127375
    11.     mov esi,dword ptr ds:[1B80A0]
    12.     test esi,esi
    13.     je short 0012736E
    14.     mov ecx,dword ptr ds:[1A85E4]   ;54h
    15.     mov eax,ecx
    16.     push edi
    17.     mov edi,dword ptr ss:[ebp+8]
    18.     shr ecx,2
    19.     rep movs dword ptr es:[edi],dword ptr ds:[esi]
    20.     mov ecx,eax
    21.     and ecx,3
    22.     rep movs byte ptr es:[edi],byte ptr ds:[esi]
    23.     xor eax,eax
    24.     pop edi
    25.     jmp short 0012737A
    26. 0012736E:
    27.     mov eax,C000000E
    28.     jmp short 0012737A
    29. 00127375:
    30.     mov eax,C0000022
    31. 0012737A:
    32.     pop esi
    33.     pop ebp
    34.     ret 4
    35.  
    36. [1B80A0]:
    37. bf9a80a0 bf9a99e0 00000000 00000000 81f90ab0
    38. bf9a80b0 81ea6b50 00000000 00000000 00000000
    39. bf9a80c0 00000000 00000000 00000000 00000000
    40. bf9a80d0 00000000 00000000 00000000
    Тоесть если вызвать этот сервис в контексте процесса csrss, то будет возможность заполнить произвольную область ядерной памяти таблицей(1B80A0). Я не проверял ещё это, но работать должно. Вопрос в том, как изменить этим какието данные(ntos и др.) так, чтобы можно было получить доступ в KernelMode.