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

[原创]第二题 南冥神功

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编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//