[原创]第三题 爱琴海CrackMe WriteUp
发表于:
2017-6-7 10:00
5796
[原创]第三题 爱琴海CrackMe WriteUp
这道题主要是要发现算法里的坑。
拿到程序发现是VB的程序,使用VB Decompiler进行反编译,发现算法非常清晰,如下图所示。
这是一个二元方程组,global_84和global_92是输入内容的左边八位和右边八位,并且两者都大于0,global_84大于global_92。这两个数是方程组的两个未知数。global_76,global104和global100都是已知的,其他全局变量都为0。令global84=a,global92=b,global76=c,global104=N1,global100=N2。可以将VB Decompiler反编译得出的方程组简化如下。
通过matlab进行计算,发现求出来的值都是复数,也就是说不存在实数解,踩坑了。看来反编译出来的代码应该有问题,看VB Decompiler中反汇编的p-code,发现和反编译的代码可以正确对应,所以问题不在这,这时就得看看是不是在将p-code字节反汇编成p-code时出现了问题。
程序无法用OD打开,不过可以使用OD附加程序分析。我们从反编译的代码中可以发现他使用了Left和Right函数去获取输入的左边八位和右边八位。因此可以直接对这两个函数下断。找到这些函数有个捷径,我们可以在VB虚拟机的入口上方发现一些jmp指令,从这些指令可以直接找到Left函数的地址,下断即可。
由于这个程序主要是进行方程的求解,因此VB虚拟机运行的过程十分清晰。在VB虚拟机中,esi存放p-code的eip,我们在VB虚拟机中单步调试时,可以观察esi寄存器的变化,然后和VB Decompiler反汇编出的p-code的地址对应起来,以确定当前的p-code指令对应的是什么操作。比如如下图所示。
当前esi寄存器的值是4083fa,说明当前p-code的eip是4083fa。VB虚拟机会将4083fa中的p-code字节码传递给al,并作为虚表的偏移去找下一个要执行位置。从VB Decompiler中可以看到4083fa位置的p-code指令是MulR8,也就是乘法,那么VB虚拟机通过p-code字节码找到虚表偏移后进入的地方就是来执行乘法这样一个操作。这个地方就是上图jmp指令跳转到的地方,进入后可以发现确实是执行乘法。
如此一来就可以根据p-code和对应的操作去确定是哪个地方出现问题,由于程序中多是加减乘除次方这样的计算,对应的操作都是浮点运算操作,可以很清晰地跟踪它的计算流程。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!