×

Crackme-02

96
D4rk3r
2017.12.04 00:46* 字数 489

先运行程序,一个普通的注册码验证程序,直接上od调试

可以看到有You Get Wrong 和 You Get It 明确显示错误与正确的语句,查看到具体地址

这里我们可以看到有je语句会跳过输出正确的语句从而打印You Get Wrong,于是猜测会有判断语句,需要对汇编有一点了解即可知道这里的判断语句是test si,si 这个语句,想要验证自己的想法只需在寄存器中改变esi的值就可以看到输出了正确语句

既然有判断语句,那么前面应该会有语句用输入的Serial与正确的Serial作比较

同时上面不远处有个vbaStrCmp函数也算是验证了我们的想法,在这个函数下个断点,然后单步步入函数观察

在这里可以看到我们输入的Serial:123123 与 正确的Serial值:AKA-292642

至此,我们Crack的任务可以说只完成了一半,虽然我们能得到正确的Serial,但是我们并不知道它是怎么产生的,所以我们继续调试这个程序,观察到这里

这里对我们输入的字符串首先取了长度,然后用这个长度×0x17cfb,最后加上字符串第一位的ascii码生成一个中间值

这里的逻辑就是利用上一步生成的中间值不断去模0xa然后进行一系列操作,直到为0终止,最终每次循环中eax的最后一个数字所组成的字符串加上AKA-便是正确的Serial,如某次循环中eax的值为0x39 那么便取9出来

以下便是针对程序算法逻辑生成Serial的一个python脚本

name = "123"
Serial = ""
a = len(name) * 0x17cfb
a += ord(name[0:1])
while True:
    if a / 10.0 == 0:   #循环结束
        break
    edx = a % 10   #取除0xa的余数
    a = a / 10    #取除0xa的商
    edx += 0x30
    Serial += hex(edx)[-1:]
Serial = "AKA-"+Serial[::-1]

print Serial

大功告成!

Web note ad 1