findFlag.exe

  1. 这是一道典型的vmp保护的程序
  2. vmp只是保护了入口函数,并没有启用整个程序的虚拟化
  3. 解题思路:从关联调用入手

0x1 观察程序

  • 首先运行程序,观察程序的特性

程序运行后直接 弹出一个窗口,说明这个程序是使用 vmp保护的

image-20200908120224276.png

确认后继续,发现程序只是弹出一个提示窗口

image-20200908120354811.png

继续按回车程序就直接关闭了

行为总结:

  1. 这个程序并不是传统的 flag检验程序
  2. 根本没有从用户那里获取输入
  3. flag应该是在运行时解密到内存中的

0x2 关键点

对程序中唯一出现的字符串flag在哪里进行查找引用,可以发现只有一个记录

image-20200908135207786.png

0x3 核心算法

  1. 将上一步分析得到的关键函数0000000000401550,命名为show_msg函数
  2. 这是整个程序的核心点
  3. 仔细分析这个函数,可以得到如下的运算逻辑

image-20200908140341605.png

0x4 算法总结

  1. 程序通过3个mov指令分别将字符串 ltczf\`ke ,字符串 rhl^rh^o 以及字符串 |b 加载到内存中

    1. 考录到大小端问题,这3个字符串应该是:ek\`fzctl ,o^hr^lhr,b|
    2. 由于这三个字符串在内存中是连续的,并且程序中也已经指出了代码的长度18
    3. 因此这三个字符串应该是用来表示一个完整的18字节的字符串ek\`fzctlo^hr^lhrb|
  2. 核心算法为 字符串的ascii码+1

汇编代码中指出长度为18

image-20200908142353727.png

flag

  • 将字符串ek\`fzctlo^hr^lhrb| 的ascii码表+1就可以获得flag:
  • flag{dump_is_misc}
Last modification:September 8, 2020
如果觉得我的文章对你有用,请随意赞赏