crackMe
程序信息
这道题目来自于哪个实际比赛,我没有去找,我个人是从buuoj上刷到的,位于re部分第二页,题目只有一分,做出来的人也比较多,看起来应该是个简单的题目。
之所以要写这个wp,是对题目的答案存在一些疑问,网上也有很多wp,我都看了一下,大致都出自于同一个人的手笔O(∩_∩)O。我个人感觉网上的wp分析过程都漏了一步,虽然这样得出的flag可以通过buuoj,但是这是个crack题目,网上wp的答案无法通过程序本身,我个人分析得出的答案是可以通过程序本身的。
题目分析
main函数分析
下面开始分析整个题目,这里我就不改题目中的函数名了,直接使用IDA的命名。首先先说下这道题目的用意,用户名已知welcomebeijing
,然后根据程序求解正确的用户密码,最后md5就是flag,所以密码求解是否正确是可以用程序本身来验证的。另外这道题目难点主要在两个,第一是代码略长,处理过程略显复杂;其二是用了很多反调试的代码,调试时需要处理一下。
如下图所示,最开始main函数中使用了两个do-while循环,v0 = sub_4024BE(); fflush(v0);
应该是用于刷新缓冲区的,对题目不影响;sub_401000
函数检查了输入是否为字母或者数字,这里正常输入即可,然后用于存储的变量名我改了下,方便后面查看。
如下图所示,是main函数中接下来的步骤,我们先看两个if语句,满足的话则break,所以sub_401830
是关键性的处理函数。然后还有一个就是v3
的值,该值由函数loc_4011A0
返回,下面我们先看下这个函数。
该函数点进去后,本身无法反编译,问题出在下面这个地方,jbe
和aaa
那行,在IDA中找到对应的十六进制直接修改为nop指令,然后选中所有左侧标红的地址,快捷键p重新定义为一个函数,此时再执行反编译操作即可。
反编译后的代码如下所示,可以看到还是很难看,是一系列的赋值操作,这里只截了一部分