пятница, 17 мая 2013 г.

2 самые обычные инструкции

Mateusz "j00ru" Jurczyk, замечательный ресерчер потрохов windows, на конфе NoSuchCon среди прочих интересных вещей показал, как можно двумя инструкциями отправить windows в BSOD:

.text:00401008 start        proc near
.text:00401008                 xor     ebp, ebp
.text:0040100A                 jmp     near ptr 8053D60Ah (KiSystemServiceAccessTeb)
.text:0040100A start        endp
Причина такого поведения кроется в обработчике #PF:

        mov     ecx, offset FLAT:KiSystemServiceAccessTeb
        cmp     [ebp].TsEip, ecx
        jne     short Kt0e07

*       mov     ecx, [ebp].TsEbp        ; (eax)->TrapFrame of SysService
        test    [ecx].TsSegCs, MODE_MASK
        jz      short Kt0e07            ; caller of SysService is k mode, we will let it bugcheck.
        mov     [ebp].TsEip, offset FLAT:kss61
        mov     eax, STATUS_ACCESS_VIOLATION
        mov     [ebp].TsEax, eax
        jmp     _KiExceptionExit

Суть в том, что код обработчика принимает TsEbp за указатель на trap frame ( чем он и является при #PF в ядре ) на строке, выделенной *.
Но в данном примере, в обработчик приходит юзермодный ebp, что и приводит к BSOD'у.