-
-
[原创]深入解析VMP3.x_VM-Jcc指令爆破
-
发表于:
2018-9-27 23:59
12221
-
[原创]深入解析VMP3.x_VM-Jcc指令爆破
我们通过一个被VMP3.x_VM保护的CracKme来探索下Vmp3.x_VM的内部,进行深入了解VM指令
(文中有很多VM爆破点)本文只通过修改JCC指令来达到在VM中爆破的目的,在进行本文之前,我们需要简单了解一下JCC指令。
JCC指令它有两个分支,它是通过判断eflag来进行选择走向哪一个分支,同时虚拟机化的(VM)JCC指令最终的走向也是在选择分支。
样本是一个很简单的一句if语句的E语言编写的CrackMe,同时关键代码被VMP3.2.0保护,
Compilation Type为 Ultra(Mutation+Virtualization)
反汇编窗口十六进制搜索 FF55FC5F5E , CC断点位于00418BDD ,运行程序随便输入pass中断。
标准的VM入口
借助xx_vm插件进行分析,(初始化日志,进行分析)看看有没有我们需要的一些信息
停留在这里,
单步F8跟踪,执行到函数尾部。
这个函数应该是在获取我们已经输入的内容,并在累加寄存器 EAX返回
继续单步F8,再次来到一个VM入口,使用插件继续分析。
........................
一段vm代码后,我们到达了一个熟悉的地方,但是比前面相同的地方多了一些有意思的信息,
[sp+4] 是我们当前输入的数值
[sp+8] 看起来貌似是个正确的密码
单步跟踪一下,发现这里是一个字符串比较函数
字符串比较函数到达函数尾部,发现EAX寄存器的值返回FFFFFFFF,考虑到Strcmp的返回值,我们可以把这里暂定为Strcmp函数
走出这个函数,又来到一个VM入口
这里应该是对 Strcmp的返回值进行判断,同时这里的分析成为了我们的重点。
另外根据前面的分析,Strcmp走了两次,获取输入的值的函数也走了两次,我们在这里猜测,第一次是判断输入的数值是否为空,第二次才是真正的判断密码是否正确。(尝试了不输入密码,发现我们的猜测正确)
重新初始化插件日志,这里开始分析。
堆栈窗口,出现了判断我们输入的值是否合法的信息
这里执行到函数尾部,出现了对话框,判断的整个流程执行完毕。
打开我们的日志信息,(Strcmp之后的分析日志内容),Strcmp返回的值是FFFFFFFF,日志文本内搜索FFFFFFFF,发现在Entry之后的第11个pop中找到了这个值。
这里EAX的值被映射到 index=00000004的寄存器中,这些日志文件指令是不是看起来有种茫然的感觉?我们先进行一个基础的概念了解---VM伪代码和真实汇编代码它们不是一一对应的关系,实际上一组伪代码对应一条真实汇编代码。了解了基础概念,我们可以将VM伪代码划分为代码块,划分原则(虚拟栈平衡(PUSH,POP除外)),根据划分原则,我们对日志文件的VM伪代码来进行划分代码块
代码块1
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-9-28 00:03
被xxdisasm编辑
,原因: