CrackMe160学习记录1 Acid burn
本帖最后由 宇宙第一魔王 于 2022-4-6 02:25 编辑# 1 Acid burn
## 1.前期信息探查:
### EXEinfo:
### 运行一下:
首先会弹出一个弹框:
确定后就进入了主界面:
先看左边的用户名和密码模块,进去看一下:
尝试随便输一些东西:
然后是右边的序列号验证:
## 2.动态调试:
先分析右边的序列号(因为这个简单一点)
### 序列号验证功能:
当序列号输入错误时,会弹出一个对话框:”Try Again!!“
所以第一个想到的就是搜索参考字符串:
这里发现有两处”Try Again!!“,这让我有点异或,这里选择先跟过去看看有哪些地址引用了它:
我在两处都下了断点然后运行程序想看一下程序会停在那个地方,但可惜的是它哪都没停,之后我在下面找到了
我个人猜测这应该是识别错了,我转用x32dbg,就可以正常的的操作了。
可以看到验证序列号的字符串是第一个有两个感叹号的字符串,双击跟过去:
这部分的代码大概意思如下:42F4D0处的代码利用call跳转到序列号的判断函数,参数有两个分别在42F4CA,42F4CD处压栈保存,判断结果在标志寄存器里面,然后在42F4D5处jne(当ZF标志为0时跳转)对标志寄存器进行判断,也就是说这里判断返回的结果是否为0,为0,ZF置一,跳转至42F4F1处输出“Try Again!!”,结果为1,则输出"God Job dude !!”。
在42F4D0处下断点然后运行,选择Serial窗口,然后输入就以默认输入,之后直接F9,可以发现:
程序停在42F4D0处时,就可以看到调用函数验证时的两个实参的值了,第一个为我们自己输入的内容,另外一个就是真正的序列号字符串”Hello Dude!“
### 用户名密码功能:
根据之前收集到的信息得知用户名密码输错会报一个字符串”Sorry,The serial is incorect!“
还是一样直接搜索字符串,通过错误跳转处看引用其的条件跳转语句:
在42FAFE处下断点,然后进入程序的Serial/Name功能,随便输入一些东西
Check it后再看调试界面就能看到Serial了。
但这里不像之前的操作那么容易,一般既要输入用户名又要输入密码的话,密码可能是通过用户名计算的,这里尝试一下别的用户名
这两张图就说明了,这个序列好并不是固定的,而是通过用户名来计算的,而且这里还有个问题需要注意,下面这张图的用户名”hahaha“和之前的拿到Serial的用户名也不同少输入了一个ha,这里推测,Serial的值是根据用户名的前几位来计算的,下面主要分析42F4D0上方的汇编代码
但是粗略看了一下上面的代码量,果断先用ida分析一下算法
用ida可以看到,其实上面很多函数多引用了name里的参数,但是都没用到
回到汇编代码分析关键的几个点:
- 判断串长是否大于等于4
- 对name的第一个字符进行运算:
- 生成序列号进行比较:
## 3.写注册机:
之前我们确定了序列号的验证流程,用户名要求长度大于等于4,然后取出用户名的第一个字符,将它的Ascii码值与0x29相乘,然后乘以2,再将结果转成字符串,最后拼接成”CW- 结果-CEACKED“
```c
#include"stdio.h"
#include"stdlib.h"
int main()
{
char str1 = "";
char serialc = "";
int fc_str1,seriali;
puts("Please Input Your Name:");
scanf("%s", str1);
fc_str1 = str1;
seriali = fc_str1 * 0x29 * 2;
itoa(seriali,serialc,10);
printf("CW-%s-CEACKED",serialc);
return 0;
}
```
编译运行后搞一搞:
学习了学习了 第一次写,动态调试还是不熟练,要是有什么问题还请指正 介是嘛呀 厉害 顶,lz持续更新嘛 Grav1ty 发表于 2022-3-24 14:50
顶,lz持续更新嘛
会的,今天就会更新 课件里的软件链接呢? nayiye00 发表于 2022-3-24 18:50
课件里的软件链接呢?
我是按照这个师傅的帖子学的:
https://www.52pojie.cn/thread-709699-1-1.html 大神呀。厉害的哥
页:
[1]