二进制安全C/C++ [2022]hypervisor一个麻烦: Time Stamp Counter ### Time Stamp Counter 时间戳计数器( TSC ) 是一个 64 位寄存器,存在于自Pentium以来的所有x86处理器上.它计算自复位以来的 CPU周期数.该指令返回 EDX:EAX 中的 TSC.在x86-64模式下,还会清除RAX和RDX的高32位. ### 特性 对CPU执行的时间高度敏感 大部分GUI、网络设备依赖它用于计数从而实现一些功能 包括ETW也有可选项使用它计数 ### 问题 一个对CPU执行时间高度敏感、而且不容易篡改的东西,最容易拿来干啥? 检测CPU的周期,用于探测hypervisor是否存在 这是一个简单的例子: 阅读全文 2022-07-19 huoji 0 条评论
系统安全C/C++一线开发 [2022]hypervisor: 检测与预防(三) copy paster们久等了 书接上回,前情回顾.如果没有看过请浏览: [[2022]hypervisor: 检测与预防 (一)](https://key08.com/index.php/2022/05/12/1477.html "[2022] hypervisor: 检测与预防 (一)") [[2022]hypervisor: 检测与预防 (二)](https://key08.com/index.php/2022/06/19/1489.html "[2022]hypervisor: 检测与预防 (二)") ### KiErrata671Present 阅读全文 2022-07-10 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手册,内存有以下的类型:  MTRR机制允许多达96个内存范围(memory ranges)在物理内存的定义,它定义了一系列的MSRs,这些寄存器分别去说明MSR定义中包含的那段内存的具体类型 ## MMU 现在的计算机基本上都带了一个叫做MMU(memory management unit)的东西,这个东西你可以理解为内存管理机制(虽然有点偏离意思),他主要负责内存访问、读写权限控制、虚拟地址到物理地址转换。 **请注意这里有个小知识点,虚拟内存的块我们叫做页(page),而物理内存的块我们叫做帧(frame)** intel把虚拟内存分为一个一个4KB的页面(可以是其他大小),物理内存分为一个一个4KB的帧,之后在此基础上设置了TLB机制(后备缓冲区,简单理解为是一种CPU缓存就行) 物理与虚拟地址转换图:  如果你还是不理解物理地址与虚拟地址这些的关系,可以参考一下大学课本《计算机组成原理》这本书,里面有详细的介绍 ## 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体系下调用的方式  可以看到,最终RIP的值会等与MSR_LSTAR相等,而在微软体系里,MSR_LSTAR存放着kisystemcall64的函数地址 因此,我们需要hook这个msr_star 阅读全文 2021-05-25 huoji 1 条评论
二进制安全C/C++汇编一线开发Shellcode [2021]基于hypervisor的HIPS架构 从0到1 三 (进入虚拟化方式总结) 这部分是我在2021年的某场信息安全作品赛时候时候所写的。考虑到以后可能这个东西比赛完就没价值了.于是放在这里做备份吧. 阅读全文 2021-05-13 huoji 0 条评论