解压第一题过后,先打开观察有无可用信息;
第一次做这个,serial都不知道是什么.... 就直接点了第三个。
所以先看
serial (难度很低。。。)
然后随便输了个数字,点了过后出现弹框
随后直接将该程序拖入od,查找所有字符串,发现了关键字符串
然后直接在反汇编窗口中跟随,
上方的JNE就是关键跳转,上方的两个Mov推测是call的参数,而这个call对这两个值进行比较,也就是说是个字符串比较的函数。 在这里下断点以后f9运行,随便输入一个字符串。然后....
2222就是我输入的字符串,而下面那个应该就是password了。 然后直接打开输入试了一下。 成功。
接下来重开软件,点第一个按钮
name\serial
同样的套路,瞎输值然后弹出
然后同样根据字符串找到相关汇编代码。而该字符串出现在了不止一个位置,先看第一个位置。
上方跳转只是跳过错误信息,并且根据cmp EAX,4推测是比较字符串长度,大于等于4则跳过错误信息。测试过后证实推测。
来到第二处分支,在关键跳转下断,程序运行到这里后
和之前的serial一样,比较函数之前出现了password。 接下来就分析该字符串是如何生成的。
在往上翻的途中发现了前后的字符串,而并没有发现中间的数字,也就是说数字是由某个算法生成的,再与字符串拼接。
推测算法位于判断字符串长度之后,所以在判断长度那里下了断点,然后F9到断点处,再单步执行下来,到这里第一次看见调用参数(EBP-10所在的地址就是我输入的字符串)
从这里看出把我们输入的字符串从4个字节变成了一个字节也就是获取第一个字符,并乘上了某个数,在内存中去找 乘的数是0x29,乘了过后又自加了一次。
然后查到了2的ASCII码为50,所以用计算器计算出了值
、
。。然后就看到了1004的十进制就为4001. 也就是我们要的password。
到这里也就完事了,这个题的解决方案就是:
1.先判断字符串长度是否大于4,小于4直接弹出错误信息。
2.获取输入字符串的第一位,并用该位的ASCII码乘上0x29再自加一次,最后取这个值得十进制值。
3.最后拼接CW-****-CRACKED
最后用C++写了个算出serial的小程序。
人生中第一道逆向题做完了 贼j8开心