记一道自写VM的CrackMe WriteUp
本帖最后由 ZJevon 于 2021-8-7 23:30 编辑CrackMe原帖https://www.52pojie.cn/thread-1490003-1-1.html
## 0x00 易语言部分
打开是个易语言窗口,先用按钮事件找到关键函数(FF 55 FC 5F 5E)
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807215916.png)
对于易语言用E-Debug 来分析是比较方便的,可以分析出大部分易语言特征函数。
整个易语言主要的操作就是:取当前目录 ->把key.txt 和 CM.exe 写到文件。
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807220946.png)
剩下的事情就和易语言没有关系了,主要分析CM.exe。
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807221156.png)
## 0x01 CM.exe部分
加了upx壳,简单脱掉。记得关闭ASLR好分析一点
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807224443.png)
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807221334.png)
打开之后整个流程都很清晰,结合动调可以知道就是,程序前半部分就是为了后续进入自写VM做准备:开辟vm_opcode, vm_stack 和vm_reg 的存储空间,设置wm_reg的值。
有个有意思的点,这里创建了一个全是int3的线程想要影响我们动态调试。
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807221736.png)
进入VM函数后可以看到整个函数非常的大,这个就是核心部分了。switch-case对应的就是opcode以及功能。
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807221902.png)
这个时候光静态分析是很痛苦的,所以我们就结合x32dbg来分析一下opcode对应的功能。先到第一个dispatch,记得在转储中跟随wm_opcode ,wm_reg和 wm_stack。
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807231149.png)
## 0x02 自写WM解题思路
按照最常规的思路就是先分析出对应case所模拟的功能,然后写脚本去还原。由于本体说可以追码解决,我就只分析了一点wm函数。例如:
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807223232.png)!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807223218.png)!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807223437.png)
本题我抄了近路,观察wm_opcode区域,发现类似导入表的区域,这个其实是获取功能函数和最终比较的字符串。
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807223520.png)
在`BQGJMBO和wm_exit的区域下断点,运行可以看到key.txt的内容已经读到内存中了。
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807231312.png)
再次运行就到了退出的地方,猜测是按位检测的,查看wm_reg内容发现我们输入的和一个字符。猜测这个C就是第一个原始字符。
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807231422.png)
所以现在知道第一个为C,以及对应的加密字符串为`,用CyberChef来分析前后加密内容,发现异或了#,并且通过跟踪wm流可以发现push #,怀疑都是按照这个加密的。
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807231840.png)
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807231923.png)
修改key.txt第一个字符为C,就会发现到结束的地方wm_reg内容变了。用CyberChef验证猜想。
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807231642.png)
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807232133.png)
最后我们就可以直接解出key了
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807232336.png)
!(https://gitee.com/jev0n/blogimage/raw/master/img/20210807232325.png)
## 0x03 总结
因为加密方式比较容易所以解出整个题目是不难的,如果变换了加密方式,我们最好还是按照规律用脚本还原对应的opcode。自写VM的整个模板化是比较规整的,值得拿来学习。 zbnysjwsnd8 发表于 2021-8-7 23:39
这个CyberChef能分享下吗
https://gchq.github.io/CyberChef/ 这个网址 搜索曾经的回忆 发表于 2021-8-8 00:02
nextOpcode是干啥的
当时想的是移动wm_eip 读取下一条指令码 @zbnysjwsnd8 CrackMe原作者 这个CyberChef能分享下吗 nextOpcode是干啥的 好家伙,真不错 ZJevon 发表于 2021-8-8 00:03
当时想的是移动wm_eip 读取下一条指令码
没搞明白,我感觉不像 很好的解题思路,谢谢分享 托克之后15kb的文件里面居然还带了vm。真是可以的!
页:
[1]
2