首页
社区
课程
招聘
[原创][分享]2016CrackMe解题思路-----求鼓励
发表于: 2017-1-20 23:26 5533

[原创][分享]2016CrackMe解题思路-----求鼓励

2017-1-20 23:26
5533

做为一个会一些crack的小白,偶然看到了2016 crackme比赛,于是想拿一个来练手。本以为第一题会是比较简单的,谁知一试不是那么简单,还是有很多猫腻的。不过只要仔细有耐心还是很容易找到方法;看了看坛子里其他人的分享思路都不是很细,不适合初学者,所以我打算把自己的思路分享一下,如果有不对的地方或者有更简单的办法请大神们赐教。

1、跳过调试器限制
下载下来程序以后,首先打开ollydbg,启动调试,本以为一路顺着走下去就可以找到关键函数,可是发现按F9以后啥也没有,想到肯定是程序启动过程中有判断是否被调试,调试就退出。于是查看IsDebuggerPresent,并下断点;再次F9依然没有启动。

然后尝试先启动CreackMe,使用ollydbg attach上去,发现ollydbg总是自动终止在一个访问异常上没有办法继续调试。

只好用最笨的办法,首先F8依次执行,查看执行到哪个函数退出了,经过几次最终可以确定是调用了TerminateProcess退出了,就是这里


然后从这个函数倒着往上看是哪个函数调用了这个函数,很快就找到了猫腻,原来程序中使用GetProcAddress获取到函数ZwQueryInformationProcess的地址,然后通过函数指针的方式调用,所以在直接查看时看不到这个函数,既然找到了判断地方就可以修改一下,无论调试器是否存在都不退出,修改下图这个位置就好了,我是把je指令修改成了NOP(具体怎么修改自己修改吧,我就不细说了)


2、找到密码校验的函数
密码校验函数确定,我是通过对话框提示的字符串“something you lost!"找到字符串所在位置,然后再通过调用关系确定对应的处理函数,所以我没有遇到大家说的定时器反复调用的问题。
依次调试就可看出,密码中需要有字母p和b


然后一路找下去,本以为一切顺利,结果又退出了,后来仔细查看发现,有个地方会和2比较,我理解是程序中会查看某两个函数之间执行的时间,如果大于2就退出,没有仔细研究原因,直接把跳转指令改为NOP,继续执行


看到校验密码长度的地方


依次就可以看到校验字母大小写,以及第3~6位必须是15pb的校验
比较有意思的是这里,会校验第1位和第2位的和必须是63,


最后是一个比较有难度的地方,把密码的一部分拼接在123456789字符串之后,然后比较确定最后一位必须是8,这里我不细讲,有兴趣的可以研究一下(而且必须是第一次输密码到这里,如果不是第一次很难理解出这个算法)


最后得出答案是1215pb8

这个题总体来说还好,只要有耐心还是可以搞的定。

3、疑问
最后我遇到一个疑问,有谁给讲一下XMM0寄存器在这里是怎么工作的吗?没有找到太多资料,第一次见这种


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 606
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
换X32DBG 或者X64DBG

SSE指令集
2017-1-21 02:43
0
雪    币: 210
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习学习
2017-9-1 11:56
0
游客
登录 | 注册 方可回帖
返回
//