macOS软件逆向练习 - CrackMe#1

今天无意在油管上看到了tree_fly大神写的Hopper系列的视频,正好自己也在学习,就实践一把。

CrackMe样本是在 http://reverse.put.as/crackmes/ 上下载的,本文练习使用的是MSJ2009#1.zip
(SHA1(MSJ2009#1.zip)= ed1e7ef4cc2d64cedbdaa85757371be5dae3aecb)

macOS软件逆向练习 - CrackMe#1_第1张图片

一、试用

打开软件,要求输入用户名和序列号,点击注册后提示结果。这里随便输入一些字符。

macOS软件逆向练习 - CrackMe#1_第2张图片
macOS软件逆向练习 - CrackMe#1_第3张图片

二、分析软件

通常在分析的时候,关键词搜索是最为常用的一种方法。对于这款简单的CrackMe,所有的字符串都是一目了然的,我们在Hoppoer的中string label中查看一下,不难发现用户名和序列号等关键词。

macOS软件逆向练习 - CrackMe#1_第4张图片

这里从序列号入手,点击serial定位到string地点(绿色区域表示为string)。然后右键查看引用,来到数据区后,继续查看引用,最终定位到procedure块。

macOS软件逆向练习 - CrackMe#1_第5张图片
macOS软件逆向练习 - CrackMe#1_第6张图片

在这里我们明显看到第三个最为可疑(注册验证),跟进去看。

macOS软件逆向练习 - CrackMe#1_第7张图片
macOS软件逆向练习 - CrackMe#1_第8张图片

来到这里之后,可以简单的看一下反编译的伪代码。

macOS软件逆向练习 - CrackMe#1_第9张图片

判断不为空的时候走到else逻辑中,然后有个校验方法validateSerial,通过校验就提示注册成功,反之提示Error。

在labels中搜索validateSerial,查看Level1 validateSerial:forName:的内容,这里就是校验的具体“算法”了。

macOS软件逆向练习 - CrackMe#1_第10张图片

了解了程序的逻辑,接下来就是实践crack的时候了。

三、暴力修改

首先采用暴力的手段修改,为了验证这块的逻辑,先调试一下。

前面定位到了validateSerial:forName,我们在开头push处和结尾ret处分别设置断点,然后调试一下程序。

macOS软件逆向练习 - CrackMe#1_第11张图片

等待加载读取完毕后,输入用户名和密码,然后点击注册按钮。就可以看到程序断在了开头的push处。

接着,点击继续运行,能看到这里的EAX值为0(即false)。

手动将EAX值改为1,再次点击继续执行。就可以看到程序提示注册成功了。

macOS软件逆向练习 - CrackMe#1_第12张图片

到这里,就验证了关键的逻辑。那么其实下面的修改其实也非常容易的,我们让这个方法直接返回1就好了。直接将开头的eax赋值为1,然后return。

macOS软件逆向练习 - CrackMe#1_第13张图片

保存为新的可执行文件,替换掉原来的Challenge #1。再次运行,可以发现不用输入用户名和序列号就能直接提示注册成功了。

四、分析算法破解

之前我们预览过Level1 validateSerial:forName校验的算法。由于第一次接触该语言,因此特意查了下,发现substringWithRange:这里应该是个range。但可能是Hopper的一点反编译问题,不过没关系,可以祭出IDA。

macOS软件逆向练习 - CrackMe#1_第14张图片

打开IDA,等待加载完毕,然后找到Level1 validateSerial:forName:,按fn+F5查看伪代码。

macOS软件逆向练习 - CrackMe#1_第15张图片

到这里逻辑就很清晰了,因为没有学习过OC这门语言,只能按照IDA的伪代码写了一个渣渣出来。运行了下John_Hao对应的序列号是66486240。

macOS软件逆向练习 - CrackMe#1_第16张图片

打开程序验证一下,完美。

至此,macOS旅行的第一个CrackMe的分析就结束了。

macOS软件逆向练习 - CrackMe#1_第17张图片
关注微信订阅号获取更多

你可能感兴趣的:(macOS软件逆向练习 - CrackMe#1)