逆向ctf-婉若游龙

一、题目介绍

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

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

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

二、解题过程

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

可以看出软件有两个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进行查壳:

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

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

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

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

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

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

三、算法原理

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

  lenn=strlen(name);
          for(i=0;i<lenn;i++)
          {
                  tm=name[i];
                  tm%=10;
                  tm^=i;
                  tm+=2;
                 
                  if(tm>=10)
                  {
                          tm-=10;
                  }
                  hname[i]=tm;
          }

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

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

四、注册机代码

#include<stdio.h>
  #include<string.h>
  
  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<lenn;i++)
          {
                  tm=name[i];
                  tm%=10;
                  tm^=i;
                  tm+=2;
                 
                  if(tm>=10)
                  {
                          tm-=10;
                  }
                  hname[i]=tm;
          }
          printf("注册码:");
          for(i=0;i<lenn;i++)
          {
  
                  printf("%c",(hname[i]+70));
          }
          printf("\n");
          system("pause");
  }

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值