首页
社区
课程
招聘
[原创]第三题 爱琴海CrackMe WriteUp
发表于: 2017-6-7 10:00 5796

[原创]第三题 爱琴海CrackMe WriteUp

2017-6-7 10:00
5796

    这道题主要是要发现算法里的坑。

    拿到程序发现是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和对应的操作去确定是哪个地方出现问题,由于程序中多是加减乘除次方这样的计算,对应的操作都是浮点运算操作,可以很清晰地跟踪它的计算流程。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
打赏 + 10.00雪花
打赏次数 1 雪花 + 10.00
 
赞赏  jren   +10.00 2017/06/07
最新回复 (13)
雪    币: 10072
活跃值: (3008)
能力值: ( LV15,RANK:515 )
在线值:
发帖
回帖
粉丝
2
good  job!
2017-6-7 12:59
0
雪    币: 1994
活跃值: (1526)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
这道题坑就在如果不懂数学  还真很难解出x、y值
2017-6-7 13:03
0
雪    币: 49
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看雪CTF都很变态,做出题来的人,不一般呀。
2017-6-7 13:17
0
雪    币: 3508
活跃值: (4634)
能力值: ( LV13,RANK:437 )
在线值:
发帖
回帖
粉丝
5
这个方程组是怎么解开的啊?
2017-6-7 13:21
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
6
楼主用的什么OD,我试了几个版本附加后程序就挂起了
2017-6-7 13:23
0
雪    币: 287
活跃值: (51)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
lelfei 楼主用的什么OD,我试了几个版本附加后程序就挂起了
OD原版1.1实验成功
2017-6-7 14:26
0
雪    币: 277
活跃值: (106)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
8

伤心。。。那个坑我竟然没看出来。。。难怪无解。

c = 1711722997;

N1 = 373414231.362502;

N2 = 874402299.931726;

[a,b] = solve(0.5*(-a^4-b^4-c^4+2*a^2*b^2+2*b^2*c^2+2*a^2*c^2)^0.5/(a+b+c)==N1, (a*b*c)/(((c+a+b)*(cb)*(ca)*(ac))^0.5)==N2, 'Real', true);


另外我理解的公式有误,还是调用函数有误?用matlab计算还是无解。。。

2017-6-7 19:03
0
雪    币: 277
活跃值: (106)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
9
lelfei 楼主用的什么OD,我试了几个版本附加后程序就挂起了
可以先改一下oep,然后就正常了。。。
2017-6-7 19:36
0
雪    币: 327
活跃值: (173)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
10
lelfei 楼主用的什么OD,我试了几个版本附加后程序就挂起了
就是原版的。。附加的时候已经跑过反调试的地方了
2017-6-8 22:44
0
雪    币: 327
活跃值: (173)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
11
angelqkm 伤心。。。那个坑我竟然没看出来。。。难怪无解。c = 1711722997;N1 = 373414231.362502;N2 = 874402299.931 ...
syms  b
syms  c
a=1711722997
[b,c]=solve('0.5*sqrt((a+b+c)*(a+b-c)*(a+c-b)*(b+c-a))/(a+b+c)-373414231.362502','(a*b*c)/(sqrt((a+b+c)*(a+b-c)*(a+c-b)*(b+c-a)))-874402299.931726')
我的m文件内容是这样的,你试看看,我算出来是两组解。一组实数解一组虚数解。
2017-6-8 22:50
0
雪    币: 222
活跃值: (185)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
12
厉害!
2017-6-9 13:07
0
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
13
感谢楼上几位解答,今天试了一下,使用带插件的OD会死,把插件目录改名就行了
2017-6-9 22:37
0
雪    币: 277
活跃值: (106)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
14
hyabcd syms b syms c a=1711722997 [b,c]=solve('0.5*sqrt((a+b+c)*(a+b-c)*(a+c-b)*(b+c-a))/(a+b+c)-3734142 ...
看来楼主的matlab比我智能一点,我的必须转化一下,去掉引号,把减号变成  ==,否则不会把a替换成数值。另外算式展开后的公式matlab的格式我也写错了,无语。。。还是不展开计算比较方便。
syms    b;
syms    c;
a=1711722997;
[b,c]=solve(0.5*sqrt((a+b+c)*(a+b-c)*(a+c-b)*(b+c-a))/(a+b+c)==373414231.362502,(a*b*c)/(sqrt((a+b+c)*(a+b-c)*(a+c-b)*(b+c-a)))==874402299.931726,  'Real',  true);
2017-6-13 11:28
0
游客
登录 | 注册 方可回帖
返回
//