【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。