1625-5 王子昂 总结《2017年6月4日》 【连续第246天总结】
A. CrackMe(14)
B. 拖入PEiD,无壳,然而又是VB
先用OD运行试试,这次有弹窗
F12暂停后ALT+K查看调用堆栈,在最后一个地方找到了MsgBox的调用
跟过去,上下翻翻就看到了ASCII文本
在错误的前方的jmp处NOP掉,再来一次,仍然报错
翻到开头,单步跟
发现有长度与9进行比较,必须为9才成功
于是输入长度为9的字符串,爆破成功(或者把长度判断那里NOP掉也可以爆破成功)
注册机就特别……凌乱了:
首先在OD中单步跟,寄存器中看不到什么有用的东西
大概流程应该是取第一个字符的ASCII-0x48,然后和某个值比较
然而这个值并没找到怎么来的
尝试了好久都没办法,拖到VB Decompiler里看看
成功反编译出了源代码,但是很杂乱,重复的部分特别多,还有些不知哪来的变量
关键结构和语句大概能看出来有这么几个:
A: if var3<>0 then goto [正确出口]
xor 02h
if(var1-48)<>var2)<>0 then goto [错误出口]
goto A
但是其中的变量都是混乱的,理不清到底处理的是谁
没办法,查论坛
没想到论坛的系列作者在这一关直接放弃了……第一个if的地方觉得不可能成功就认为只能爆破而无法得到正确Serial了(事实上在那个判断之前还有一个跳转)
看下面的回帖,有两个有用的内容:
301674501是正确的Serial
从1-9异或2再+48
虽然语焉不详,但是大概能懂一些东西了
我记得之前在OD中跟的时候也看到过xor 0x2h了,那么这应该是一个很关键的计算
我之前输入的Serial都在第一个字符的验证就卡死了,明明源代码中很明显是循环处理,却从来没看到循环
于是把正确Serial再输入进去,发现确实可以循环
在xor 0x2h处下断,操作数是eax,观察发现eax的值就是循环次数
而48是0的ASCII值
再去用计算器验证一下,跟我想的没错
于是本程序的算法就出来了:
用xor n,2+48与第n个字符的ASCII比较,正确则继续判断,错误则直接跳出
然而关键比较的地方我还是没找到变量,call前面push的两个参数跟过去,一个能发现正确的Unicode,另一个却完全没有发现任何踪迹(无论是地址、ASCII、值)
VB真复杂_(:з」∠)_ Decompiler的反编译又不靠谱
C. 明日计划
CrackMe(15)