-
-
[原创]叹息之墙分析
-
发表于:
2018-9-30 04:51
7440
-
做完我真的叹息了。
0x1:
控制流平坦化虽然可怕,但是找到几个关键的代码块即可完成分析。
代码块1:
0xF0FE40就是你输入的序列号对应的数组
F0F000是个大小为350的常量数组,
这个代码块就是把你输入的序列号对应的常量挨个加起来,注意虽然常量是DWORD类型,加的时候是QWORD类型,
逻辑如下
接着看第二个块
前面把序列号算出来的KEY放到了parm+8的地方,大小是8
前面8个字节是个常量,
把这2个qword的变量当作参数传给 00E71020 函数,然后判断返回值是不是 6E616B34
如果是 6E616B34 ,程序就验证成功了。我们接着看 00E71020 是个什么函数 ,不难发现,其实这就是一个
pow函数,不过参数都是qword,为什么返回了个dword呢,有诡异,接着看
原来问题在这,看到了吗,__aullrem是qword下的取余操作,原来程序为了能返回成一个dword,加了一次结果的取余操作。
那么我们知道了程序求的是
0x65757832 ^ key = 0x6E616B34 ,且pow会发生取余截断,那么我们需要算出key是多少,代码如下
很快,就得出了一批结果
拿到这些key后,我们可以先放到一遍,
现在的问题是,怎么样从常量表里面找到k(k <= 9)个数,使其满足和等于我们刚刚算的KEY呢。
一开始我以为这是ksum问题,于是从2-9计算了一遍,到了k = 7的时候就明显慢的不行了。
这样解答肯定是有问题的,于是研究下那个常量数组,排下序,看下有没有什么规律。
看到前面几个数好像是按着15825810递增的,
后来发现,有一些数不是
15825810递增 的,
比如
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2018-9-30 04:55
被xiaofu编辑
,原因: