Flare2-challenge-04

2023-12-12

文件信息

解压之后使用 DIE 查看文件信息:

可以看到有明显的 UPX 特征码,首先尝试使用其自带的脱壳功能:

程序分析

脱壳之后即是正常的 PE 程序,在虚拟机中运行可以看到与加壳版输出不一致:

由于 UPX 本身自带的 stub 是不会修改原始程序逻辑的,此处可以猜测此程序有修改过脱壳的 stub. 使用 IDA 打开 unpack 版分析输出的 2 + 2 = 5 相关引用:

唯一引用,可以看到 5 是硬编码到程序中的:

修改的 stub 分析

下面要找到 packed 版本中对此地址的操作,使用动态调试 x32dbg 加载 packed 版本,对字符串 5 地址处下硬件访问断点,运行程序,跳过两次无关的地址即可看到:

此处修改下面紧接着就是 OEP 跳转,也验证了确实是在 stub 中修改了原始程序。注意到上面还有一个循环,将内存偏移 0x51BB 处的字符串的前 52 个字符异或 0x20. 此修改的 stub 对原始程序做了如下修改:

Table 1: modify stub logic
offsetinitial valuestub packed value
0x004051B8‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/’‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/’
0x0040524C54

了解了 stub 对程序的修改,接下来对原始程序的后续逻辑分析:

标记 1 处在 packed 后即总为真。标记 2 处程序判断 命令行参数 必须提供一个,否则进入退出逻辑;标记 3 处对此参数调用 atoi 并作为 sub_4012E0 的参数。

sub_4012E0 逻辑(get_crypt_hash)

Solution

得到 md5(argv[1]) 之后,查找此地址的引用,即可看到如下逻辑:

根据动态调试的结果,此逻辑会 比较 md5(argv[1]) 与 md5(index_of_current_hour) ,不相等则进入退出逻辑(相等的分支再没有提前跳出的判断逻辑),传入当前系统时间作为程序参数,即可得到 flag: