ZJevon 发表于 2021-8-7 23:27

记一道自写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的整个模板化是比较规整的,值得拿来学习。

ZJevon 发表于 2021-8-7 23:39

zbnysjwsnd8 发表于 2021-8-7 23:39
这个CyberChef能分享下吗

https://gchq.github.io/CyberChef/ 这个网址

ZJevon 发表于 2021-8-8 00:03

搜索曾经的回忆 发表于 2021-8-8 00:02
nextOpcode是干啥的

当时想的是移动wm_eip 读取下一条指令码

ZJevon 发表于 2021-8-7 23:28

@zbnysjwsnd8 CrackMe原作者

zbnysjwsnd8 发表于 2021-8-7 23:39

这个CyberChef能分享下吗

搜索曾经的回忆 发表于 2021-8-8 00:02

nextOpcode是干啥的

longyou12345 发表于 2021-8-8 00:02

好家伙,真不错

搜索曾经的回忆 发表于 2021-8-8 00:17

ZJevon 发表于 2021-8-8 00:03
当时想的是移动wm_eip 读取下一条指令码

没搞明白,我感觉不像

geekchina 发表于 2021-8-8 08:09

很好的解题思路,谢谢分享

jy04468108 发表于 2021-8-9 08:45

托克之后15kb的文件里面居然还带了vm。真是可以的!
页: [1] 2
查看完整版本: 记一道自写VM的CrackMe WriteUp