一只菜鸡关于《Project NANO》的解谜记录 经过几手转发,从 Telegram 上面发现了一个解谜游戏,名叫《Project Nano》。至于它是什么《Nazo: Phi Project》的回应云云的一系列经纬我也不得而知了。当然,至于为什么要叫做「不完整解谜记录」,单纯是因为俺太菜,卡了不知多少次关,而且(暂时还)没有解出来而已。就是这样。感谢各位大佬的倾力提示(有时候差点答案就出来了)终于完成了这个记录。 其实本来还想过要不要用英文写这篇文章,后来想了想题目都是中文的,翻译起来还麻烦,就还是用中文好了。 看到的那条消息。 pp.ua Project NANO: A Talion to Project Nazo NANO: Not A Nazo Organisation 至于为什么题图写了纳威语,单纯是因为最后组队的时候队名用了纳威语。Photo by Nina Ž. on Unsplash。 同请参阅本题目官方题解。 hanlin.press Project NANO: Official Writeup – 翰林的小站 #00 一些废话 By abc1763613206 新年好!自从我们发布 Project NANO 解谜项目到现在,已经过去了大约八… 过程 来逐步看一下吧。这套谜题的主要特征是大部分页面有与背景颜色相同的提示,以及作为延伸提示的各种看起来像「聊天日志」的东西。 谜题入口(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 字符都跳过去了) 那行字的完整展示例。好好说话的话是「复制这行话【16x41167rY】转移至 bilibili 打开(doge)(斜眼)好像不太对劲?」。顺便吐槽一下这个出题者好像是前后鼻音不分的样子,「对劲」是 duìjìn 不是 duijing。 结合最近哔哩哔哩刚刚迁移到 BV 号,可以看出中间那一串其实是一个视频编号:16x41167rY(要注意那个编号是区分大小写的)。塞进哔哩哔哩的搜索,可以得到如下视频: 【听Music】Unturned Theme_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili Unturned%0AUnturned%20Theme%20OST 可以看出视频的 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-阿里云 解析记录类型云解析支持的记录类型包含: A记录CNAME记录MX记录AAAA记录TXT记录URL显性/隐性转发NS记录SRV记录CAA记录 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!,即可进入下一关。 Related 第1页 第2页 第3页