本帖最后由 ZJevon 于 2021-8-7 23:30 编辑
CrackMe原帖https://www.52pojie.cn/thread-1490003-1-1.html
0x00 易语言部分
打开是个易语言窗口,先用按钮事件找到关键函数(FF 55 FC 5F 5E)
对于易语言用E-Debug 来分析是比较方便的,可以分析出大部分易语言特征函数。
整个易语言主要的操作就是:取当前目录 -> 把key.txt 和 CM.exe 写到文件。
剩下的事情就和易语言没有关系了,主要分析CM.exe。
0x01 CM.exe部分
加了upx壳,简单脱掉。记得关闭ASLR好分析一点
打开之后整个流程都很清晰,结合动调可以知道就是,程序前半部分就是为了后续进入自写VM做准备:开辟vm_opcode, vm_stack 和vm_reg 的存储空间,设置wm_reg的值。
有个有意思的点,这里创建了一个全是int3的线程想要影响我们动态调试。
进入VM函数后可以看到整个函数非常的大,这个就是核心部分了。switch-case对应的就是opcode以及功能。
这个时候光静态分析是很痛苦的,所以我们就结合x32dbg来分析一下opcode对应的功能。先到第一个dispatch,记得在转储中跟随wm_opcode ,wm_reg和 wm_stack。
0x02 自写WM解题思路
按照最常规的思路就是先分析出对应case所模拟的功能,然后写脚本去还原。由于本体说可以追码解决,我就只分析了一点wm函数。例如:
本题我抄了近路,观察wm_opcode区域,发现类似导入表的区域,这个其实是获取功能函数和最终比较的字符串。
在`BQGJMBO和wm_exit的区域下断点,运行可以看到key.txt的内容已经读到内存中了。
再次运行就到了退出的地方,猜测是按位检测的,查看wm_reg内容发现我们输入的和一个字符。猜测这个C就是第一个原始字符。
所以现在知道第一个为C,以及对应的加密字符串为`,用CyberChef来分析前后加密内容,发现异或了#,并且通过跟踪wm流可以发现push #,怀疑都是按照这个加密的。
修改key.txt第一个字符为C,就会发现到结束的地方wm_reg内容变了。用CyberChef验证猜想。
最后我们就可以直接解出key了
0x03 总结
因为加密方式比较容易所以解出整个题目是不难的,如果变换了加密方式,我们最好还是按照规律用脚本还原对应的opcode。自写VM的整个模板化是比较规整的,值得拿来学习。
|