-
-
[原创]兔斯基保护协会题目文件和flag
-
发表于: 2020-4-15 23:57 3380
-
团队名称:兔斯基保护协会
QQ:2593270981
联系电话:18612440384
参赛题目:见附件,是题目exe和按照Windows Crackme规则2要求提供的公开“用户名-序列号”
题目答案:4A3A9740B735704562
题目设计:
简而言之,
本题是一道变体RSA题,N值很小且很容易因式分解(因数只有 3 字节,最大数值不到200万)。本质上是根据密文(由用户名生成),求解明文。
本题的变体RSA算法是由与非门实现的!
亮点:
使用与非门(and和not的连续组合)作为唯一算术指令实现幂运算取模(pow mod),算法部分甚至没有跳转。只有与非!(我认为这很艺术)
提供破解外星硬件的体验。笔者认为任何文明都离不开逻辑,飞碟残骸中的运算设备很可能有门结构哦~这是一种脱离了操作系统和指令集的更基础的真实!
具体说明如下。
本题的N由三个素数P1,P2,P3相乘得到。每个素数都只有3个字节,即小于等于0xFFFFFF(十进制1677215)。
可以瞬间因式分解。进而算出phi,再根据题目中公开的公钥E,算出私钥D,完成解密。
这个过程需要理解RSA的算法原理,三个素数生成的N对应的phi,算法上和标准RSA不同。但D的算法完全一致。
具体算法见“破解思路”部分。
本题的变体RSA运行了3次(由外层循环控制,算法的二进制长度几乎没有增加)。求解过程即求解密文对应的明文,再以明文为密文求其明文,再以明文为密文求其明文,得到最终的key.
本题将过小的输入的运算结果强行归0,这是为了防住一种捷径,具体也在“破解思路”中。
本题的难点是在题目中找出N和E。
由于本题的变体RSA完全由与非门实现,也就是如下代码块的巨大阵列:
mov al, g_mem[J]
mov ah, g_mem[K]
and al, ah
not al
mov g_mem[I], al
在IDA中非常的工整。
pow mod 幂模运算,即 y = x^E % N,本文用^代表幂运算。
是按照 Montgomery 算法由乘法封装为幂运算。
乘法则是由加法封装而成,是对数复杂度,举个例子,比如:
1011 * 1101 = 1011 * 1 +1011 * 100 + 1011 * 1000,加了11次,而不是1101次(这里的数都是二进制)
求模运算就是除法,不保留商,只保留余数。
11011 mod 101 = 111 mod 101 = 10(这里的数也都是二进制)
除法里包括了减法实现,和加法类似,不赘述。
注意,这里的乘法和除法都是有进位(借位)的,这和AES里面的多项式取模很不一样,难度也更高。
尽管如此,本题的算法速度极快!
实现了变体RSA,阵列真的很大!但笔者没加混淆没加花,原汁原味的保留原始设计,特征明显,重复度高,破解并不算太难,也是详见“破解思路”部分。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课