本文主要是介绍逆向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!!!! 有不足之处请指出!!蟹蟹。
这篇关于逆向ctf-婉若游龙的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!