逆向分析crackme

这是一道在线下比赛中的一道逆向题目,题目给出的提示是:找出flagshop的注册码。比赛中由于时间很宝贵,静态逆向需要的时间比较久,一些看似逻辑复杂的程序,其实可以动态调试,找出其中的答案。

初探

先运行一下程序,看看程序的逻辑是怎样的。随意输入,点击验证后会弹出验证错误。去ida里看看,发现逻辑比较复杂,在start处没有明显的验证码生成和校验函数,到验证函数处,发现逻辑很长,想到了动态分析。

enter image description here

enter image description here

前期准备工作

先查壳,发现程序没有加壳,然后拖入od,在od中搜索密钥无效,没有做混淆,发现
了验证函数的输出。

enter image description here

enter image description here

我们跟进去看看。这里的逻辑是如果我们输入的验证码错误,那就jnz跳转的条件成立,如果是单纯的软件破解或者让它输出正确,那么我们可以把jnz跳转时的标志位改为1,或者直接用nop填充。

JNZ =jump if not zero 运算结果不为零则转移
ZF(Zero Flag)–零标志 若运算结果为零则ZF=1,否则ZF=0
jump if not zero指的是运算结果为零,而不是ZF=0

enter image description here

我们可以在jnz处下个断点,来验证一下我们上面的推断。f9运行程序,随意输入,发现程序停在了我们下的断点处。此时标志位z为0,我们把它改成1,使跳转不成立,继续运行程序。

enter image description here

enter image description here

找出验证函数

现在我们可以让程序表现出我们想看到的一面,但是,别忘了,我们的目的是获取flagshop的验证码,我们需要找出判断的函数。有了上面的分析,验证函数肯定在jnz跳转之前。分析最近的一个call,下断点,f7步入分析。

00401053 . E8 78010000 call CrackMe1.004011D0

可以看到函数把定义好的字符串和运算出来的字符串做了一个拼接

enter image description here

然后在栈里push了两个参数,会把我们输入的1111和真正的验证码对比,对比完成后直接retn。那么,这个运算出来的字符串就应该是我们要的注册码了。我们来验证一下~

enter image description here

验证结论

可以看到,验证码确实是这个样子滴~

enter image description here

文章作者: Carl Star
文章链接: http://carlstar.club/2018/05/31/逆向分析crackme/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo