KCTF2022春季赛Crypto虫洞末世WP

代码流程:

  1. 输入16位的字符串
  2. 通过ascii范围的加值获得中间输入,再由奇数位、偶数位的乘数关系,获得keywords1
  3. 从keywords1获得keywords2,再有600000次循环,获得Q
  4. Q值依次和keywords1作商,获得finalkeys

然后是关键点,finalkeys要满足关系判定:

  1. Finalkey[0]和Finalkey[7]的数值满足:
    Finalkey[0]==3.828458696865581e+47;
    Finalkey[7]== 4.248062979398713e+47
  2. Finalkey[1-6]相关的两个Mod1和Mod2,满足:
    Mode1==30413574359725275612744778689984;
    Mode2== 49715060849837149374468109364128

对于判定1:
Finalkey[0] = Q/keywords1[0] Finalkey[7]=Q/keywords1[7]
Keywords1[7] = (Finalkey[0]/ Finalkey[7])*keyswords1[0],应该是个整数。
穷举keywords1[0]的数值,保存结果。搜索结果,只有一个满足。
图片描述
key0 = 9,258,496108,对应208,214,即输入的字符开始的两位为“lr”。

 

对应的key7为8343984,穷举获得的两个中间输入197,215,即序列号的最后两位为“as”。
Key7 = 8343984

 

对于判定2:
记录一个失败尝试,知道keywords1[0]和remeberkey[0]可求Q,600000次循环结束的条件,是一个keywords1中的元素可以整除Q。搜索失败了,意识到python处理的精度有限。

 

分析知
mode1==mode3=keywords1[6]/keywords1[1]
mode2= keywords1[5]/ keywords1[3]
mode3= keywords1[4]/ keywords1[2]
remembermode[0]和remembermode[1]最大公约数32,则mode1不是三者中最小的。
可能的情况:
1.
(m1-m2)m2=rm0
(m1-m3)
m3=rm1
2.
(m1-m2)m2=rm0
(m3-m1)
m1=rm1
3.
(m2-m1)m1=rm0
(m1-m3)
m3=rm1

 

图片描述
图片描述
获得

1
2
3
4
5
6
7
8
m1: 14109109473780244 m2: 11453778324758052
m2: 2655331149022192
 
m1: 14109109473780244
m3: 6827218673007356
m3: 7281890800772888

继续穷举,再穷举m1获得k6,k1,
K6 = 11289411 k1 = 8001505,
同理穷举m2,获得k5和k3
K5= 11745025 k3=10254280
穷举m3,获得k4,k2
K4=7811040 k2=11441028
继续穷举中间输入,获得原始输入,
获得最终的flag。
lrY1314cXy2920as



更多【KCTF2022春季赛Crypto虫洞末世WP】相关视频教程:www.yxfzedu.com


评论