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

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

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

看到的那条消息。

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

同请参阅本题目官方题解

过程

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

谜题入口(Entry)

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

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 字符都跳过去了)

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

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

拿着手机上的 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

网页主要内容:

<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!,即可进入下一关。

页: 1 2 3


Comments

《 “一只菜鸡关于《Project NANO》的解谜记录” 》 有 2 条评论

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

  2. […] 之前写过了一篇选手视角的题解,亦可以作为参考:一只菜鸡关于《Project NANO》的解谜记录 […]

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

To respond on your own website, enter the URL of your response which should contain a link to this post’s permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post’s URL again. (Find out more about Webmentions.)