-
-
[原创]第十一题 虫洞末日
-
发表于: 2022-6-4 23:26 10832
-
本题的难点有两个,一个是精度的处理,python对浮点数的计算很让人头疼,如果单纯按照理论上的反推,可能会因为精度丢失的问题产生困扰。二是600000次循环,不要过于纠结它产生的后门,看不出来的情况下,想想其他的解决方案。
我的解决思路如下:
分析源代码,寻找后门。没能看懂600000次循环的含义,仅仅能简单理解为寻找一个能被整除的Q。怀疑算法有后门,但是没有看出来,只能硬算。
首先想要拿到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跑得如下结果:
接下来是第二个关键部分。
最初的想法是,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这些函数不要使用,会影响精度。
最终我们根据对上述错误信息的理解,将目光集中在了
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是容易的,遍历即可。整理后获得如下信息:
整理后得到flag:lrY1314cXy2920as
由于经验的缺失,走了很多的弯路,加油~~~
#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
))
#07
print
(
chr
(
197
-
100
),
chr
(
215
-
100
),
chr
(
208
-
100
),
chr
(
214
-
100
))
#mod4 2 4
#226 224
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [原创]KCTF 2024 签到题 83
- [原创]KCTF 第一题 — 失控的AI 2897
- [原创]KCTF 第0题——签到题 1240
- [原创]第十一题 虫洞末日 10833
- [原创] KCTF 第四题 飞蛾扑火 4008