作者Editor

看雪.WiFi万能钥匙 CTF 2017第三题 点评及解题思路

发布于:2017-06-29 17:34:14 阅读:236 回帖:0


今天是 6 月 7 号,高考第一天,首先祝福各位考生都能取得好成绩。

看雪CTF 2017 第三题结束,第四题开始。

从第三题开始,比赛进入一个新阶段,破解人数此时从第二题的 17 人降至 5 人,难度继续增加。



为了应对比赛,很多小伙伴彻夜难眠,守在电脑前努力钻研。下面的小伙伴还在公司呆了一宿,厉害了我的哥!



比赛前十名再次进行了更迭,此时风间仁冲上第一位,hyabcd、HighHand 位列其后。


目前整体前十名整体还没有大的变动。


后面还有十一道题等着大家来挑战,意味着还有十一次机会,大家加油!


接下来我们来看看第三题的点评与解析。


看雪评委 netwind 点评


作者的题目采用 VB P-Code 编译,用 xor 加密部分 p-code,诱导静态反编译工具得到错误的算法。同时针对调试器做了一些反调试措施。在算法上采用数学方程组求解的算法,可以通过工具 matlab 或自己分析出算法原型求解。此题在反调试和算法方面给攻击者设置了不少障碍,中间留有很多坑,某个细节不注意可能就会陷入长长的困境中。此题反响热烈,让攻击选手欲罢不能。


看雪 CTF2017 爱琴海CrackMe设计说明


原创算法题, 延续 CTF2016 的设计风格, 也可以理解为数学应用题, 花费了个把小时创作。 难度适中,有利于甄别攻击者的调试分析、逻辑推理、发散思维、数学功底, 筛选出高低排名。

采用 VB P-Code 编译, 加密 rva: 8427h、 8441h、 8493h、 84CBh、 857Bh 位置的 P-Code,加密解密均采用 xor,诱导静态反编译工具得到错误的算法,使攻击者陷入“ 盗梦空间” 而无法自觉。 隐蔽检测 beingdebugged、 rdtsc、WKTVBDebugger 并根据检测结果静默干扰 P-Code 解码算法和流程。修改 OEP RVA=0,使得某些调试工具无法顺利工作,并对 RVA=0 进行隐蔽检测。设置堆栈段寄存器反调试陷阱,迷惑攻击者对入口 CALL 408E00 的单步跟踪,一旦发现单步跟踪则静默进入程序,不对加密 P-Code 进行解码。

上述反分析、反调试都是手工使用 OD 汇编添加,顺便手工对添加的汇编代码进行了简单加花。

本作品使用的反分析、反调试手段比较常见、适度。虽然反分析、反调试可以使用更多的技巧, 但过犹不及,用得越多就越容易被攻击者发现和拆解, 毕竟算法才是本作品的灵魂。

要求攻击者按十六进制小写格式输入,总共 16 位, 8 位一组分别赋值给 x, y,参与计算,满足验证公式即注册成功。 算法概况如下:

初始条件
a = 1711722997
r = 373414231.362502
R = 874402299.931726

验证公式:( 0r == 0.5 * (2 * a ^ 2 * x ^ 2 - y ^ 4 - a ^ 4 + 2 * a ^ 2 * y ^ 2 + 2 * x ^ 2 * y ^ 2 - x ^ 4) ^ 0.5 / (a + x + y)
R == a * x * y / ((a + x + y) * (a + x - y) * (a + y - x) * (x + y - a)) ^ 0.5

对于不同水平的攻击者,可以预料到如下结果:

一、 无法分析出算法, Game over。

二、 分析出算法,但没有看出算法的真实用意, 不知道如何化简去繁, Game over。

三、 分析出算法,虽然不明白算法用意,但对公式进行了化简,推理出: y=2*r*R*(x+a)/(a*x-2*r*R),按此条件约束穷举变量,则可以在几分钟内穷举出结果。

四、 分析出算法,弄明白题设的是海伦公式、 三角形内接圆半径、三角形外接圆半径验证公式, 给出了三角形长边 a,内接圆半径r,外接圆半径 R, 要求攻击者找到三角形另外两个边长 x,y, 则根据欧拉公式 OI^2=R^2-2*R*r 计算出内外圆心距离 OI,通过CATIA/PROE/UG/CAD 等参数化作图法迅速找到答案( 题设标准解法)

本题很好玩, 答案: 5e9a3f183e37f900 您答对了么? ^_^

作者简介


爱琴海,汽车底盘工程师,从事汽车底盘系统设计开发和管理工作多年,浙江台州人,80后心怀梦想、不忘初心的青年。业余爱好: 逆向分析、吉他弹唱、编程、羽毛球、登山、旅游、经济、散步等。

2001年在路边摊上看到了本电脑杂志,从此对计算机语言和逆向产生兴趣,会逆向破解的人就像武侠世界里头的侠客行走江湖、快意恩仇,令人心生向往。此后自学汇编,VB,C,单片机等,早期互联网能找到的破解教程不是很多,windows98主流的年代,也没有更多的朋友交流学习。2006年加入了看雪论坛,这是个氛围非常棒的平台,可以向各位前辈、高手学习知识和经验,大家都很有热情。此后与一些志同道合的朋友成立了Sea Cracking Group(SCG)组织,担任过OCN版主。后来OCN、SCG逐渐淡出江湖,成员也都各有家庭和忙于事业,很少活动在世人视野中。后来因为年轻气盛,不懂得保护自己,破解了一款国产软件招来麻烦,从此销声匿迹了一些年。因为不是计算机相关专业出身,也不是从事计算机相关工作,纯粹是业余爱好,深知学无止境、一山还有一山高,今后希望与各位朋友学习交流,共同成长。80后痴狂的青春——无悔!

下面选取 hyabcd 的破解分析


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

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

前面的流程都没有问题,直到 p-code 到达 408427 时,从 VB Decompiler 反汇编的 p-code 中可以得出这是个 AddR8 指令。但是我们发现该位置的指令字节码是 0xAF。

在前面的跟踪,我们发现AddR8指令字节码是0xAB,这里0xAF被VB Decompiler认为是AddR8指令,可见VB Decompiler反汇编p-code时出了问题,跟进jmp可以发现这其实是个SubR4指令,是个减法,而VB Decompiler认为他是加法。(根据爱琴海的设计文章,可以知道在程序中对这些指令进行了修改,由于我是用OD附加调试,调试是在反调试内容之后进行的,侥幸绕过了这个坑)

继续跟踪可以发现流程还有其他几个地方存在这个问题,出现的位置就是在方程组第一个方程中a^4,b^4,c^4前的符号,这里应该是减号,所以第一个方程应该是

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

那么方程组就是

(PS:第二个式子是海伦公式,N2是三角形外接圆半径,冥冥之中感觉这个方程应该是求解三角形三边之类的。。)

使用matlab计算,可以得出a=1587167000,b=1043855616。由于a是左边八位,b是右边八位,输入要求十六进制,因此最终答案为5e9a3f183e37f900。



最后感谢 WiFi 万能钥匙安全应急响应中心的赞助支持,

接下来的比赛大家一定要使出洪荒之力哦!↖(^ω^)↗

比心


赞助商

上海连尚网络科技有限公司成立于 2013 年,是一家专注于提供免费上网和内容服务的移动互联网企业。连尚网络自主研发的核心产品 WiFi 万能钥匙,以分享经济的模式,通过云计算和大数据技术,利用热点主人分享的闲置WiFi资源,为用户提供免费、稳定、安全的上网服务,以帮助更多的人上网,找到属于他们的机会,改变自己的命运。


最新回复 (0)
返回