Cabeca
这个crackme吧。。能学到一些东西,但是要写keygen是比较恶心的。
解法
查壳
无壳32位,上OD

定位关键字符串
borland写的程序,关键字符串好像都在下面

定位过来
这题和最近做的不太一样,好像错误回显不在正确回显的附近上下找找。

找到错误回显位置 和关键跳地址
多个地方跳到这个D4E5,跳过了正确回显call


爆破
先爆破一下吧
在e5位置汇编成如下,这样就会直接进入正确回显的流程

爆破成功

算法逆向
这个算法流程稍微有点长,我现在开始的地方下断了

两个可疑的比较
可以在这个函数在我们输入字符串之后下断,并且这两个地址分别是8f5f 320,在往下跑

计算器算一下是36703 800
往下跑
经过一个函数已经变成了具体的数字了

然后比较跳入错误回显

于是就想试试,难道两个serial就是36703和800吗
成功了,但我感觉这道题应该没有那么简单吧。换个name

错误

懂了,原来是根据name生成的serial,编码在内存地址里面。
我走了一段歪路,其实只要在那两个地址下内存写入断点就可以了。
要在还没跑的时候 下断
跳到这里了,应该是有个索引在的,我们根据堆栈信息

来到这里

这里的作用就是检验是不是字母(因为8+72)就到字母边界了。
然后根据字母所在的位置 *4(因为数据长度),简单来讲,就是比如我们输入c,就是3,找到case63,加上对应的值就可以了。
把这个东西复制进excel,变成可读的样子,然后直接找对应的字符累加就可以了。

我们试一个name hyyyy
h 750 b
y 2d13 8
就是750 + 2d13*4
b+ 8*4


成功
