【TSCTF-J】新生赛maze_revenge WP

 

 下载附件,根据题目提示知道这是迷宫类型的题目

将文件放入Exeinfo PE中

 

 发现是64位无壳。

用IDA64打开,F5读伪代码。

 

 找到疑似迷宫地图的东西,双击跟进

 

 (图略)

将这101行全部复制下来后用Dev C++打开,手动删去前缀后得到地图。

 

 最后写个脚本跑一下迷宫

#include<cstdio>
#include<iostream>
using namespace std;
char map[110][110];
char ans[100010];
int lmax=101, rmax=101, tot;
bool flag[110][110];
bool go(int x, int y)
{
    if(map[x][y]!='#' && !flag[x][y]) return 1;
    else return 0;
}
void print(int lll)
{
    for(int i=1; i<=lll; i++) printf("%c", ans[i]);
    printf("\n");
    return ;
}
void solve(int x, int y, int endx, int endy)
{
    if(!x || !y || x==rmax+1 || y==lmax+1) return ;
    if(x==endx && y==endy) {print(tot);return ;}
    flag[x][y]=1;++tot;
    if(go(x-1, y)) {ans[tot]='W';solve(x-1, y, endx, endy);}
    if(go(x+1, y)) {ans[tot]='S';solve(x+1, y, endx, endy);}
    if(go(x, y-1)) {ans[tot]='A';solve(x, y-1, endx, endy);}
    if(go(x, y+1)) {ans[tot]='D';solve(x, y+1, endx, endy);}
    flag[x][y]=0;--tot;
    return ;
}
int main()
{
    freopen("map.cpp", "r", stdin);
    int r=1, l=0, stax, stay, endx, endy;char ch;
    for(int i=1; i<=101; i++) 
        for(int j=1; j<=101; j++) 
        {
            scanf("%c", &map[i][j]);
            if(map[i][j]=='@') {endx=i;endy=j;}
            if(map[i][j]=='I') {stax=i;stay=j;}
        }
    printf("%d %d %d %d\n", stax, stay, endx, endy);
    solve(stax, stay, endx, endy);
    for(int i=1; i<=tot; i++) printf("%c ", ans[i]);
    fclose(stdin);
    return 0;
}

(PS;我这个代码只找出来了一条路径,但是貌似是有多条路径的,我的程序跑不出来了,结束都结束不了,主要是太暴力了,不敢接着跑,风扇在燃烧!!!!)

 

 

接着往下看IDA,发现

 

 在一堆while(1)的嵌套下发现最后的flag是最短路径的md5加密(小写)

将我之前的那条路径md5加密后try了一下,发现正好是对的,有种瞎猫碰上死耗子的感觉。

拿到flag。

posted @ 2021-10-24 20:02  king_kb  阅读(34)  评论(0编辑  收藏  举报