-
-
[原创]第二题 南冥神功
-
发表于: 2021-5-12 12:53 5368
-
找到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
;
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-5-12 12:56
被Bxb0编辑
,原因:
赞赏
他的文章
- [原创]SUSCTF 2022部分逆向题解 6632
- [原创]第四题 英雄救美 3183
- [原创]第二题 南冥神功 5369
- [原创]MRCTF2021逆向题解 10591
- 第六届上海市大学生网络安全大赛Re 5046
看原图
赞赏
雪币:
留言: