首页
社区
课程
招聘
[原创]第二题 南冥神功
2021-5-21 23:19 7681

[原创]第二题 南冥神功

2021-5-21 23:19
7681

老规矩丢进IDA F5

 

将 F5 的代码分析如下
图片描述

 

用伪码简单说说

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
map    = ...
table  = ...
input_ = row_input()
 
for i in range(len(input_) - 1):
    index = table.indexof(input[i])
    step1 = 5 - (index + i) % 6
    step2 = (index / 6 + i) % 6
    run(step1)
    run(step2)
 
for i in map:
    if i == 0
        print('GG')
        exit(0)
 
print('you win!')

run的规则是

要走的地方不能是墙 x和y分别都不能越界

走了一步以后把当前位置标记为墙

 

step对应的路

1// 右移
4// 左移
2// 若y为奇数 则直下 若y为偶数 则往右下走
3// 若y为奇数 则往左下走 若y为偶数 则直下
5// 若y为奇数 则往左上走 若y为偶数 则直上
0// 若y为奇数 则直上 若y为偶数 则往右上走

 

与常规迷宫不同的是满足特定条件可以往斜着走

 

其实可以看出来这个题就是我们 qq 里面经常玩的一笔画

 

路径就是这样

 

图片描述

 

转换成step就是

1234321234321101210050543450501210121234322321

 

step 就可以转换成 index 再转换成 table 中的字符 即 flag 了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
 
char table[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 
int main()
{
    char path[] = "1234321234321101210050543450501210121234322321";
    for (int i = 0; path[i]; i += 2)
    {
        int step1 = path[i] - '0';
        int step2 = path[i + 1] - '0';
        for (int j = 0; j < 36; ++j)
            if (step1 == 5 - (i / 2 + j) % 6 && step2 == (i / 2 + j / 6) % 6)
                printf("%c", table[j]);
    }//GJ0V4LA4VKEVQZSVCNGJ00N
}

验证成功

 

图片描述


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (1)
雪    币: 83
活跃值: (1478)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wumnkx 2021-5-25 11:40
2
0
 吐星大法?
游客
登录 | 注册 方可回帖
返回