逆向笔记---160CrackMe之001(Acid Burn)

本帖最后由 Steven_Hu 于 2019-6-20 11:44 编辑








之前做过一些CrackMe的小练习,相应的也做了一点笔记但一直没有上传。因本人还是逆向小白,初学者阶段,如文中有错误的地方,劳烦各位大佬顺手斧正,不胜感激。

因为是初学笔记,所以步骤及操作写得比较详细,甚至有些啰嗦,希望大家见谅。

001 Acid burn

0x01 环境与工具
系统:吾爱破解XPSP2
工具:PEIDODICE版)







0x02  程序概览
程序分为两部分。第一部分是Serial/Name,需要输入用户名和注册码:



另一部分输入序列号:






0x03 暴破流程
首先任意输入用户名和注册码:



我们发现会弹出提示框”Sorry,The serial is incorrect!”,于是在ODF3载入,运行到如上图所示,不着急点确定。此时在ODF12暂停,然后ALT+F9返回用户领空,再点击确定,程序暂停在这里:

很明显,这里是调用了MessageBox,也就是我们看到的提示框。于是在55 push ebpF2下断,F9运行。再点击check按钮,程序停在断点处。这时点击OD里的K按钮(ALT+K)观察堆栈信息,发现这个地址处调用了MessageBox


双击上图中红框位置来到此地址,发现了很眼熟的字符串:





往上翻代码,发现有两处跳转jnzjmp比较可疑:



由上图可jnz处是爆破的关键点,因为会跳转到错误提示框处。



jmp则是跳过错误提示,不用修改。

分析到这里,只需将jnzshort 0042FB1F处用nop填充即可(右键->二进制->Nop填充)。然而,当我们输入形如123这样程度较短的伪码时,依然会弹出错误提示框。于是重复上述步骤,来到如下图位置:





这里存在一个跳转jge 跳转条件是一个函数的返回值(存放在eax中)与4的比较结果,若不小于4则跳转,否则执行弹出错误提示框,所以我们把这里改为jmp





最后保存patch后的文件。右键->复制到可执行文件->所有修改:

右键->保存文件:

再运行我们patch后的程序:

另一部分(序列号)思路完全相同:



到此,暴破的工作就完成了。



0x04 算法部分
回到刚刚爆破过程中,jnz跳转的地方。推测此处是把生成的序列号与用户输入的序列号进行比对,根据结果进行跳转。所以向上找call我们发现在jnz跳转上方最近的一个call,对应的eax值很独特,而且edx是我们输入的伪码(234234):


尝试输入用户名|密码分别为”123213|CW-4018-CRACKED”“234234|CW-4018-CRACKED”这样的组合,发现”123213|CW-4018-CRACKED”是正确的注册码!因此我们可以断定,注册码是在这个call之前的call生成的。此时,最保守的方法一定是从其上方最近的一个call开始,一个一个F7进入进行分析。但是在这个例子中,跟进了很久还是没有相关注册码的信息。直接往上翻附近的代码,我们可以发现在注释处有两个眼熟的ASCII码,分别是”CW””CRACKED”,而且上面紧邻着我们patch的第二个地方(猜测此处为输入长度判断),所以找一个合适的地方下断。这里我们选的是42FA79处(被patchjge跳转所跳到的地方),单步F8,分析结果如下:

算法不复杂,主要是取用户名的第一个byte获得对应的ASCII码(这里是1,对应的ASCII码是0x31),再去乘以0x29,然后再乘以2,最后再把得出的结果转换为十进制,并在头尾连接字符“CW”和“CRACKED”,得到形如“CW-XXXX-CRACKED 的注册码(其中”XXXX”是前面计算得到的十进制数)。注意,如果遇到数据段的内容,如此处有dwordptr [431750],可以在数据窗口CTRL+g跳转到相应的地址查看内存中的值,或者直接在信息面板中查看。

而且要注意反汇编面板下的信息面板,会加载栈信息。如此处的pushdword ptr [ebp-18]:



这里的4018就是生成的注册码数字部分(10进制的FB2)

注册机C代码如下:

0x05 去除NAG
程序一开始会弹出个NAG窗口:

我们可以查找String从而快速定位到调用相应的MessageBoxcall,但这里因为是在程序开始运行时就出现的,所以就可以直接从OEPF8,一步步下断点,直到NAG出现。

首先,在42FD97处的call执行后弹框,在此处下断点,重新运行然后F7进入断点处。进入后采取同样的思路,先F8单步,如果遇到call执行后立即弹框,就下断点,然后重新载入再F7进入。

第三次断点(42563D):

这次F7进入后我们发现熟悉的字符串:

这时候如果继续下断点进入就可以看见调用MessageBox函数部分了,没有必要继续进行下去。回过头看一下我们之前下的断点,在42563D地址的上方有一处跳转,而此处跳转可以顺利绕过调用弹框部分的call



于是尝试把je改为jmp实现强制跳转,发现NAG去除成功。

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
  • 管埋员

    昵称

  • 取消

    请填写用户信息: