findFlag.exe
- 这是一道典型的vmp保护的程序
- vmp只是保护了入口函数,并没有启用整个程序的虚拟化
- 解题思路:从关联调用入手
0x1 观察程序
- 首先运行程序,观察程序的特性
程序运行后直接 弹出一个窗口,说明这个程序是使用 vmp保护的
确认后继续,发现程序只是弹出一个提示窗口
继续按回车程序就直接关闭了
行为总结:
- 这个程序并不是传统的 flag检验程序
- 根本没有从用户那里获取输入
- flag应该是在运行时解密到内存中的
0x2 关键点
对程序中唯一出现的字符串flag在哪里
进行查找引用,可以发现只有一个记录
0x3 核心算法
- 将上一步分析得到的关键函数
0000000000401550
,命名为show_msg
函数 - 这是整个程序的核心点
- 仔细分析这个函数,可以得到如下的运算逻辑
0x4 算法总结
程序通过3个mov指令分别将字符串 ltczf\`ke ,字符串 rhl^rh^o 以及字符串 |b 加载到内存中
- 考录到大小端问题,这3个字符串应该是:ek\`fzctl ,o^hr^lhr,b|
- 由于这三个字符串在内存中是连续的,并且程序中也已经指出了代码的长度18
- 因此这三个字符串应该是用来表示一个完整的18字节的字符串ek\`fzctlo^hr^lhrb|
- 核心算法为 字符串的ascii码+1
汇编代码中指出长度为18
flag
- 将字符串ek\`fzctlo^hr^lhrb| 的ascii码表+1就可以获得flag:
flag{dump_is_misc}