《机制原理与其对安全领域的影响.pdf》由会员分享,可在线阅读,更多相关《机制原理与其对安全领域的影响.pdf(25页珍藏版)》请在三个皮匠报告上搜索。
1、目录概述什么是PATCH GUARD?PATCH GUARD 执行流程分析突破手段各系统版本-静态突破各系统版本-动态突破利用硬件支持进行攻击一些想法安全厂商与PATCH GUARD关注新机制:HYPER GUARD第一部分:概述什么是Patch GuardPatch Guard是微软的一种安全机制,防止内核关键代码与数据被修改。其主要保护了SSDT(System Service Descriptor Table)GDT(Global Descriptor Table)IDT(Interrupt Descriptor Table)System Images(ntoskrnl.exe,ndis.
2、sys,hal.dll,win32k.sys)Process MSRs(syscall)-“Please dont patch our kernels”call from MSPatchGuard将会周期性的检查系统,如果你的内核Patch被微软发现,那么微软将BSOD系统。值得注意的是,PatchGuard并不在Windows9上工作Patch Guard执行流程分析PatchGuard 在不同版本系统上有不同的初始化过程。但大致流程一致,这里用win10 10240做例子:Phase1InitializationDiscard-KeInitAmd64SpecificState-KiFilt
3、erFiberContext在系统初始化过程中,将会调用一个函数KeInitAmd64SpecificState,这是个故意误导逆向者的符号名:从左侧可图片可以很清晰地看出,这个函数所做的事就是判断系统是否为安全模式启动,如果是就不执行后面的代码,反之则执行。由此可见,PatchGuard不会在以安全模式启动的系统上加载。后面的代码也十分简单,将两个全局变量KdDebuggerNotPresent与KdPitchDebugger做了一些运算,并执行了一个除法操作。为了方便调试,我们使用windbg,在关键函数上下断点Patch Guard执行流程分析单步到除法指令,我们查看寄存器此时我的电脑是
4、以调试模式启动的,所以KdDebuggerNotPresent值为0,此时进行除法操作并不会触发任何事情。当KdDebuggerNotPresent为1时,我们再来查看寄存器:很显然,此时再进行除法操作会产生一个除法错误。微软利用这个除法错误引导执行自己的PG初始化代码:KiFilterFiberContextPatch Guard执行流程分析在KiFilterFiberContext内部,微软再次进行了内核调试器检查,如果检测到调试器,微软就使系统进入死循环。KiFilterFiberContext内部的代码比较简单,在进行一些运算后会调用一个函数,用于初始化PatchGuard的执行环境:
5、这个函数,微软并未给出符号,且函数里面的大多数符号都经过混淆。不仅如此,微软还在这个函数里面随机插入了反调试代码:这个函数过于庞大,保守估计大小至少在90KB以上。Patch Guard执行流程分析完整地逆向Patch Guard的初始化代码并不太现实,但我们仍然可以找到一点思路:在这里,PatchGuard初始化了自己的执行代码,将Init节区的某些代码拷贝到了内存中,为之后的轮询检查做准备。之后,便是PG初始化自己的一些结构体与执行环境到内存中,并对其进行加密。内存中主要包括:解密例程,用于运行时解密数据与代码,内部数据结构,解密key,验证key,一些关键函数的地址。当然还有PG的主体代
6、码与一些内核函数代码(当PG需要调用内核函数时,会从这里拷贝出代码并写入对应代码段,比如KeBugCheckEx)。最后是内核关键数据,Image被保护节区的CRC值,与一些关键寄存器的值。这些数据在内存中都是加密的。Patch Guard执行流程分析初始化环境时的关键代码:当所有东西准备完毕,PG会通过一个Timer将自己的工作线程加入执行队列。至此,PG初始化完成,系统继续启动。第二部分:突破手段各系统版本 静态突破静态突破通过给内核文件进行打补丁操作,彻底剔除PG。静态突破存在一个缺陷,用户电脑必须要进行重启才能生效。并且不能在开启了SECURE BOOT的电脑上使用。这里用Win 10