吾爱破解安全大赛cm6分析

吾爱破解安全大赛cm6分析

程序通过创建新的线程来完成验证工作:

其中serial是通过变形的base64算法加密的,在base64算法43的过程中对每字节分别进行异或:

真正的serial将由4部分组成,竞赛时提供的key 解密后的内容:

第一部分name应与username相同。
接下来的3key分别对应3个验证函数,只有都验证通过才算成功。
Key1是摩斯电码,解密后的值为7105042118043。以下是验证函数:

可以得出key1必须满足的条件有:
①.第一个数字为key1_0的长度,key1_0>=10000且为素数
②.key1_1>=10000且为素数
③.Key1_0*key1_110000000000-89999999999之间,且包含0-9所有数字
 
写一个脚本就能获取到很多这样的数字:

Key2的验证就有些复杂了,以下是验证部分:

Key2的验证涉及到虚拟机,大致由25个处理程序组成:

这里我只大致识别了几个,全部分析太耗时间了(实在是扛不住)。另外还有vmdata的结构组成,在外部由64字节组成,大致包含影响的内存位置(可以理解为是vm_reg)、位数、handler序号等,具体的分析还未完成。
这里因为虚拟机执行的步数不是很多,在提供可用key的情况下一共运行0x185次,所以这里就动态调试观察一些数据的变化来大致判断真正的验证过程,大致的执行流程应该为:
①.判断key中是否含有0-9的所有数字
②.将key数字排列成3×3格式,判断横竖斜直线上的数字和是否均为0xF15
最后得出的验证过程是判断key3×3格式是否是一个3阶幻方(横竖斜数字和相等)。
 
Key3的验证过程涉及到了luajit,这验证函数404D50中首先将luajit脚本的bytecode加载到堆栈,然后调用:

这里要了解验证过程需要提取luajit数据进行反编译。以下是反编译后的lua代码:

这里用到一个github上的luajit反编译工具,不过这个工具有很多bug,反编译后需要仔细修复(对某些变量不能识别,以及对ISNEN的错误翻译)。
验证算法中涉及到对每个字符如下的逻辑运算:
nor(nor(nor(a,a),nor(b,b)),nor(a,b)) = xor(a,b)
可得出最终的验证方式是将用户名的每一位异或66key中每一位异或99相加,如果最后值为2015则验证成功。
最终的KeyGen

Reference:
source:
http://www.52pojie.cn/forum.php?mod=viewthread&tid=480802&extra=page%3D1%26filter%3Dtypeid%26typeid%3D273

发表评论

电子邮件地址不会被公开。 必填项已用*标注