博文

CVE-2016-0095 Win32k.sys特权提升漏洞

图片
0x00 漏洞分析       参考: https://www.anquanke.com/post/id/86040       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;  也...

ring0层api调用流程分析

图片
1.用windbg反汇编查看下KiFastCallEntry函数 2.查看下_KPCR结构,ebx偏移124指向_ETHREAD结构 3. 知道esi 指向_ETHREAD这个结构,esi偏移0x0bc,指向系统服务描述符表(ssdt) 4.ssdt表查看分析    结构     typedef struct _tagSSDT {         PVOID pvSSDTBase;   // “系统服务描述符表”的基地址     PVOID pvServiceCounterTable;   // 指向另一个索引表     ULONG ulNumberOfServices;   // 当前系统所支持的服务个数     PVOID pvParamTableBase;   // 系统服务参数表    } SSDT, *PSSDT; 5. 内核api分析  ZwQuerySystemInformation 6. 内核api经过KiSystemService->KiFastCallEntry 7. 最后的函数调用 8.总结 其实不管是用户层api(SYSENTER从ring3层跨到ring0层)还是内核层的api都会经过KiFastCallEntry进行处理( KiFastCallEntry主要是完成在ssdt表里寻找具体的函数), 平常在ring3层看到的只是简单的外壳,没有具体实现的代码。 用户层api流程:ring3层api-> SYSENTER从ring3层跨到ring0层,再经过KiFastCallEntry. 内核层api流程:ring0层api-> KiSystemService->KiFastCallEntry

利用[CVE-2013-3346]-Adobe Reader释放重引用和[CVE-2013-5065]-NDProxy.sys数组越界漏洞的恶意代码分析

图片
0x00 pdf 文件结构学习 参考:漏洞战争 http://blog.csdn.net/adolphfend/article/details/24729025 1. 文件头:该文件所遵从的 PDF 规范的版本号 2.文件体:由一系列 pdf 对象组成(页面,字体,图片等) 常见的对象: 字体 (Font) ,流对象 (Stream) ,路径对象( Path Object ),文本对象( Text Object ),图像对象( Image Object ),动作对象( Action Object )等 3. 交叉引用表:为了能对间接对象进行随机存取而设立的一个间接对象的地址索引表。 4.文件尾:声明了交叉引用表的地址,文件体的根对象等 0x01 样本 shellcode 提取与分析 1. 用 peepdf 提取样本的 shellcode     使用 jjencode 加密,用 peepdf 中的 js_jjdecode 进行解密     用 js_analyse 分析提取 shellcode ,并保存到文件中 2. 分析 shellcode    将提取出来的二进制转成 exe 后,用调试器调试分析   获取 kernel32.dll ->hash:0x6E2BCA17   遍历导出表,获取用到的函数   函数 hash     解密出字符串(驱动程序符号连接名)    获取一个内核函数(在进程中分配内存)    在刚刚分配的空间里,拷贝一段数据(接近 0 )( CVE-2013-5065 漏洞利用)    打开驱动程序的符号链接名,进行通讯 控制码 0x8FFF23C8   但不断单步会在 SetFilePointer 陷入死循环,往下查看可以推测出, shellcode 在寻找 0xA0909F2 开头的字节码 ...