-
-
[原创]2022KCTF春季赛 第九题 同归于尽
-
发表于: 2022-5-31 03:37 10399
-
程序运行,要求输入32个字符,第一个字符为A,然后就进入复杂的函数调用里,首先要找到正确的输出位置,不过字符串被加密了,先找到输出语句的函数,调试即可发现是49b4ed,找引用,发现输出结果的有3个地方
强行调用这3个printf(包括之前的解密字符串),得知47a496 是输出成功的函数调用
函数体很大,这里改用ghidra分析如何走到正确路径
找bvar1如何赋值
要求输入的字符里没有a-z,但是可以有其他的字符
调试时没有走到这条路径,继续往上查,就发现是(int )(unaff_EBP + 0x240) < 1,下断点调试能断下
找 unaff_EBP + 0x240 的赋值,发现是个循环比较
得知要比较的 hex为
55 37 86 E8 9B 5D 05 F5 5F DC 04 DD E1 2A 77 21
90 7C BE 0E 68 F4 E3 60 8D 2A A8 9A FC FF BE 78
在这个函数里搜索1B0,只有3个结果
其中465298往下就会调用一个SM4加密函数,把box倒过来用就是解密了
解出来 FA A2 FB AE DF BA A3 C2 E3 EC 40 AF CD 4D 9E 43
观察在加密之前的输入,多次尝试发现,每2字符组合计算出1个值出来,独立计算的,可以尝试爆破2字节的组合,采取随机输入的方式
然后就爆破出一个很奇怪的解出来
AFA.AEFROAA&A-PNAMAP1<5!PO18#B16
输出成功
import
random
ch
=
[
chr
(i)
for
i
in
range
(
0x21
,
0x61
)]
+
[
chr
(i)
for
i
in
range
(
0x7b
,
0x7f
)]
length
=
30
pw
=
''
for
i
in
range
(length):
pw
=
pw
+
ch[random.randint(
0
,
len
(ch)
-
1
)]
print
(
'AF'
+
pw)
T
=
0x30
s
=
[
chr
(i
+
T)
for
i
in
range
(
16
)]
ss
=
""
for
i
in
s:
ss
+
=
i
print
(
"AF"
+
"#"
.join(s)[
1
:])
import
random
ch
=
[
chr
(i)
for
i
in
range
(
0x21
,
0x61
)]
+
[
chr
(i)
for
i
in
range
(
0x7b
,
0x7f
)]
length
=
30
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
看原图
赞赏
雪币:
留言: