前言
160个CrackMe题目量较大,而且有些CM逻辑重复度较高,因此挑选一些比较有价值的题目做一下以提高本🥦(菜)的逆向水平。
0x01 Acid burn
在x64dbg里查找字符串找到相关的错误提示,找到相关调用地址,在附近找到疑似关键跳转的部分下断:
今年的腾讯游戏安全竞赛就要开始了,但是我对游戏安全这个方向还不太熟悉,因此找了去年的题目来做赛前练习
题目一打开长这样:
赛题说明:
1 | 1.username与regcode是一一对应的关系,填入正确的username和regcode点击Go按钮出现注册成功提示。 |
可以看出这是一个CrackMe
程序,开始分析。
上图为一神器,可直接通过可视化界面获取到MFC组件的响应函数,神器链接。
如果不使用上面的神器的话,此程序是一个MFC程序,获取输入框的方式有两种GetDlgItem
和GetWindowText
,查看这两个函数的调用,发现在sub_4026F0
中有多处对GetDlgItem
的调用,因此分析这个函数,IDA对此函数生成的主要伪C代码如下:
1 | void __thiscall sub_4026F0(HWND *this) |
可以看出这是程序的主流程。下面就一步一步分析此函数:
1 | void __thiscall sub_4026F0(HWND *this) |
以上步骤完成了基本的数据获取、校验操作,其中有一个主要的校验函数sub_405510
,下面来重点分析这个函数:
当返回值v13
为True
时才能注册成功,因此我们需要关注使v13
为True
的函数。
1 | if ( sub_404F00((int *)&UserName) ) |
首先我们查看 sub_404F00
函数,同样按照逆向思维,寻找使返回值为True的条件。此函数中有如下几个关键片段:
1 | v1 = UserName; |
将UserName
中的小写字母转换为大写:
1 | if ( v7 ) |
1 | v16 = 0; // v16为一个字符串 |
分析到这里我们可以得出关于UserName
的几个信息:
UserName
的长度必须为39
UserName
会被#
分割UserName
由数字和ABCDEF
组成因此可以得知UserName
的形式为:
xxxx#xxxx#xxxx#xxxx#xxxx#xxxx#xxxx#xxxx
base64:YtTJUVEn0$HI34y#8rsFewxlm+/u5a^2welcomegslab2018zQfghDRSG@di*kABZO6Kq79L&CPWvNop
Update your browser to view this website correctly. Update my browser now