经过几手转发,从 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范围,否则你看到的结果可能是缺字的。
结合最近哔哩哔哩刚刚迁移到 BV 号,可以看出中间那一串其实是一个视频编号:16x41167rY(要注意那个编号是区分大小写的)。塞进哔哩哔哩的搜索,可以得到如下视频:
可以看出视频的 UP 主也是出题人员之一,然后视频里面有不少求原曲名的评论,只是没见到回答的样子。
拿着手机上的 Shazam 对着电脑试了好几次,才试出来了结果:
曲名叫做《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 解析设置教程。
A记录使用场景添加
题目里面给了一个域名,然后各种提示里面指向了 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!,即可进入下一关。
发表回复