-
-
[原创]自动化解KCTF2021第二题南冥神功
-
发表于: 2021-5-13 23:45 4985
-
switch case结构的优化
switch 1,2,3,4,5会转化为switch 0,1,2,3,4,然后通过一个jmp table 实现 switch,table [0,1,2,3,4]
ida调试的时候发现不对劲要去查看汇编代码,否则这些优化会让c伪代码调试看起来很奇怪
在复原代码的过程中,我发现他很像一个迷宫,通过我们的输入走迷宫,迷宫不是简单的上下左右,有6种情况,我也不去分析这六种情况到底是什么样了,我打算写个脚本自动走这个迷宫
思路是使用递归,是每一步都尝试,如果这一步不合法,那就终止此尝试,如果合法,就在这一步的基础上再次尝试
脚本编写的过程中要注意exp函数的参数问题,传入的参数要是副本才行,不同的尝试之间不能互相影响,我在编写脚本的时候就犯了这个错误,浪费了一些时间
最后得到了迷宫的走法,但是题目还有一些限制
本来我想逆向还原了,后来6取余又减法的把我绕晕了,最后选择了爆破
验证一下,正确
说下感受吧,逆向是一个缓慢的过程,一步一步发现程序的奥秘,期间会踩很多坑(有一些坑是自己的失误造成的),慢慢调试不能急就是了
map2
=
[
0x53
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x01
,
0x01
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x01
,
0x01
,
0x01
,
0x01
,
0x01
,
0x00
,
0x00
,
0x01
,
0x01
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x01
,
0x01
,
0x01
,
0x00
,
0x01
,
0x01
,
0x01
,
0x00
,
0x01
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x01
,
0x01
,
0x01
,
0x00
,
0x01
,
0x00
,
0x01
,
0x00
,
0x01
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x01
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x01
,
0x00
,
0x00
]
# for i in range(9):
# print()
# for j in range(10):
# if map2[10*i+j] == 1:
# print("x",end ="")
# elif map2[10*i+j] == 0x53:
# print("S",end ="")
# elif map2[10*i+j] == 0:
# print("o",end ="")
try_time
=
0
def
exp(v9_in,v21_in,list2_in,map2):
global
try_time
for
i
in
range
(
0
,
6
):
list2
=
list2_in.copy()
v9
=
v9_in
v21
=
v21_in
map1
=
map2.copy()
v10
=
i
is_ok
=
0
if
v10
=
=
0
:
v9
+
=
(v21 &
1
=
=
0
)
v21
-
=
1
if
v10
=
=
5
:
v9
-
=
(v21 &
1
!
=
0
)
v21
-
=
1
if
v10
=
=
3
:
v9
-
=
(v21 &
1
!
=
0
)
v21
+
=
1
if
v10
=
=
2
:
v9
+
=
(v21 &
1
=
=
0
)
v21
+
=
1
if
v10
=
=
1
:
v9
+
=
1
if
v10
=
=
4
:
v9
-
=
1
if
v21 >
8
or
v9 >
9
or
10
*
v21
+
v9 <
0
or
v21 <
0
or
v9 <
0
:
is_ok
=
0
else
:
if
map1[
10
*
v21
+
v9]
=
=
0
:
map1[
10
*
v21
+
v9]
=
1
is_ok
=
1
# 如果这一步合法,就可以递归,否则结束
if
is_ok
=
=
0
:
if
len
(list2)
=
=
46
:
print
(list2)
else
:
list2.append(i)
exp(v9,v21,list2,map1)
try_time
+
=
1
map1
=
map2.copy()
exp(
0
,
0
,[],map1)
print
(try_time)
map2
=
[
0x53
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x01
,
0x01
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x01
,
0x01
,
0x01
,
0x01
,
0x01
,
0x00
,
0x00
,
0x01
,
0x01
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x01
,
0x01
,
0x01
,
0x00
,
0x01
,
0x01
,
0x01
,
0x00
,
0x01
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x01
,
0x01
,
0x01
,
0x00
,
0x01
,
0x00
,
0x01
,
0x00
,
0x01
,
0x01
,
0x00
,
0x00
,
0x01
,
0x00
,
0x01
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x01
,
0x01
,
0x00
,
0x00
]
# for i in range(9):
# print()
# for j in range(10):
# if map2[10*i+j] == 1:
# print("x",end ="")
# elif map2[10*i+j] == 0x53:
# print("S",end ="")
# elif map2[10*i+j] == 0:
# print("o",end ="")
try_time
=
0
def
exp(v9_in,v21_in,list2_in,map2):
global
try_time
for
i
in
range
(
0
,
6
):
list2
=
list2_in.copy()
v9
=
v9_in
v21
=
v21_in
map1
=
map2.copy()
v10
=
i
is_ok
=
0
if
v10
=
=
0
:
v9
+
=
(v21 &
1
=
=
0
)
v21
-
=
1
if
v10
=
=
5
:
v9
-
=
(v21 &
1
!
=
0
)
v21
-
=
1
if
v10
=
=
3
:
v9
-
=
(v21 &
1
!
=
0
)
v21
+
=
1
if
v10
=
=
2
:
v9
+
=
(v21 &
1
=
=
0
)
v21
+
=
1
if
v10
=
=
1
:
v9
+
=
1
if
v10
=
=
4
:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
看原图
赞赏
雪币:
留言: