西湖论剑 EasyVT 复现
前置知识
通过查资料了解一些 VT 知识点,以及相关退出指令以及常量即可
其实整个题和 VT 关系不是很大,只是借助了 VT 来将对应加密的流程分为了 4 个部分来进行检测
学习参考链接
VT虚拟化技术笔记(part 4)- smallzhong_
逆向分析
拿到题目后我们可以发现有两个东西,一个exe文件和一个sys文件,将exe拖入IDA进行分析可以看到其明显的VM标识,同时观察到输入32字节,分四组,每组 8 字节。从 Vmxon 开始到 Vmoff 结束,每条 vm 指令都会发起一次 VmExit 进入 Host 进行对应的处理。若四次均校验通过则为 flag
结合题目信息我们可以很容易想到VT相关知识点,同时能猜测出sys文件为对应的驱动,我们将sys拖入到IDA进行分析
可以确定其驱动的属性,在整个驱动中其实大部分东西都没什么用,就是最最简单基本的VT配置,在 SetupVMCS 函数(sub_402240)中主要关注 HOST_RIP 的设置。这个域设置 VMMEntryPoint(sub_401C10),也就是当 VmExit 发生时,会先进入到这个位置,做状态的保存恢复和 VM 处理函数的 Dispatch 分发。
对于VM事件的核心分发函数在 sub_401C90 中,并根据宏可以还原出符号
对于宏常量定义可以参考vtsystem.h
之后我们便需要根据ring3下的程序的汇编来观察对应的执行过程,可以看出每组输入经过的Host处理流程都是一样的,Vmxon -> Vmclear -> Vmptrld -> Vmwrite -> Vmlaunch -> Vmread -> Vmcall -> Vmptrst -> Vmresume -> Vmoff,总共10步。然后再去分析驱动程序,可以知道vmxon~vmread 在读取配置数据,vmcall~vmresume在处理加密,vmxoff判断运算结果。
整理出的逻辑大致如下:
1 |
|
对于每次的调用过程我们可以发现会对 RC4 以及 TEA 加密的 Key 以及 Delta 进行重新赋值,我们只需要保留最后变换即可,其余的可以忽略。
脚本解密
对于上述过程先执行的 RC4 再执行的 TEA ,我们解密时先对 TEA 进行解密,之后在对 RC4 进行解密即可,需要注意的是在 step 8 处交换了数据顺序,在将 TEA 解密出来的数据丢到 RC4 解密脚本前需要对其进行两两交换
TEA 解密
1 |
|
RC4 解密
1 |
|
Flag
1 |
|