REVERSE-像素迷宫

ISCC2026 WriteUp 提交模板

REVERSE-像素迷宫

解题思路

image.png

image.png

输入从 std::getline 读取,存储到 input 字符串中。然后调用 extractPath 提取 ISCC{...} 中的路径内容,再由 validatePath 验证路径有效性。

image.png

  1. validatePath(path) — 从 (0,0) 出发按路径走,每步调用 isValidMove 检查方向可行性,验证是否能到达 (9,9)
    • isValidMove 调用 getDecryptedPixel(y, x) 获取当前格子的方向位掩码
    • 位映射: bit0=E, bit1=W, bit2=S, bit3=N

2迷宫数据

Snipaste_2026-05-18_08-30-02.png

image.png

迷宫为 10×10,加密数据分三段存储,统一 XOR 0x7F 解密:

  • PART1 (0x1400bd180): y=0~2
  • PART2 (0x1400bd0e0): y=3~6
  • PART3 (函数栈数组): y=7~9

3BFS 解码结果

image.png

ISCC{SSENEEESENNEESWSESSSWNNWWWNWSSSWWSSEENESEENEESWSEEES}

Exp

from collections import deque

# ENCRYPTED_PART1 (y=0..2) from 0x1400bd180
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 (y=3..6) from 0x1400bd0e0
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 part3 (y=7..9) qword low/high dwords extracted from function at 0x1400016b0
part3 = [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]

# Decrypt maze with XOR 0x7F
maze = []
for y in range(10):
    row = []
    for x in range(10):
        if y <= 2:
            v = part1[y * 10 + x]
        elif y <= 6:
            v = part2[(y - 3) * 10 + x]
        else:
            v = part3[(y - 7) * 10 + x]
        row.append(v ^ 0x7F)
    maze.append(row)

# Direction mapping from isValidMove
# bit0=E(right), bit1=W(left), bit2=S(down), bit3=N(up)
dirs = [(0, 1, 'E'), (0, -1, 'W'), (1, 0, 'S'), (-1, 0, 'N')]
bit_map = {'E': 1, 'W': 2, 'S': 4, 'N': 8}

# BFS from (0,0) to (9,9)
parent = {}
q = deque()
q.append((0, 0))
parent[(0, 0)] = None

found = False
while q and not found:
    cy, cx = q.popleft()
    cell = maze[cy][cx]
    for dy, dx, name in dirs:
        ny, nx = cy + dy, cx + dx
        if 0 <= ny < 10 and 0 <= nx < 10 and (ny, nx) not in parent:
            if cell & bit_map[name]:
                parent[(ny, nx)] = (cy, cx, name)
                if ny == 9 and nx == 9:
                    found = True
                    break
                q.append((ny, nx))

# Reconstruct path
path = []
cur = (9, 9)
while parent[cur] is not None:
    cy, cx, d = parent[cur]
    path.append(d)
    cur = (cy, cx)
path.reverse()

print(f"Flag: ISCC{{{''.join(path)}}}")
print(f"Length: {len(path)}")

posted @ 2026-05-19 16:29  MillionMind  阅读(12)  评论(0)    收藏  举报