首页
社区
课程
招聘
[原创]第二题 南冥神功
2021-5-12 12:53 4737

[原创]第二题 南冥神功

2021-5-12 12:53
4737

第二题 南冥神功

找到main函数,首先看了最后的判断条件。

 

图片描述

 

即要让下面这个数组中的每个数都不为0:

 

图片描述

 

到上面的核心代码找到唯一修改这个数组值的地方:

 

图片描述

 

然后分析一下那几个跳转的逻辑熟悉程序功能,就是每个输入的序号和输入在一个指定数组中的对应索引来作为每次的运算,进而决定要修改目标数组的位置。

 

注意到有好几个跳转错误逻辑的条件,那这里很大的缩小了满足的输入。所以用dfs来搜一下应该是可行的。

 

图片描述

 

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#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

图片描述


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-5-12 12:56 被Bxb0编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回