系统安全C/C++汇编 [2021]Windows PatchGuard KiErrata671Present 在一次偶然中我发现了KiErrata671Present,它这个看起来长这样: ![](https://key08.com/usr/uploads/2021/08/1055346649.png) 人畜无害 但是看调用: ![](https://key08.com/usr/uploads/2021/08/1257889702.png) 第一眼看不出什么 让我们慢慢解释一下: ![](https://key08.com/usr/uploads/2021/08/1678044808.png) 请注意,ida反汇编的代码是没有try和catch的,在汇编里面,你可以看得到如下的代码: ![](https://key08.com/usr/uploads/2021/08/1437456579.png) 通俗的解释一下 1.去掉页面保护 2.给KiErrata671Present + 0x2的位置写0xC3 让其从1返回为0 3.执行KiErrata671Present 4.恢复页面保护 这样做会有什么效果: 一些hypervisor中的EPT/NPT hook技术会让页面读写执行分离实现无痕hook,如果在有EPT/NPT HOOK的情况下并且这个函数正好与某些保护页面在同一页的情况下,第2步(给KiErrata671Present + 0x2的位置写0xC3 让其从1返回为0)不会被写入执行页面,导致执行结果依然是1,从而让其检测到hypervisor,不过这也只是猜测,因为目前有几个不确定: 1. 这个是1809的东西,为什么目前没有1809的ept hook出错的报告 2. 这个东西是如何调用的,会在哪调用,哪些页面会有这个东西,目前来说并不知道 阅读全文 2021-08-18 huoji 5 条评论
二进制安全C/C++汇编 [2021]检测hypervisor -国内各大安全沙箱测评 本次测评分别测评如下性能: 1. icebp指令模拟 https://key08.com/index.php/2021/05/13/1086.html: > mov ss会产生一个异常,但是这个异常会在下一个指令执行的时候再抛出.因此 他首先mov ss了,这样下一个指令才会执行异常, 到icebp的时候, mov ss造成的异常就应该被抛出了。但是同时icebp也会造成一个异常,而且异常优先级哎比mov ss的高,你说巧不巧.这样CPU就会处理icebp的异常而不处理mov ss的异常,但是mov ss的异常是必须要求dr6的single_instruction bit位(也就叫做DR6.BS位)为1的,要不然就炸。很遗憾的是icebp的异常他不会设置这个bs位,导致直接炸虚拟机.很多时候虚拟机在2004跑起来了结果一阵子就虚拟机guest机异常了就是这个毛病 2. 时间延迟检测 > 由于经过虚拟化的vmexit阶段,沙箱的退出时间会比真实的早 阅读全文 2021-07-03 huoji 0 条评论
二进制安全C/C++汇编一线开发 [2021]解读HyperPlatform的MMU(memory management unit)虚拟化 ## MMTR windows和linux系统在启动的过程中,会分配一段叫做"低内存"(low-level-memory)的保留内存区域,地址范围是在0x1000-0xA0000 这一段区间内,用于各种bios的操作。在此期间有一个操作是bios会通过这里面的字段信息设置对应的物理内存的地址范围属性,这叫做 "MTRRS -memory-type range register"(内存范围类别注册) 为什么要这样做呢? 答案: 告訴CPU在解析或者说操作内存的时候应该用什么手段。一般情况下,内存都是应该是被设置为有cache来帮助CPU操作内存的,这样的话整个系统的效率就会比较高。但是某些设备所使用的内存却比较特殊,比如说Frame buffer就是一种很好的例子。那么软件(一般情况下是BIOS)就需要配置CPU的相关寄存来申明那些范围的内存在处理的时候需要做什么样的动作(这就是类型)。总的来说它们允许CPU优化不同类型的内存如RAM,ROM和帧缓冲内存(frame buffer),内存操作映射I / O设备。这种做法简化了内存控制系统的硬件设计引脚。 根据intel手册,内存有以下的类型: ![](https://key08.com/usr/uploads/2021/05/4142820640.png) MTRR机制允许多达96个内存范围(memory ranges)在物理内存的定义,它定义了一系列的MSRs,这些寄存器分别去说明MSR定义中包含的那段内存的具体类型 ## MMU 现在的计算机基本上都带了一个叫做MMU(memory management unit)的东西,这个东西你可以理解为内存管理机制(虽然有点偏离意思),他主要负责内存访问、读写权限控制、虚拟地址到物理地址转换。 **请注意这里有个小知识点,虚拟内存的块我们叫做页(page),而物理内存的块我们叫做帧(frame)** intel把虚拟内存分为一个一个4KB的页面(可以是其他大小),物理内存分为一个一个4KB的帧,之后在此基础上设置了TLB机制(后备缓冲区,简单理解为是一种CPU缓存就行) 物理与虚拟地址转换图: ![](https://key08.com/usr/uploads/2021/05/4219135422.png) 如果你还是不理解物理地址与虚拟地址这些的关系,可以参考一下大学课本《计算机组成原理》这本书,里面有详细的介绍 ## EPT EPT是intel的CPU的一个名词,全名 Extended Page Table(NPT跟这个差不多),或者叫做SLAT,他最简单的理解就是: 以前: 物理内存 -> MMU -> 虚拟内存 EPT开启: guest access物理内存 -> EPT -> MMU -> 虚拟内存 阅读全文 2021-05-28 huoji 0 条评论
工具软件二进制安全C/C++汇编一线开发 [2021]基于hypervisor的HIPS架构 从0到1 四 (SSDT hook) # 前言 还记我们系列的标题吗? HIPS,作为系统监控,我们需要监控所有的syscall调用。这个部分会由hypervisor完成. ssdt hook是一个古老古老的东西了,还记得我以前入门就是很多人把ssdt hook看做是核心机密,现在已经烂大街了.我们的ssdt hook不同于传统的"内联hook",我们准确的说叫做msr hook.回忆一下amd64里面syscall的方式,看看AMD手册的介绍: 在AMD64体系下,为了解决之前int调用方式的不足,从而推出了syscall指令作为进入内核入口的指令,syscall在AMD64体系下调用的方式 ![](https://key08.com/usr/uploads/2021/05/3936827292.png) 可以看到,最终RIP的值会等与MSR_LSTAR相等,而在微软体系里,MSR_LSTAR存放着kisystemcall64的函数地址 因此,我们需要hook这个msr_star 阅读全文 2021-05-25 huoji 1 条评论
系统安全C/C++汇编Shellcode [2021]微软如何检测到hypervisor以及如何预防 微软挺奇怪的,什么事都要管一腿.总所周知 win 1809后hypervisor的一些功能比如msr hook(通过替换msr_lstar寄存器)的方案已经无了.怎么无的呢?除了kva shadow的问题,还有如下几个问题: 翻开微软的内核,有如下函数 KiErrata361Present KiErrataSkx55Present KiErrata704Present ... 这些函数有如下特点: 1. 名字莫名其妙 2. 调用者也莫名其妙,比如KiErrata361Present在一个IDA分析都要半个小时的函数里面调用. 3. 大部分都是微软检测虚拟机的函数 KiErrata704Present: 他长这样: 阅读全文 2021-05-13 huoji 1 条评论
二进制安全C/C++汇编Shellcode一线开发 [2021]基于hypervisor的HIPS架构 从0到1 三 (进入虚拟化方式总结) 这部分是我在2021年的某场信息安全作品赛时候时候所写的。考虑到以后可能这个东西比赛完就没价值了.于是放在这里做备份吧. 阅读全文 2021-05-13 huoji 0 条评论
二进制安全C/C++汇编 [2021]基于虚拟化的HIPS架构 从0到1 二 (SVM部分) 上一章 [基[2021]于hypervisor的HIPS架构 从0到1(VT部分)](https://key08.com/index.php/2021/02/24/915.html "基[2021]于hypervisor的HIPS架构 从0到1(VT部分)") 我们讨论了INTEL的 VT-X的情况,对于AMD的SVM,我们还没有做过多讨论,本篇文章就会继续讨论SVM的情况. 网上关于AMD的资料几乎为0,我希望这篇文章给你带来启发 ## 1.准备工作 首先我们要确保SVM是否是支持的: ![1.png](https://key08.com/usr/uploads/2021/04/2334368837.png) 这是万事开头 阅读全文 2021-04-11 huoji 3 条评论