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

[原创]第二题 南冥神功

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