逆向ctf

编程入门 行业动态 更新时间:2024-10-22 15:43:11

逆向<a href=https://www.elefans.com/category/jswz/34/1760780.html style=ctf"/>

逆向ctf

一、题目介绍

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

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

题目资源链接: 
提取码: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

本文发布于:2024-03-23 23:54:29,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1744339.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:ctf

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!