逆向ctf-婉若游龙

一、题目介绍

题目来源于看雪论坛CTF题库->题目要求为:

        本题Flag值为CTFHUB用户的序列号。

题目资源链接:https://pan.baidu.com/s/16ySHvatanvHf07t71sECJQ 
提取码:0id0 

二、解题过程

先将得到的程序运行起来康康:

逆向ctf-婉若游龙_第1张图片

可以看出软件有两个button,一个为Check Hardcoded,一个为Name/Serial Check。尝试输入并点按钮在Hard Coded中输入admin结果显示为please try again,在name中输入abcdefg,Serial中输入123456点击下方按钮效果为please try again,不输入name提示please enter your serial number。从这里可以看出大概的意思了,注册该软件可以输入hard coded注册也可以输入name和serial注册。

老规矩既然是exe文件先上工具exeinfope进行查壳:

逆向ctf-婉若游龙_第2张图片

检查结果表示软件没有加壳,直接上OD进行动态分析,进入OD后程序到达程序入口OEP处,根据之前对运行软件的操作,可以用字符定位到想要的代码。操作为鼠标右键-》中文搜索引擎-》智能搜索结果如下:

逆向ctf-婉若游龙_第3张图片

找到想要的字符串,双击进入定位到:

逆向ctf-婉若游龙_第4张图片

这里可以发现程序调用了两个MessageBoxA函数,一个显示成功注册信息一个显示失败注册信息。继续往上面找找看看什么地方进行跳转,条件如何:

逆向ctf-婉若游龙_第5张图片

jnz short 004016E2命令 进行判断eax和ecx,条件不满足就跳转注册失败。反之,条件满足就往下执行进入注册成功界面。哦哦哦!!原来是这样,那么就去找做对比的条件从哪里来的呢?继续往上看,发现:

逆向ctf-婉若游龙_第6张图片

哟西!!!原来是调用了两个GetWindowTextA函数进行获取信息,并且分别将获取的信息存入对应内存中。好的继续往下看看。

逆向ctf-婉若游龙_第7张图片

逆向ctf-婉若游龙_第8张图片

逆向ctf-婉若游龙_第9张图片

代码解释如图所示,也可在算法原理中看看。

三、算法原理

账号部分:将帐号name的每个字符取出,经过除10取余,和字符位数相异或,再加2的计算处理后存到内存中去(也就是edi中),相关c语言可以表示为:

  lenn=strlen(name);
          for(i=0;i=10)
                  {
                          tm-=10;
                  }
                  hname[i]=tm;
          }

Serial部分:计算比较简单,就是serial的每个字符ascii码除于10的余数存到内存中。对应c语言表示和上面类似。

注册成功的条件就是将存入两部分内存中的对应数进行比较,必须每一位都相同则成功注册,反之一位不同就失败。

四、注册机代码

#include
  #include
  
  main()
  {
          char name[19]="";
          char serial[19];
          char hname[19];
          char hserial[19];
          int lenn;
          int lens;
          char ch;
          int tm;
          int i=0;
  
          printf("输入帐号:");
          scanf("%s",name);
          printf("\n");
  
          lenn=strlen(name);
          for(i=0;i=10)
                  {
                          tm-=10;
                  }
                  hname[i]=tm;
          }
          printf("注册码:");
          for(i=0;i

OVER!!!!  有不足之处请指出!!蟹蟹。

你可能感兴趣的:(Re)