Reverse +像素迷宫
解题思路:
题目给出的文件是一个 64 位 Windows 控制台程序,运行后会提示输入 flag。通过字符串信息可以先确定程序会校验 `ISCC{}` 格式,并且程序中还出现了 `PixelMaze1.cpp`、`Correct!`、`Incorrect!` 等关键字,说明题目没有做额外混淆,核心就是分析内部路径验证逻辑。
主函数流程比较直接,程序先读取用户输入,然后调用 `extractPath()` 提取花括号中的内容。如果输入不满足 `ISCC{…}` 格式,或者中间内容为空,就直接判错。进一步分析 `extractPath()` 可以发现,它会逐字符过滤,只保留 `E`、`N`、`S`、`W` 这四个方向字符,因此可以判断花括号内部实际是一条迷宫路径。
继续分析 `validatePath()` 和 `isValidMove()` 后,可以确认程序在一个 10×10 的迷宫中模拟移动。起点是 `(0,0)`,终点是 `(9,9)`,每读入一个方向字符,就检查当前位置是否允许向该方向移动。每个格子的通路信息并不是明文存储,而是通过 `getDecryptedPixel()` 从三段数据中取值后再异或 `0x7f` 解密得到。解密后的每个字节低四位分别表示四个方向是否可通行,其中 bit0 对应 `E`,bit1 对应 `W`,bit2 对应 `S`,bit3 对应 `N`。
把三段加密数据全部取出并异或还原后,就能得到完整的 10×10 迷宫图。接下来从起点 `(0,0)` 出发,对迷宫进行 BFS 搜索,查找到终点 `(9,9)` 的一条合法路径。最终求得的方向串长度为 52,内容为 `SSENEEESENNEESWSESSSWNNWWWNWSSSWWSSEENESEENEESWSEEES`。将其放入 `ISCC{}` 中即可得到最终 flag。
Exp:
from collections import deque
encrypted_part1 = [
0x7b, 0x7e, 0xce, 0xbc, 0x2d, 0xae, 0xae, 0x8b, 0x5e, 0xcb,
0x1b, 0x2e, 0xce, 0x7e, 0x8b, 0xc7, 0x5b, 0xfd, 0xcb, 0x89,
0xde, 0x07, 0xfb, 0x8d, 0x8e, 0x57, 0x9e, 0xfb, 0xa3, 0xb6,
]
encrypted_part2 = [
0x9a, 0x8b, 0x5b, 0xb7, 0xdd, 0x7d, 0xed, 0x6b, 0x87, 0x17,
0xd6, 0x85, 0x0b, 0x4a, 0xdb, 0xf9, 0x97, 0xfb, 0x36, 0x4c,
0xfb, 0xad, 0x1d, 0x87, 0xe3, 0xa5, 0xe7, 0xdd, 0x0e, 0xad,
0x0b, 0x09, 0xfe, 0x9b, 0xc7, 0xce, 0x7e, 0xeb, 0x5a, 0xbd,
]
stack_values = [
0xbe, 0xbe, 0x37, 0x2e, 0x7e, 0xb7, 0x8b, 0x1d, 0x66, 0x9d,
0x6e, 0x4a, 0x3c, 0x5a, 0x7d, 0xa9, 0x3e, 0xee, 0x2e, 0xeb,
0x76, 0xee, 0x4d, 0x0c, 0x67, 0x49, 0xad, 0x7c, 0x3d, 0x00,
]
grid = [[0] * 10 for _ in range(10)]
for y in range(10):
for x in range(10):
idx = y * 10 + x
if y <= 2:
enc = encrypted_part1[idx]
elif y <= 6:
enc = encrypted_part2[(y - 3) * 10 + x]
else:
enc = stack_values[(y - 7) * 10 + x]
grid[y][x] = enc \^ 0x7f
dirs = {'E': (1, 0, 0), 'W': (-1, 0, 1), 'S': (0, 1, 2), 'N': (0, -1, 3)}
def solve():
q = deque([(0, 0, "")])
vis = {(0, 0)}
while q:
x, y, path = q.popleft()
val = grid[y][x]
for d, (dx, dy, bit) in dirs.items():
if (val >> bit) & 1:
nx, ny = x + dx, y + dy
if 0 <= nx < 10 and 0 <= ny < 10 and (nx, ny) not in vis:
if (nx, ny) == (9, 9):
return path + d
vis.add((nx, ny))
q.append((nx, ny, path + d))
print(f"ISCC{{{solve()}}}")
Flag:
`ISCC{SSENEEESENNEESWSESSSWNNWWWNWSSSWWSSEENESEENEESWSEEES}`
评论