zbnysjwsnd8 发表于 2017-11-2 22:18

SWPU RE类第二题WP

本帖最后由 zbnysjwsnd8 于 2017-11-2 22:25 编辑

这道题目满分刚好是100分。。。
程序有ASLR,用FFI去掉方便分析。
![这里写图片描述](http://img.blog.csdn.net/20171102220145936?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTk0NTk4NTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
去掉以后,OD载入,F9运行,给GetWindowTextA下端点,然后输入一个注册码就可以断下。
![这里写图片描述](http://img.blog.csdn.net/20171102220326386?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTk0NTk4NTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
F8单步回到004026A6处后,CM判断注册码的字节数,如果不是16个字节就返回。
![这里写图片描述](http://img.blog.csdn.net/20171102220502941?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTk0NTk4NTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
删掉之前设置的所有断点,在004026BE处下一个断点。这样输入16个字节就可以断下了。
然后CM重新计算了注册码的长度,进入算法部分。
![这里写图片描述](http://img.blog.csdn.net/20171102220851820?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTk0NTk4NTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这部分算法仅仅将注册码进行了排序,汇编代码如下。
![这里写图片描述](http://img.blog.csdn.net/20171102222405690?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTk0NTk4NTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
如果用C++语言来表述的话就是如下代码(Data表示用户输入的Key)
![这里写图片描述](http://img.blog.csdn.net/20171102220938898?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTk0NTk4NTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
最后和1H@Y1S0718760Dm3比较,不相等就失败。
![这里写图片描述](http://img.blog.csdn.net/20171102221016278?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTk0NTk4NTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
将这段代码的逆运算写出来即可解出注册码。
代码如下:

```
#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;
                        Data = tmp;
                }
                tmp = Data;
                Data = Data;
                Data = tmp;
                tmp = Data;
                Data = Data;
                Data = tmp;
      }
      printf("%s\n",Data);
      system("pause");
      return 0;               
}
```
运行以后得到结果如下:
![这里写图片描述](http://img.blog.csdn.net/20171102221118259?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTk0NTk4NTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
得到注册码:H1Y@D1708067S1m3
复制到CM中注册,得到结果如下:
![这里写图片描述](http://img.blog.csdn.net/20171102221938199?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTk0NTk4NTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
全文完。

吾爱豆腐渣 发表于 2017-11-2 22:22

用力顶!!

whklhh 发表于 2017-11-2 22:35

{:301_1009:}比赛还没结束呢……

siaolxh 发表于 2017-11-3 00:18

比赛还没结束,楼主不要着急啊。{:301_1008:}

x518255 发表于 2017-11-3 08:48

大佬,我们比赛还没结束呢,能先别急着发出来好吗?

gunxsword 发表于 2017-11-3 20:59

这是哪办的比赛啊,网址是?

晓我琴宝贝 发表于 2017-11-4 10:15

大佬比赛还没完,发一个300上上分呀

Fa1c0n 发表于 2017-11-4 17:30

嗯?遇见一只大佬。。。

Leo. 发表于 2017-11-27 19:08

哈哈 厉害

sankya 发表于 2017-12-17 10:01

6666{:1_919:}
页: [1]
查看完整版本: SWPU RE类第二题WP