这道题目满分刚好是100分。。。
程序有ASLR,用FFI去掉方便分析。
去掉以后,OD载入,F9运行,给GetWindowTextA下端点,然后输入一个注册码就可以断下。
F8单步回到004026A6处后,CM判断注册码的字节数,如果不是16个字节就返回。
删掉之前设置的所有断点,在004026BE处下一个断点。这样输入16个字节就可以断下了。
然后CM重新计算了注册码的长度,进入算法部分。
这部分算法仅仅将注册码进行了排序,汇编代码如下。
如果用C++语言来表述的话就是如下代码(Data表示用户输入的Key)
最后和1H@Y1S0718760Dm3比较,不相等就失败。
将这段代码的逆运算写出来即可解出注册码。
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char Data[] = "1H@Y1S0718760Dm3";
for(int i = 6;i >= 0;i--)
{
char tmp;
for(int j = 2;j >= 1;j--)
{
char tmp;
tmp = Data[(j + 1) * 4];
Data[(j + 1) * 4] = Data[j * 4];
Data[j * 4] = tmp;
}
tmp = Data[0];
Data[0] = Data[4];
Data[4] = tmp;
tmp = Data[i * 2];
Data[i * 2] = Data[i * 2 + 1];
Data[i * 2 + 1] = tmp;
}
printf("%s\n",Data);
system("pause");
return 0;
}
运行以后得到结果如下:
得到注册码:H1Y@D1708067S1m3
复制到CM中注册,得到结果如下:
全文完。