尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

nssctf_help

nssctf_help 下载查壳、打开、f5查看伪代码明显是用户输入一个长度54的字符串核心校验明显是check函数creatmap应该是创建迷宫先看迷宫是什么样的首先明显是16*16的大小num是一个长度16的数组num数组中的每一个数字和1按位与赋值给map数组然后temp数组右移一位再进行按位余循环16次可以先打印看一下迷宫是什么样的#includestdio.hintnum[]{0xFFFF,0x83F7,0xBBF7,0xBB17,0xBB57,0xBB57,0xBBF7,0xBF17,0xBFB7,0xBFB7,0x8611,0xF7B5,0xF7B5,0xB7B4,0xBF87,0xBFFF};intmap[256];intmain(void){intv0;// eaxintj;// [rsp4h] [rbp-Ch]unsignedinttmp;// [rspAh] [rbp-6h]inti;// [rspCh] [rbp-4h]intx,y;for(i0;i15;i){tmpnum[i];j1;do{map[16*i16-j]tmp1;tmp1;v0j;}while(v0j16);}return0;}1是墙0是路迷宫有了接下来就是check函数的逻辑梳理了s是用户输入的字符数组长度54四个字符是wasd上下左右移动w--x→ x 减小向上走sx→ x 增大向下走a--y→ y 减小向左走dy→ y 增大向右走起点x15y1所以就是用户输入一个54位的wasd组成的字符串不能碰到墙写解密脚本fromcollectionsimportdequeimporthashlib# 动调dump并翻转后的标准16*16迷宫1墙0通路maze[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,0,0,0,0,0,1,1,1,1,1,1,0,1,1,1],[1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1],[1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,1],[1,0,1,1,1,0,1,1,0,1,0,1,0,1,1,1],[1,0,1,1,1,0,0,0,0,1,0,1,0,1,1,1],[1,0,1,1,1,1,1,1,0,1,0,1,0,1,1,1],[1,0,1,1,1,1,1,1,0,0,0,1,0,1,1,1],[1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1],[1,0,1,1,1,1,1,1,1,0,1,1,0,1,1,1],[1,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1],[1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,1],[1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,1],[1,0,0,0,0,1,1,1,1,0,1,1,0,1,0,0],[1,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1],[1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]defbfs(maze,start,end):# 方向对应d右 y1、s下 x1、a左 y-1、w上 x-1directions[(0,1,d),(1,0,s),(0,-1,a),(-1,0,w)]queuedeque([(start[0],start[1],)])visitedset()visited.add((start[0],start[1]))whilequeue:x,y,pathqueue.popleft()if(x,y)end:returnpathfordx,dy,cindirections:nxxdx nyydyif0nx16and0ny16:ifmaze[nx][ny]0and(nx,ny)notinvisited:visited.add((nx,ny))queue.append((nx,ny,pathc))returnNone# 起点、终点和check函数逻辑完全对应start(15,1)end(13,15)if__name____main__:path_strbfs(maze,start,end)print(f✅ 合法路径{path_str})print(f✅ 路径长度{len(path_str)})# 计算MD5得到Flagmd5_resulthashlib.md5(path_str.encode()).hexdigest()print(f✅ FlagNSSCTF{{{md5_result}}})得到flag本题知识点1、动调取迷宫2、check函数逻辑梳理3、bfs/dfs算法实现BFS 的全称是Breadth-First Search是无权图 / 等代价网格中求解最短路径的标准算法核心思想可以概括为逐层扩散、先进先出、首次到达即最短。一、核心本质按层序遍历从起点出发先遍历所有距离起点 1 步的节点再遍历所有距离起点 2 步的节点以此类推一层一层向外扩散。第 0 层只有起点本身步数 0第 1 层从起点走 1 步就能到达的所有节点第 2 层从起点走 2 步才能到达的所有节点……必须把上一层的所有节点全部处理完毕才会开始处理下一层这是 BFS 「广度」的含义。二、三大核心支柱1. 队列FIFO 先进先出这是实现层序遍历的核心数据结构新节点从队尾加入每次从队首取出节点进行处理保证「先入队的浅层节点」永远比「后入队的深层节点」先被处理严格维持按层遍历的顺序对应迷宫题队列里存储每个格子的坐标 走到这个格子的路径字符串。2. 已访问标记作用是避免同一个节点被重复加入队列、防止死循环。标准做法节点入队的同时就标记为已访问注意不能等到出队时再标记否则同一个节点可能被多个相邻节点重复加入队列造成空间浪费和效率下降对应迷宫题用vis[16][16]数组记录哪些格子已经入队已经走过的格子不再重复走。3. 邻域扩展对当前取出的节点按规则生成它所有相邻的下一层节点然后做合法性过滤边界校验不能超出图 / 迷宫的范围障碍物校验不能穿过墙 / 不可通行区域已访问校验不能重复入队合法的节点标记后加入队尾成为下一层的待处理节点。对应迷宫题每个格子有上下左右 4 个方向扩展后检查是否越界、是否撞墙、是否已经走过。三、标准 BFS 执行流程教材经典版初始化起点放入队列标记为已访问循环处理只要队列不为空重复以下步骤出队取出队首的当前节点判终点如果当前节点就是终点直接返回结果此时一定是最短路径扩展生成当前节点所有相邻节点过滤剔除越界、障碍物、已访问的节点入队剩余合法节点标记为已访问加入队尾队列空所有可达节点都处理完仍未找到终点说明不存在路径四、最关键结论为什么 BFS 一定能找到最短路径在无权图每一步的代价完全相等比如迷宫每走一步都是 1 格中BFS 按层遍历第 k 层的所有节点一定是恰好走 k 步到达的第一次遇到终点时对应的层数就是从起点到终点的最少步数此时对应的路径就是起点到终点的最短路径这也是这道迷宫题用 BFS 的根本原因题目要求的 54 位路径恰好就是起点到终点的最短路径长度。
返回列表