首页
论坛
课程
招聘
[原创]第十一题 虫洞末日
2022-6-4 23:26 5834

[原创]第十一题 虫洞末日

2022-6-4 23:26
5834

0、总结

本题的难点有两个,一个是精度的处理,python对浮点数的计算很让人头疼,如果单纯按照理论上的反推,可能会因为精度丢失的问题产生困扰。二是600000次循环,不要过于纠结它产生的后门,看不出来的情况下,想想其他的解决方案。
我的解决思路如下:

1、分析

分析源代码,寻找后门。没能看懂600000次循环的含义,仅仅能简单理解为寻找一个能被整除的Q。怀疑算法有后门,但是没有看出来,只能硬算。

2、第一部分计算

首先想要拿到writeup,,最关键的部分是:
A)rememberkey[0]==key[0] and rememberkey[1]==key[-1]
B)Mode1==remembermode[0] and Mode2==remembermode[1]

 

先解决第一个关键部分。因为Key=Q/keywords1[i],所以对于keywords1[0]和keywords1[7],一定存在一个A属于keywords1[0],B属于keywords1[7]。Akeywords1[0]=Bkeywords1[7]。
而由于A=lists[2i]**2lists[2i+1]+i*2。所以A是有穷的,将编码后的数字划分区间,缩减为range(165,233),A大约4000个。可以计算获得keywords1[0]和keywords1[7]的精确值。
使用脚本LastScript1.py跑得如下结果:
图片描述

3、第二部分的错误尝试

接下来是第二个关键部分。
最初的想法是,key[1]/key[-2],上下都含Q,约分后为keywords1[-2]/keywords1[1]。
因为remembermode两个数最大公因子才为32,所以两个b不可能同时为mode2。
还剩三种情况,一个是两个a都是mode1;两个是一个a是mode1。
总结如下:
1)
X1=(mode2-mode1)mode1
X2=(mode1-mode4)
mode4
2)
X1=(mode1-mode2)mode2
X2=(mode4-mode1)
mode1
3)
X1=(mode1-mode2)mode2
X2=(mode1-mode4)
mode4
以上三个公式可以进行变形,以第一个为例子
mode1=(x2/mode4+mode4)
mode2=(x1/mode1+mode1)
那么,对于所有的mode4来说,只要用它算出的mode1,能被x1整除,就意味着找到了正确的mode1。尝试了三组均失败,浪费了大量的时间,反复验证了算法、代码,暂时没找出漏洞,失败原因暂且归纳为Q/keywords1的计算导致精度缺失严重,最终逆推,发现确实有精度的问题。还有就是sqrt、pow这些函数不要使用,会影响精度。

4、第二部分计算

最终我们根据对上述错误信息的理解,将目光集中在了
X1=(mode1-mode2)mode2
X2=(mode1-mode4)
mode4
变形:
Mode1=X1/mode2+mode2
Mode1=X2/mode4+mode4
X1、X2可以因式分解,
list1=[2,2,2,2,2,2,3,3,3,19,19301,5651461,18765679,452548673]
list2=[2,2,2,2,2,13,29,181,353,641,929,270532579,400359419]
最大公因数32.
我们遍历list1,找出所有组合,再遍历list2找出所有组合。如果两边求得的Mode1完全相等,我们可以说我们找到了正确的mode1、mode2、mode4。
遍历list可以用二进制单增计数法,可以DFS递归生成,使用脚本LastScript2.py求得如下值,其中mode2按照对称性进行转换。
mode1 =14109109473780244
mode2 =11453778324758052
mode4 =6827218673007356
从mode获得相应的Key是容易的,遍历即可。整理后获得如下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#07
print(chr(197-100),chr(215-100),chr(208-100),chr(214-100))
 
#mod4 2 4
#226 224
#188 221
print(chr(226-175),chr(224-175),chr(188-100),chr(221-100))
 
#mod2 3 5
#227 199
#225 232
print(chr(227-175),chr(199-100),chr(225-175),chr(232-175))
 
#mod1 1 6
#189 224
#225 223
print(chr(189-100),chr(224-175),chr(225-175),chr(223-175))

整理后得到flag:lrY1314cXy2920as

 

由于经验的缺失,走了很多的弯路,加油~~~


恭喜ID[飞翔的猫咪]获看雪安卓应用安全能力认证高级安全工程师!!

最后于 2022-6-4 23:30 被瑞皇编辑 ,原因: 解决排版问题
上传的附件:
收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回