本教程是博主解答特定题目的一次特殊经历,但是解答问题的方法和思路是共通的,希望能帮到做逆向的朋友。
一、答案
jZiBUViF0WUYwISp4qjx5YwucMNGpb4g
二、解题步骤
- 查壳。
- 尝试去壳。
- 反反调试。
- 动态调试,输入字符串。
- 找寄存器附近是否有具有flag特征的字符串。(特别是具有循环比较特征的汇编代码)
- 找到后重新运行crackme2.exe,验证字符串是否是flag,若是,结束;若不是,重复第5步。
三、解题工具
查壳工具:ExeInfoPE、Detect It Easy。
脱壳工具:Scylla。
调试工具:IDA Pro、X64dbg。
反反调试插件:ScyllaHide。
四、解题过程
- 使用Exeinfo PE查壳,显示“VMProtect v.3.0x - ver.3.0.0 - 3.5.0”表示有壳,类型为VMP3.0~3.5,但是同时显示“not packed”表示无壳,比较奇怪,用其他工具再验证一下。
- 使用Detect It Easy再次查壳,查明确实有VMProtect加壳,版本在3.2.0~3.5.0之间。
- 尝试使用Scylla去壳,点击dump保存crackme2.exe的dump文件。
- 使用X64dbg动态调试,找到程序的真实OEP。加壳前后RSP寄存器的值应该保持一致,所以程序的入口处的RSP应该与运行到地址0x140340CD3处的RSP保持一致,为0x14FF28。
- 对0x14FF28处地址下4字节的硬件写入断点。
- 重新开始动态调试,每次RSP==0x14FF28时都使用IAT Autosearch,并且Get Imports,如果全部为绿色的对勾,则说明找到了入口,点击Fix Dump使用第3步保存的dump文件修复。
- 由于有9个红叉,没能完全脱壳,程序不能正常运行,但是可以使用IDA Pro查看静态反汇编代码。可以看到代码中的花指令基本消失了。
- 使用ScyllaHide反反调试,将以下文件放入“./Xdbg/ release/x64/plugins/”路径下。
- 重启x64dbg后动态调试crackme2.exe,打开ScyllaHide Options把“kill反附加”和“禁止创建线程”勾上。
- 动态运行到0x140349714处,程序会阻塞,等待控制台输入。
- 输入任意字符串回车,立刻回x64dbg按F7继续调试。(按晚了程序会退出,暂时未找到原因)
- 按F7调试执行到0x4A3813处,此时rbx地址为0x14FDE0。
- 在内存窗口中查看rbx指向的数据,一串字符‘4’后面跟着的字符串具有flag特征。
- 重新运行crackme2.exe,输入第13步中的字符串
jZiBUViF0WUYwISp4qjx5YwucMNGpb4g
五、参考文献
[1] ScyllaHide教程:https://blog.csdn.net/kinghzking/article/details/122070991
[2] 反反调试理论教程:https://bbs.kanxue.com/thread-226455.htm
[3] 反反调试实践教程:https://www.52pojie.cn/thread-1432590-1-1.html
[4] Scylla脱壳实践教程:https://blog.iamli.cc/archives/20