-
-
[原创]看雪 2021 KCTF 春季赛 第四题 英雄救美
-
发表于: 2021-5-14 20:20 5700
-
直接ida静态分析,全程无需动态调试
sub_401000很明显是数独的规则,第一个参数是待填空的数字组成的数组
数独初始值是dword_4187C0开始的81个int32值,提取出来求解
(有55个空,注意到64-55=9)
sub_401240对输入进行变换并生成数独的输入数组
有一个长81的常量替换表(从xmmword_416260附近的80个字节赋值到栈上v13变量),先提取出来
常量表:(9*9)
下面的循环,遍历输入字符,如果不是'1'-'9',就先查该字符找到在表中的索引,然后 % 9 + 1 作为数独的一个输入
如果是'1'-'9',则要求此数字+已遍历字符长是9的倍数,同时在后面的查找中忽略索引表的头9个字符
最终的serial:
长度确实为64,其中有9个'1'-'9'的数字,剩余55个其他字符
以数字为结尾,可以分为9组:
注意每一组的长度,末尾的数字的值 + 除去末尾的数字后的长度 = 9
前面的81字节常量表也可以分为9*9,实际上每组serial的字符转换到数独的输入是分别对应常量表的不同的组的内部索引,例如,serial的第三组是#QM^H4,常量表的第三组是^MGmJQ#*H,不考虑末尾数字,前面的5个字符是#QM^H,在常量表第三组的索引分别是65108,每个数组%9+1 后为76219,即数独第三行填入0处的答案。由于长度只有5,因此后面补上9-5=4,形成完整的一组,同时将常量表的搜索起始位置设在第四组的开头。
但是,从程序逻辑来看,这个限制不是强制的,因为常量表的搜索范围是从起始位置到结尾,并不局限在一组的内部,且索引转换为数独输入时会 % 9 + 1;另外如果输入始终不含'1'-'9',常量表的搜索起始位置也不会右移动。单纯从这两处看应该会有大量多解。
因此需要一点脑洞,猜出题人的思路是每组分别考虑,就能够直接解出最终答案。
过了数独之后有md5和aes解密一段代码并执行,这段代码的作用仅仅只是弹窗提示You Input The Right Key。
由于后面md5的存在,题目确实不会存在多解。如果输入的serial不正确,则后面无法正确解密代码,程序基本上会崩溃。
解题脚本:
数独:
040700000
920000607
830005400
010003000
000201000
000500040
004900071
305000094
000008060
数独求解:
546719238
921834657
837625419
718463925
453291786
692587143
284956371
365172894
179348562
数独:
040700000
920000607
830005400
010003000
000201000
000500040
004900071
305000094
000008060
数独求解:
546719238
921834657
837625419
718463925
453291786
692587143
284956371
365172894
179348562
$BPV:ubfY
p}]DtN>aT
^MGmJQ
#*H
r`O'wjic0
!hdy{oZz
-
@n
+
?&
%
s_
/
g<e[W)XUx
RFSLRA;.l
=
CEkvK
-
(q
$BPV:ubfY
p}]DtN>aT
^MGmJQ
#*H
r`O'wjic0
!hdy{oZz
-
@n
+
?&
%
s_
/
g<e[W)XUx
RFSLRA;.l
=
CEkvK
-
(q
:u$YBPf2pa]Dt4
#QM^H4ic'j0`w2y{d-Zzo2%/n_s@+2<UW)e4AR;F.4=-qEkvC2
:u$YBPf2pa]Dt4
#QM^H4ic'j0`w2y{d-Zzo2%/n_s@+2<UW)e4AR;F.4=-qEkvC2
:u$YBPf2
pa]Dt4
#QM^H4
ic'j0`w2
y{d
-
Zzo2
%
/
n_s@
+
2
<UW)e4
AR;F.
4
=
-
qEkvC2
:u$YBPf2
pa]Dt4
#QM^H4
ic'j0`w2
y{d
-
Zzo2
%
/
n_s@
+
2
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!