虚拟机vm混淆-WxyVm1解题

虚拟机vm混淆基础-WxyVm1解题

将程序的代码转换自定义的操作码(opcode),然后在程序执行时再通过解释这些操作码,选择对应的函数执行,从而实现程序原有的功能。
虚拟机vm混淆-WxyVm1解题_第1张图片
执行流程:

在start完成虚拟机环境的初始化->读取可执行代码相对应的字节码->传到Dispatcher(调度器)->dispatcher根据接受到的bytecode选择handler进行执行,实现某个操作。
当handle执行完后会跳回这里,形成一个循环。

主函数反汇编:
逆向分析,要使最中国结果correct,v4必须不为0,则数组byte_604B80长度必须为24,数组byte_604B80偏移i位地址的值必须与数组dword_601060[i] 地址值相同。所以关键函数一定为sub_4005B6();对数组做了某些操作。
虚拟机vm混淆-WxyVm1解题_第2张图片
进入关键函数:
可对应原理图中start,dispatcher,handler及其函数执行流程。
虚拟机vm混淆-WxyVm1解题_第3张图片
反汇编如下:
虚拟机vm混淆-WxyVm1解题_第4张图片
查看地址,位于数据段且其中存储有数据,
虚拟机vm混淆-WxyVm1解题_第5张图片
可以看出,对byte_604B80值有影响的是v3的值,v0决定v3如何影响byte_604B80值,result决定操作输入的是byte_604B80数组的哪一位,result是偏移,而此偏移对应的是数组byte_6010C0[i + 1]位的值。
i每一个累加,取数组byte_6010C0[i + 1]位的值作为偏移,再由数组byte_604B80加上此偏移后对应地址的值与v3做运算得到新值,从而实现对数组byte_604B80的更新。其中, v0 =是数组byte_6010C0[i]地址的值,v3 是数组 byte_6010C0[i + 2]地址的值。

知晓程序执行流程后,我们明白,计算是通过在byte_6010C0的数据进行计算的,直接通过idapython取到相应地址的值进行计算。脚本如下

 str_list=[4294967236,52,34,4294967217,4294967251,17,4294967191,7,4294967259,55,4294967236,6,29,4294967292,91,4294967277,4294967192,4294967263,4294967188,4294967256,4294967219,4294967172,4294967244,8]
 addr = 0x6010C0
 for i in range(14997,-1,-3):
v0 = Byte(addr+i)
v3 = Byte(addr+i+2)
result = Byte(addr + i + 1) 
if v0 == 1:
    str_list[result] -= v3
if v0 == 2:
    str_list[result] += v3
if v0 == 3:
    str_list[result] ^=v3
    for i in range(len(str_list)):
str_list[i] &= 0xff         # 防溢出
print(''.join(map(chr, str_list)))

具体知识详解请看博客
CTF逆向专题连载之虚拟机vm混淆
https://mp.weixin.qq.com/s/VQyFOkW7GQMZyImZbAxdjg

你可能感兴趣的:(虚拟机vm混淆-WxyVm1解题)