《Debug》Stage 2 攻略

嗨嗨~ 米娜桑早上好,通关还顺利吗?是否卡在了阶段【Access Denied! Reason: Key file not found】呢?

顺利通关 Stage 2 的小伙伴可以在评论区留下自己的通关感想哦~

作为第二关的设计者和制作者,现在来向大家介绍 Stage 2 的解密方法。

首先我们会发现简介中有着一长串神秘字符串 ciphertext,为:

FRNRDuM9cKM14oMf6vgn0KS9DKOhDtLlEG9zvm2+uZS2avi/6p7R43NwPZNfxpwL6NSFwRWR2VnTE3DnaF2F4pNm4vi6vfDXxjcv6NDPCRxKXn71BLD92m2MFCNCEVSeDfwFuNGWP1SOCvT+FVghkf8eXVc04JiiaVTjwFi0X3xTXVDdv3N0XpO9EV8octD/XtDPvFLoFFrOXmpTXpTMDnSnDoyVDVagatMD2jMl4V9wxTn8xTiDaF9WcVrhrtG5xjn6vVNP6RAgPRO6DpnOwdcJDRcZuCMmcmi1DZBZcnc6BjHgwj2OXLLTX1SokFSJ2TDUrLTKDt0TuViDFtDXDfnJrRwR6mnmuVc6rvw7BCiLxTn8uN7o6d2UkKyNuf8KaNNRFuy9Ffx7B12eCl85u3cJu1iQxFiQEpxvafxruN0OEvwV4fpjBR9JCVA1FRXRvJwgulAgXvn7DfcVXCa1XJcDPRSxa12exvTzEpcVURayzr==

你可能会发现,这不是我们的 Base64 编码吗?然后放到解码网站上一跑,出了一车乱码。

如果你仔细看了完赛贴,那么容易发现以下几点提示:

  1. 声音是用来看的
  2. 密钥有 16 位
  3. 大部分答案在宣传片里

根据提示,我们仔细观察宣传片,在 013 出现的的时候会发现如下的帧:

1

你会发现这一帧中藏了一段完整的 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 中,打开频谱图,能够看到如下图象:

2

(注意,由于每个人提取音频的方式不大一样,可能会导致最终图像会出现细微的差别,不过不影响解密过程)

我们能看到字符串: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 即可,进入第三阶段

posted @ 2025-11-13 07:45  Larry76  阅读(16)  评论(0)    收藏  举报