CVE-2016-0095 Win32k.sys特权提升漏洞
0x00 漏洞分析
1.运行poc,windbg捕捉到崩溃异常,栈回溯,可以看出是bGetRealizedBrush函数里触发了异常
2.分析下bGetRealizedBrush函数崩溃处的代码
2.1 ida分析下可以看出eax引用的是pEBRUSHOBJ结构体偏移0x34处的结构再偏移1c的数据从而访问无效地址
2.2对bGetRealizedBrush下硬件执行断点,ebx = 96bd9af8 ,eax = fe8d8658, eax+1c = 0
3.poc中的FillRgn函数调用内核NtGdiFillRgn函数,分析NtGdiFillRgn
3.1初始化poc中hRgn对象的数据
3.2 初始化poc中hBrush结构(pEBRUSHOBJ)
3.3 获取poc中COLORREF的值
3.4 到达EngPaint函数,可以知道大概传进的数据类型
3.5 _SURFOBJ 结构(fe174250),而导致蓝屏的pEBRUSHOBJ结构(8a16eaf8)偏移0x34是fe174240,fe174240偏移0x1c是0; 也就是说 pEBRUSHOBJ结构 偏移0x34中的值(fe174240)再偏移0x10就是_SURFOBJ 结构;那么_SURFOBJ 结构偏移0xc访问的是hdev字段 == (pEBRUSHOBJ结构(8a16eaf8)偏移0x34(fe174240),fe174240偏移0x1c)
typedef struct _SURFOBJ {
DHSURF dhsurf;
HSURF hsurf;
DHPDEV dhpdev;
HDEV hdev;
SIZEL sizlBitmap;
ULONG cjBits;
PVOID pvBits;
PVOID pvScan0;
LONG lDelta;
ULONG iUniq;
ULONG iBitmapFormat;
USHORT iType;
USHORT fjBitmap;
} SURFOBJ;
由于Poc中未对hdev进行初始化就直接引用,从而导致漏洞产生
0x01 漏洞利用
1.利用点
2.从漏洞触发到漏洞利用有几处if判断
第一处
第二处
第三处
3.利用思路:通过NTAllocateVirtualMemory在零页申请内存,在几处判断处赋上对应值,使流程往call edi处执行,其中偏移 0x748赋上shellcode地址
评论
发表评论