-
-
[原创]第二题 南冥神功
-
发表于: 2021-5-12 12:53 5379
-
找到main函数,首先看了最后的判断条件。
即要让下面这个数组中的每个数都不为0:
到上面的核心代码找到唯一修改这个数组值的地方:
然后分析一下那几个跳转的逻辑熟悉程序功能,就是每个输入的序号和输入在一个指定数组中的对应索引来作为每次的运算,进而决定要修改目标数组的位置。
注意到有好几个跳转错误逻辑的条件,那这里很大的缩小了满足的输入。所以用dfs来搜一下应该是可行的。
代码:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
char a[]
=
{
83
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
};
char t[]
=
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
;
char flag[
100
], tmp_a[
90
];
unsigned
int
v9, v21;
int
check()
{
int
i, j;
for
(i
=
0
; i <
9
; i
+
+
)
{
for
(j
=
0
; j <
10
; j
+
+
)
{
if
(a[
10
*
i
+
j]
=
=
0
)
return
0
;
}
}
return
1
;
}
int
fun(
int
v4,
int
v5)
{
int
v7, v8, v20, v10, i, v17, v12, v19, v18;
char
*
v13;
v7
=
(v4
+
v5
/
6
)
%
6
;
v8
=
v5
+
v4;
v20
=
v7;
v10
=
5
-
v8
%
6
;
for
(i
=
0
; i <
2
; i
+
+
)
{
switch (v10)
{
case
1
:
+
+
v9;
break
;
case
2
:
v17
=
(v21
+
+
&
1
)
=
=
0
;
v9
+
=
v17;
break
;
case
3
:
v12
=
(v21
+
+
&
1
) !
=
0
;
v9
-
=
v12;
break
;
case
4
:
-
-
v9;
break
;
case
5
:
v19
=
(v21
-
-
&
1
) !
=
0
;
v9
-
=
v19;
break
;
default:
v18
=
(v21
-
-
&
1
)
=
=
0
;
v9
+
=
v18;
break
;
}
if
( v9 >
9
)
return
0
;
if
( v21 >
8
)
return
0
;
v13
=
&a[
10
*
v21
+
v9];
if
(
*
v13 )
return
0
;
*
v13
=
1
;
v10
=
v20;
}
return
1
;
}
void dfs(
int
step)
{
int
i;
if
(step >
48
)
return
;
if
(check())
{
printf(
"%d\n"
, step);
printf(
"found: %s\n"
, flag);
getchar();
}
puts(flag);
for
(i
=
0
; i <
36
; i
+
+
)
{
flag[step]
=
t[i], flag[step
+
1
]
=
0
;
int
tmp
=
v9, tmp1
=
v21;
char
*
tmp_a
=
(char
*
)alloca(
90
);
memcpy(tmp_a, a,
90
);
if
(fun(step, i))
dfs(step
+
1
);
v9
=
tmp, v21
=
tmp1;
memcpy(a, tmp_a,
90
);
}
return
;
}
int
main(void)
{
dfs(
0
);
return
0
;
}
/
/
GJ0V4LA4VKEVQZSVCNGJ00N
#include <stdio.h>
#include <malloc.h>
#include <string.h>
char a[]
=
{
83
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
};
char t[]
=
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
;
char flag[
100
], tmp_a[
90
];
unsigned
int
v9, v21;
int
check()
{
int
i, j;
for
(i
=
0
; i <
9
; i
+
+
)
{
for
(j
=
0
; j <
10
; j
+
+
)
{
if
(a[
10
*
i
+
j]
=
=
0
)
return
0
;
}
}
return
1
;
}
int
fun(
int
v4,
int
v5)
{
int
v7, v8, v20, v10, i, v17, v12, v19, v18;
char
*
v13;
v7
=
(v4
+
v5
/
6
)
%
6
;
v8
=
v5
+
v4;
v20
=
v7;
v10
=
5
-
v8
%
6
;
for
(i
=
0
; i <
2
; i
+
+
)
{
switch (v10)
{
case
1
:
+
+
v9;
break
;
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-5-12 12:56
被Bxb0编辑
,原因:
赞赏
他的文章
- [原创]SUSCTF 2022部分逆向题解 6643
- [原创]第四题 英雄救美 3197
- [原创]第二题 南冥神功 5380
- [原创]MRCTF2021逆向题解 10633
- 第六届上海市大学生网络安全大赛Re 5070
看原图
赞赏
雪币:
留言: