《Debug》Stage 2 攻略
嗨嗨~ 米娜桑早上好,通关还顺利吗?是否卡在了阶段【Access Denied! Reason: Key file not found】呢?
顺利通关 Stage 2 的小伙伴可以在评论区留下自己的通关感想哦~
作为第二关的设计者和制作者,现在来向大家介绍 Stage 2 的解密方法。
首先我们会发现简介中有着一长串神秘字符串 ciphertext,为:
FRNRDuM9cKM14oMf6vgn0KS9DKOhDtLlEG9zvm2+uZS2avi/6p7R43NwPZNfxpwL6NSFwRWR2VnTE3DnaF2F4pNm4vi6vfDXxjcv6NDPCRxKXn71BLD92m2MFCNCEVSeDfwFuNGWP1SOCvT+FVghkf8eXVc04JiiaVTjwFi0X3xTXVDdv3N0XpO9EV8octD/XtDPvFLoFFrOXmpTXpTMDnSnDoyVDVagatMD2jMl4V9wxTn8xTiDaF9WcVrhrtG5xjn6vVNP6RAgPRO6DpnOwdcJDRcZuCMmcmi1DZBZcnc6BjHgwj2OXLLTX1SokFSJ2TDUrLTKDt0TuViDFtDXDfnJrRwR6mnmuVc6rvw7BCiLxTn8uN7o6d2UkKyNuf8KaNNRFuy9Ffx7B12eCl85u3cJu1iQxFiQEpxvafxruN0OEvwV4fpjBR9JCVA1FRXRvJwgulAgXvn7DfcVXCa1XJcDPRSxa12exvTzEpcVURayzr==
你可能会发现,这不是我们的 Base64 编码吗?然后放到解码网站上一跑,出了一车乱码。
如果你仔细看了完赛贴,那么容易发现以下几点提示:
- 声音是用来看的
- 密钥有 16 位
- 大部分答案在宣传片里
根据提示,我们仔细观察宣传片,在 013 出现的的时候会发现如下的帧:

你会发现这一帧中藏了一段完整的 python 代码:
charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/"
charmap = []
def gen_grid():
ptr = 0
for i in range(8):
row = []
for j in range(8):
row.append(charset[ptr])
ptr = ptr + 1
charmap.append(row)
def swap_row(i, j):
i = i % 8
j = j % 8
charmap[i], charmap[j] = charmap[j], charmap[i]
def swap_col(i, j):
i = i % 8
j = j % 8
for row in charmap:
row[i], row[j] = row[j], row[i]
def print_grid():
for row in charmap:
print("".join(row))
if __name__ == "__main__":
gen_grid()
print("Original Grid:")
print_grid()
key = []
ptr = 0
for item in key:
if (ptr // 8) % 2 == 0:
swap_row(ptr % 8, item)
else:
swap_col(ptr % 8, item)
ptr = ptr + 1
print("Encrypted Grid:")
print_grid()
阅读代码后,发现上述代码对字符集矩阵进行了初等行/列变换。而看向代码的第 \(34\) 行左右的位置,会发现一个空着的名为 key 的列表,这个时候我们就需要用到第二个提示了。
回到宣传片,会发现在宣传片的最后有着一段电话录音,第二个提示告诉我们密钥有 16 位,那么什么有 16 位呢?欸!就是我们的 8 位身份 ID + 8 位验证密钥。
依据 DTMF,在还原管理员所输入的号码后,我们得到了密钥 \(3,3,6,5, 3,2,0,0, 4,7,3,0, 1,3,7,6\),将它们填到程序中,得到如下字符矩阵:
6479/8+5
cadfhegb
kilnpmoj
IGJLNKMH
QORTVSUP
YWZ1302X
AyBDFCEz
sqtvxuwr
欸那我们直接将现有矩阵做 gen_grid 代码的逆变换,得到一个新的 charset,在一一对应替换掉简介中的字符,是不是就结束了?
并非,因为这里还有一层,这需要我们用上提示 \(1\),一句很抽象的话:【声音是用来看的】。
我们仔细听通话录音,会发现有着非常不和谐的滋滋背景声,这启示我们将视频的音频进行提取,放入 Audacity 中,打开频谱图,能够看到如下图象:

(注意,由于每个人提取音频的方式不大一样,可能会导致最终图像会出现细微的差别,不过不影响解密过程)
我们能看到字符串:HILBERTCURVE
上百度后,能发现,它提示我们一个名为【希尔伯特曲线】的工具,它能够提供一个高纬度空间到 \(1\) 维的一个映射,我们对得到的字符矩阵跑一个三阶二维希尔伯特曲线,得到字符集如下:
64ackIGilJLnfd79/he8+5bgojHMKmpNV30SUPX2EzrwuCFxvtBD1TRZWOQYAyqs
容易发现这个和原字符集构成双射关系,找到反映射,代换 ciphertext,得到如下字符串:
U2F2ZSBpdCB0byBmaWxlICJpZC5rZXkiOgpPWDNuS3JNcWhqaEo2bHFRL3FmVERkaFJUR242NGl1OHZlcUNUbEFDbWhaWmZMVzdWaFZLT2VCMlo0YkZpNDNBUTFTOGJsZmRUSFg4L0J5TW1uUGxremtsMGdIbjhhcG1zRUhIMHV1MGZnWHFIME5pOGtydXZqMXZLWUkyUUQ5MDE1ME1BZlJlZy9GZGcxcXBZNzBibGpRV1ltV1hZcUp4dGQrQXgvVzlaWGFLa28xL25aZEl5RndjZ2d3STBDdDh0Z3Y3dldaYzAxRzN5Mkk1M0JyeUJjN1ZKQk1CZXI1SGhZUXZMZmljQ2R2aDlDSGdaQWRoYThkV1ltSFoyanNKeC9FSmtCcFF2US9pUmVoY0NsTitvSHdjS0h6VUh6OEVWcmVQSFI5OWRGbmEzY2pjTG80U2M2WjRxSi8xMWloZmdGMTc0MjdZL2JVc0NsVW1POEdGK2c9PQ==
这个时候进行 Base64 解码,得到:
Save it to file "id.key":
OX3nKrMqhjhJ6lqQ/qfTDdhRTGn64iu8veqCTlACmhZZfLW7VhVKOeB2Z4bFi43AQ1S8blfdTHX8/ByMmnPlkzkl0gHn8apmsEHH0uu0fgXqH0Ni8kruvj1vKYI2QD90150MAfReg/Fdg1qpY70bljQWYmWXYqJxtd+Ax/W9ZXaKko1/nZdIyFwcggwI0Ct8tgv7vWZc01G3y2I53BryBc7VJBMBer5HhYQvLficCdvh9CHgZAdha8dWYmHZ2jsJx/EJkBpQvQ/iRehcClN+oHwcKHzUHz8EVrePHR99dFna3cjcLo4Sc6Z4qJ/11ihfgF17427Y/bUsClUmO8GF+g==
然后按照提示操作,保存下方字符串到根目录的 id.key 即可,进入第三阶段

浙公网安备 33010602011771号