分类
大千 中文文章

一只菜鸡关于《Project NANO》的解谜记录

经过几手转发,从 Telegram 上面发现了一个解谜游戏,名叫《Project Nano》。至于它是什么《Nazo: Phi Project》的回应云云的一系列经纬我也不得而知了。当然,至于为什么要叫做「不完整解谜记录」,单纯是因为俺太菜,卡了不知多少次关,而且(暂时还)没有解出来而已。就是这样。感谢各位大佬的倾力提示(有时候差点答案就出来了)终于完成了这个记录。

其实本来还想过要不要用英文写这篇文章,后来想了想题目都是中文的,翻译起来还麻烦,就还是用中文好了。

看到的那条消息。

至于为什么题图写了纳威语,单纯是因为最后组队的时候队名用了纳威语。Photo by Nina Ž. on Unsplash

过程

来逐步看一下吧。这套谜题的主要特征是大部分页面有与背景颜色相同的提示,以及作为延伸提示的各种看起来像「聊天日志」的东西。

谜题入口(Entry)

黑色背景,白色文字,「这啥???」
下面有八个彩色方块。
最后一行反白,写着「3983153e.log」。
入口第一步

第一步的谜题是一排色块。「日志」上写:

ZeroMe Logs | Mar 26, 2020.
泠 16:32:12
你知道三原色是什么吗?
霂 16:32:17
红黄青。
泠 16:32:25
我说光的。
霂 16:32:31
……RGB啊!
[时序碎片: 51 51]
    <div class="not-here">
        <p>这啥????</p>
        <div>
            <div class="color-block" style="background-color: rgb(65, 87, 69)"></div>
            <div class="color-block" style="background-color: rgb(83, 79, 77)"></div>
            <div class="color-block" style="background-color: rgb(69, 46, 32)"></div>
            <div class="color-block" style="background-color: rgb(110, 101, 120)"></div>
            <div class="color-block" style="background-color: rgb(116, 32, 58)"></div>
            <div class="color-block" style="background-color: rgb(32, 47, 116)"></div>
            <div class="color-block" style="background-color: rgb(119, 111, 102)"></div>
            <div class="color-block" style="background-color: rgb(111, 111, 116)"></div>
        </div>
        <p class="what-is-this">3983153e.log</p>
    </div>

源码里面的一串数字,基本上都是六十几到一百二十左右,可以算是明显的 ASCII 特征。把那些数字提出来,塞进你喜欢的工具,转换出来的是下面一行字:

AWESOME. next : /twofoot

/twofoot 就是下一步的链接了。

Two foot

网页关键内容:

<title>Can't you see what's wrong?</title>
<!-- ... -->
<div class="not-here">
    <p class="what-is-this">No hint!</p>
    <p>本关的题目就在画面上</p>
    <p>什么?你没看到吗?或许… 你需要去配眼镜了(讨打)</p>
    <p class="what-is-this">...</p>
</div>

“Can’t you see what’s wrong?”

第一个卡关的地方,谁知道那个 wrong 说的是语法错误了呀摔。搞得我还试了试 yes 或者 no 这种回答,orz。因为是语法错误,所以……
two foot feet

Two feet

关键内容:

<div id="not-here">
    <p class="what-is-this">答案用下划线代替空格,全小写</p>
    <p>********,你有听说过吗?</p>
    <p>它里面有首歌挺好听的,但只有短短的几秒。</p>
    <p>你能帮我找到原曲吗?谢谢啦。</p>
    <p>给,这是一个视频,供参考。</p>
    <p class="what-is-this" onclick="ido.not.know()">视频呢?</p>
</div>
<div id="-qu" class="why-can-not-see"><pre><code>
=EA=93=9Du=E7=BD=AE=E8=BF=99h=CE=B1=D0=B8g=E8=AF=9D=C2=A2=E2=87=92=F0=9D=9F=99=F0=9D=9F=A8=D1=85=F0=9D=9F=BA=F0=9D=9F=A3=F0=9D=9F=A3=F0=9D=9F=A8=F0=9D=9F=BDrY=E2=87=90=C2=A2=E8=BD=AC=E7=A7=BB=E4=BE=84b=C3=AC=C5=82=C3=AEB=C3=AFLi..d=D0=B0k=CE=B1=C3=AC=C2=A2d=D0=BEge=E2=87=90.=E2=87=90=E5=A5=BD=E6=A9=A1b=E1=88=80=E9=92=9B=E5=AF=B9j=C3=AC=D0=B8g=EF=BC=9F
</code></pre></div>
<script>ido=[];ido.not=[];ido.not.know=function(){document.getElementById('-qu').className="";document.getElementById('not-here').className="why-can-not-see"}</script>

基本上就是有个视频,要报出歌名来。UI 方面呢,点一下那个看不见的「视频呢?」文字会出来一串代码。

=EA=93=9Du=E7=BD=AE=E8=BF=99h=CE=B1=D0=B8g=E8=AF=9D=C2=A2=E2=87=92=F0=9D=9F=99=F0=9D=9F=A8=D1=85=F0=9D=9F=BA=F0=9D=9F=A3=F0=9D=9F=A3=F0=9D=9F=A8=F0=9D=9F=BDrY=E2=87=90=C2=A2=E8=BD=AC=E7=A7=BB=E4=BE=84b=C3=AC=C5=82=C3=AEB=C3=AFLi..d=D0=B0k=CE=B1=C3=AC=C2=A2d=D0=BEge=E2=87=90.=E2=87=90=E5=A5=BD=E6=A9=A1b=E1=88=80=E9=92=9B=E5=AF=B9j=C3=AC=D0=B8g=EF=BC=9F

这串东西是电邮里面常用的一种二进制的表现形式(RFC 2047),用 = 后面跟上两个十六进制位来表现一字节。把他们适当的处理一下,塞进你喜欢的工具,会发现这是一套 UTF-8 编码的字符串:

ꓝu置这hαиg话¢⇒𝟙𝟨х𝟺𝟣𝟣𝟨𝟽rY⇐¢转移侄bìłîBïLi..dаkαì¢dоge⇐.⇐好橡bሀ钛对jìиg?

顺便,正确显示这行字需要你的电脑安装的字体足够覆盖很大一部分Unicode范围,否则你看到的结果可能是缺字的。

缺字的例子(当然,这个缺字不是因为字体的原因,而是不知道为什么这个人把所有的 ASCII 字符都跳过去了)
上面那行火星文的截图。
那行字的完整展示例。好好说话的话是「复制这行话【16x41167rY】转移至 bilibili 打开(doge)(斜眼)好像不太对劲?」。
顺便吐槽一下这个出题者好像是前后鼻音不分的样子,「对劲」是 duìjìn 不是 duijing。

结合最近哔哩哔哩刚刚迁移到 BV 号,可以看出中间那一串其实是一个视频编号:16x41167rY(要注意那个编号是区分大小写的)。塞进哔哩哔哩的搜索,可以得到如下视频:

可以看出视频的 UP 主也是出题人员之一,然后视频里面有不少求原曲名的评论,只是没见到回答的样子。

Bilibili 用户信息:
用户名:FlyingSky-襥鯻嶾鷉鎅
简介:每个人的裂痕,最后都会变成故事的花纹。
关注数:77
视频上传者
Telegram 群截图:FlyingSky 是群「Project NANO」的管理员,头衔为「不在线」。
谜题讨论群组的管理员之一

拿着手机上的 Shazam 对着电脑试了好几次,才试出来了结果:

Tears From Heaven by John ’00’ Fleming

曲名叫做《Tears From Heaven》,按照规则转换一下,结果就成了 tears_from_heaven

Tears From Heaven

网页主要内容:

<main class="content">
    <p class="domain">🤔<span class="hidden">.clang.pp.ua</span></p>
    <p class="hidden">bd12b4bc.log</p>
</main>

指向的「日志」内容:

ZeroMe Logs | Mar 31, 2020.
abc 22:31:12
小猪啊,隔壁让我出道签到题。
不然对别人来说,一开头就整个开幕雷击,也太自闭了。
Piggy 22:32:10
思考
abc 22:33:34
诶,小猪你好喜欢思考啊,你看我弄来了什么?
Piggy 22:35:58
思考
看上去你这个域名确实存在,浏览器访问的话似乎又提示不存在,真是一个令人费解的问题。
abc 22:36:41
呐,给你看篇文章,你研究研究这个域名哪里还能藏东西……
[解锁新的文章碎片: aHR0cHM6Ly9oZWxwLmFsaXl1bi5jb20va25vd2xlZGdlX2RldGFpbC8yOTcyNS5odG1s]
[时序碎片: 30 31]

「文章碎片」是一个 Base64 编码的网址,文章主要介绍的 DNS 解析设置教程。

题目里面给了一个域名,然后各种提示里面指向了 DNS 记录里面可能藏了什么。DNS 记录里面有一个被「惯用」于藏东西的地方就是 TXT 记录。然后那个 emoji 通过 Punycode 转换成 ASCII 之后就可以丢进 dig 里面查询了。把 🤔.clang.pp.ua 打进地址栏,Chrome 会自动转换 Punycode 出来 xn--wp9h.clang.pp.ua。接着:

dig xn--wp9h.clang.pp.ua txt
; <<>> DiG 9.10.6 <<>> xn--wp9h.clang.pp.ua txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64045
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;xn--wp9h.clang.pp.ua.		IN	TXT
;; ANSWER SECTION:
xn--wp9h.clang.pp.ua.	299	IN	TXT	"https://clang.pp.ua/Simp1E_Dec"
;; Query time: 284 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Apr 12 12:52:36 UTC 2020
;; MSG SIZE  rcvd: 92

嗯。看见了吧。

Simple dec

米色背景,居中一个黑色问号,下面是粉色的横框,框里面黑色文字「Fill your password here...」,框下面有紫色按钮「Submit!」
页面截图

网页主要内容:

<main class="content">
    <p class="question">?</p>
    <br />
    <input type="text" placeholder="Fill your password here..." maxlength="5" class="input" />
    <br />
    <button class="submit">Submit!</button>
    <br />
    <p class="hidden">87bbdc78.log</p>
</main>
<input type="text" class="fake-input" />
  <script>
    const inputBox = document.querySelector(".input");
    inputBox.addEventListener("focus", () => {
      document.querySelector(".fake-input").focus();
    });
    document.querySelector(".submit").addEventListener("click", () => {
      const path = magic("\xef\xbb\xe4\xb1\xd9\xc2\xd3\xfc\xf7\xf9", inputBox.value);
      if (!/^[0-9A-Za-z_\-]+$/.test(path)) {
        alert("Wrong Answer!")
      } else {
        // However, there's still a chance that you entered a wrong answer;
        location.pathname = "/" + path;
      }
    });
  </script>

 那段混淆 JS 的内容放在这里了。放在博客里面直接渲染有点炸。

「日志」内容:

ZeroMe Logs | Apr 1, 2020.
abc 00:21:22
小猪啊,现在这里又有一个文本框,出题人告诉我输入密钥就能通关。
Piggy 00:22:10
是啊,我只知道密钥是 Talion ,但是好像输不进去的样子。
abc 00:23:58
对,有什么东西阻挡住了,得想办法移走他。
Piggy 00:24:42
……
[时序碎片: 31 35]

基本上看代码逻辑的话,里面有一段:

if (!/^[0-9A-Za-z_\-]+$/.test(path)) {
    alert("Wrong Answer!")
}

就是说符合字母、数字、下划线、中划线的算作「Wrong Answer!」,很显然这里有些问题,因为这个规则是解谜开始之前定下来的答案格式。我们把前面的否定符(!)去掉后,在输入框里盲打 Talion(因为输入框是个假的,实际的输入框被 CSS 藏起来了,但是转移焦点的逻辑还在),然后点 Submit!,即可进入下一关。

《一只菜鸡关于《Project NANO》的解谜记录》上的一条回复

大学学的信息安全,就像是其他专业有acm,每年学长都会给我们准备ctf的题。
回想起来当时和同学通宵做题抢分,真是有意思。
一转眼都毕业三年了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*