170602 逆向-CrackMe之009

来源:互联网 发布:数控机床编程技术 编辑:程序博客网 时间:2024/06/07 23:08

1625-5 王子昂 总结《2017年6月2日》 【连续第244天总结】

A.CrackMe(9)

B.今天的是一个Name/Serial类型的,拖入PEiD显示VB-无壳

随便输入错误以后弹窗,虽然内容看不懂不过肯定是错误就对了

在OD中暂停,ALT+K显示堆栈,找到MsgBox的调用,跟过去

向上翻一点看到了错误窗口的字符串,再往上就看到了另外一段不明意义的字符串

再向上就是一个test和je跳转,NOP之,爆破成功


算法部分我完全卡死了,从头跟下去但是无论寄存器还是栈堆中都只出现了两次字符串,其他没有任何计算结果

整个流程中出现了大量API,结合之前提到过的VB常见函数能大概理解意思

但是VB与Delphi有一个很大的不同,它的函数返回值不放在寄存器中,而是在之前push进去的堆栈之中。而根据push的参数却又找不到有意义的内容

中间算法流程比较清晰:进行循环,提取Name的每个字符,转换成Unicode后再转换成ASCII值

但是接下来调用了一个Add的API就让人看不懂了,它push的参数与之前的ASCII不是同一个地址,加到最后总是02

然后又用2乘以3,最后结果的地方出现的是5

最后的比较API也不理解,无论输入什么都是03和08在比较

没办法,看论坛查writeup

原来VB的变量保存形式是:前两个4字节保存的是数据类型之类的相关类型,第三个4字节才是真正的字符串

所以我盯的位置都是第一个4字节,当然没有有意义的内容了

知道了这点再去重新跟一遍

提取Name的每个字符,转换成ASCII值后累加,最后再乘以0x499602D2(其实就是十六进制的1234567890)

得到的结果通过vbaMidStmtVar来将第四个和第九个字符换成'-',最后直接与Serial比较即可


与Delphi相比,VB的过程大量的使用API,包括rtcMidCharVar取出字符, rtcAnsiValueBstr将Unicode转换成ASCII,__vbaVarAdd相加,__vbaVarMul相乘,和__vbaVarMove在内存中移动变量等等

还有一些freeObj,freeVarList等等是释放作用的,就不用管了

要经常关注堆栈(的下两个字节)而不是寄存器_(:з」∠)_麻烦许多


C.明日计划

CrackMe(10)

原创粉丝点击