Loading... > HCTF-spiral 和 XNUCA damnV 虚拟化逆向writeup --- # spiral ## 用户层 输入分为两部分进行处理,用户层处理第一部分,就是一个简单的逆向算法,直接写脚本就行了。 ![[Snipaste_2020-10-05_16-41-57.png]] 需要注意的是加载驱动的操作和写入第二部分的地址。 程序将输入的第二部分写入驱动的数据段中,因为对齐方式不一样,所以这里有一个 FOA 和 RVA 的转换。 ![[Snipaste_2020-10-05_16-49-56.png]] 所以数据段加载到内存中的 VA 是 0x5000,然后可以定位到用户层传入内核层的数据。 ![[Snipaste_2020-10-05_16-54-33.png]] 修改注册表启动驱动程序,参考[ZwLoadDriver加载驱动](https://blog.csdn.net/machack/article/details/6781075) ==**NtLoadDrver 调用 LdrLoadDriver ,LdrLoadDriver 需要先加载模块文件,通过 imgae 路径,找到 IO 管理器,调用驱动程序的 EntryPoint 函数,即通常情况下的 DriverEntry 函数。**== ## 内核层 ![[Snipaste_2020-10-05_17-08-45.png]] ### IRP 通信 在开发 Windows 程序的时候,消息被封装成一个结构体:MSG,在内核开发时,消息被封装成另外一个结构体:IRP。在 Windows 程序中,能够接收消息的只能是 Windows 对象,在内核中,能够接收 IRP 消息的只能是设备对象。 当应用层通过 CreateFile,ReadFile,WriteFile,CloseHandle 等函数打开、从设备读取数据、向设备写入数据、关闭设备的时候,会使操作系统产生IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_CLOSE等不同的 IRP 。在 DRIVER_OBJECT 函数最后一个数组中,派遣函数的种类及其有限(由 IRP 消息类型限制),一共有 28 种。 [IRP Major Function Codes](https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/irp-major-function-codes) [Windows中0环与3环通信(常规方式)](https://www.cnblogs.com/onetrainee/p/11681335.html) 只对设备创建、设备关闭、驱动卸载进行简单处理。 ### 进入 VT 开始进入 VT ,首先进行检测是否能开启 VT 。 ![[Snipaste_2020-11-18_20-08-17.png]] 在这个里面主要通过 cpuid 以及读取 CR0、CR4 的标志位来判断 VT 是否支持,是否已经开启,是否占用等等。 ![[Snipaste_2020-11-18_20-11-34.png]] 接下来要分配 VMXON 和 VMCS 的内存。 ![[Snipaste_2020-12-04_17-25-01.png]] 根据 SDM,下面使用 MSR_IA32_VMX_BASIC 填充,同时设置 CR4 的 VMX 开启,执行 VMXON,标志着虚拟机开启,进入 VMX 模式。 ![[Snipaste_2020-11-18_20-13-08.png]] 当然虚拟机只是开机,没有启动,在启动前需要设置 VMCS 和其他环境。这里他是将程序的代码也设置成 guest 的执行代码。 ![[Snipaste_2020-11-18_20-13-30.png]] 而 host 的执行代码则是通过设置 VMCS 来确定,同样也是程序的执行代码。 ![[Snipaste_2020-11-18_20-14-09.png]] 核心逻辑在于 host 对 guest 中的vm-exit进行处理。 ![[Snipaste_2020-11-18_20-14-27.png]] - ida 反编译不可信 - sxe ld Spiral_core.sys - vmlauch和vmresume之后的代码是执行不到的 - virtualkd对vt有影响 - 没有 EPT # damnV 初始化基本环境 ![[Snipaste_2020-12-04_10-34-47.png]] 初始化寄存器 ![[Snipaste_2020-12-04_10-48-06.png]] guest 执行的代码 ![[Snipaste_2020-12-04_10-44-35.png]] KVM_EXIT_HLT 的处理过程 ![[Snipaste_2020-12-04_10-55-54.png]] 当然最后还有一点问题没解决 1. kvm在x64模拟x86的问题 2. kvm版本对hlt的处理问题 3. kvm的debug模式处理问题 4. kvm陷入的问题 5. kvm对amd指令处理的问题 # 其他参考资料 [**简要分析Windows驱动加载**](https://blog.csdn.net/faithzzf/article/details/51388074) [**驱动入门**](https://www.cnblogs.com/zhuyp1015/archive/2012/03/14/2396560.html) [编程实现加载驱动](https://www.cnblogs.com/hanhandaren/p/11351711.html) [创建IRP实现驱动之间通讯](https://blog.csdn.net/wsgxiaomianao/article/details/34413619) [**HCTF 2018 Writeup -- Whitzard**](https://xz.aliyun.com/t/3242) [Flare-On 5 CTF WriteUp (Part 7)](https://blog.attify.com/flare-on-5-writeup-part7/) [VT技术入门](https://space.bilibili.com/37877654/channel/detail?cid=70349) [**如何进入VMX(Intel)**](https://blog.csdn.net/sgzwiz/article/details/20747511) [VT系列:退出事件系统构建(VMMEntryPoint)](https://blog.csdn.net/zhuhuibeishadiao/article/details/52470491) [VT入门---- 闭门造VT](https://bbs.pediy.com/thread-144656.htm) [Anti-VM之CPUID指令](https://consen.github.io/2016/09/11/Anti-VM-via-CPUID/) [x86 architecture CPUID](https://www.sandpile.org/x86/cpuid.htm#level_4000_0000h) ``` ``` Last modification:January 16th, 2021 at 12:41 pm © 允许规范转载 Support 确定不打赏一下支持博主吗 ×Close Appreciate the author Sweeping payments Pay by AliPay