跳转至

Sp.003 解谜 PaperClip100:球赛、机票、 脚本和 DDos 攻击

嗨,我是回形针的制作人吴松磊。

11 月 13 号晚,我们发布了回形针的第 100 期视频。

和你看到的一样,这支视频是一个解谜游戏。之后的两天两夜,有几千人参与到了这场共 3 个阶段的解谜行动中,最后在 11 月 15 日的下午 1 点 29 分 30 秒,一个名为 MashiroSaber 的 ID 首先完成了最终阶段的解谜。

接下来,我们会回顾这两天两夜究竟发生了什么,让我们从第一阶段开始吧。

(第一阶段)

关于完成第一阶段的所有线索都被刻意的放进了视频里。

首先是最明显的线索:倒放的录音。我们把开头倒放就能听到:

(录音:十二位数是球赛开始的时间)

然后视频里不自然的声音和结尾闪烁的频谱图会提示你找到这支视频的声音频谱图,我们会看到「REMARKS」和一个指向右边的箭头。

在视频发布后的 10 分钟内,这两条信息就被发布在了评论区、解谜群和社交网络。

而第一阶段最重要的线索,是这张隐藏在电脑桌面上的路线图。实际上在我们的发布的 100 期预告图中,也藏着这张图。做自动色调处理后,我们可以清晰看到全貌,我们的推理也将围绕它展开。

理解这张路线图的关键,是各个元素之间的连接关系。

右上角的 ipaperclip.net 与左上角的 Vol.G.56-1-1 相连,Vol.G.56-1-1 再链接左下角的两个 Vol,最后链接左上角的 12 个 X。

右下角 1111100s 的意思也很简单,把 2 进制转换成 10 进制就是 124s,也就是 2 分 04 秒。而Vol 当然是我们的节目的编号前缀,所以,这张路线图的意思已经很清楚了:

通过 ipaperclip.net 找到左上角的节目,根据左上角的节目找到左下角两个红圈里的节目编号,再通过这两期节目的 2 分 04 秒推理出左上角的 12 位数,结合倒放声音的线索,这 12 位数也就是比赛开始的时间。

那开始吧。

ipaperclip.net 是我们今年 4 月底发布的当代百科全书回形针手册的域名,在回形针手册的首页,可以很轻松的找到 G 类:交通运输/仓储/邮政业,展开这个类目下的子条目就能找到 56-1-1:航空旅客运输。

在这个条目的底部有一个相关视频,这就是左上角这串字符对应的视频——第 21 期:如何科学的给机票定价。

这时就需要用到第二个线索了,REMARKS 和向右的箭头。

仔细观察机票这期,你可以在登机牌上找到 REMARKS——一串备注编号,即使你没发现,如果注意到原视频的系统时间 1 分 50 秒的话你也可以找到这张登机牌。

现在,我们有登机牌,有 REMARKS 和箭头,我们要找的是左下角两个代表节目编号的红圈里的数字。

红圈、数字、箭头,把备注编码移动到右边的红圈里,对齐,答案就出现了,69 和 52。

在回形针第 69 期和 52 期的 2 分 04 秒可以找到一张验光单和球赛结束的画面,时间相减,就是球赛开始的时间:2019 年 5 月 20 日 9 点 50 分。

即使不把 7 对齐,两个红圈也只能圈出 8 种组合,但只有 69 和 52 这一组才能找到球赛。

把时间代入右上角的网址,输入机票上的常旅客号码,拔插头插上,进入第二阶段的倒计时就开始了。

当然,还有一种非常曲折的解谜方式,在这里就不赘述了。

无论如何,视频发布后的 64 分钟, 11 月 13 号 21 点 48 分 ,一个来自广东的 IP 第一个登上了这个网址,插上了插头。

之后,我们会在直播画面里看到开始有人陆陆续续登录网站,玩弄一会插头,再把插头插上。

另一方面,不少程序员也开始了暴力破解,因为 12 位数是时间格式,所以破解需要花的时间并没有那么长,11 月 16 日凌晨 2-3 点,多个暴力破解项目陆续完成,凌晨 3 点 21 分,第一阶段的网址被公布在了直播弹幕中,网站在线人数开始激增。

此时倒计时还剩下 6 个半小时。

天亮后,随时进入网站的人越来越多,参与解谜的玩家也出现了两种声音。

一类是主张拔掉插头的「拔派」,一类是希望插上插头的「插派」。

拔派希望让更多的人参与到第二阶段,因此呼吁大家拔掉插头,所以出现了高速插拔的机器脚本,让正常的玩家则完全没有机会控制插头,而倒计时也基本停滞。

为了击败拔派,插派也用上了「防拔插」脚本。

这类脚本的原理都非常类似,因为正常用户的 IP 地址只能用鼠标点击的方式做单次控制,而脚本可以通过控制一个上千个 IP 的 IP 池在几秒内轮流执行插拔操作,从而完全控制插座。

「防拔插」脚本的运行,让插头被死死的焊在了墙上。以致于你根本看不到插头的变化,只能通过电量变化感受你确实让插头断开了零点零几秒。

由于大量脚本的存在,从 14 日 9 点 40 分,网站的 TCP 连接数就开始飙升,从 1200 到 2000,一度达到 6059 。而在 17 点 50 分,我们的源站 IP 又经历了一轮峰值高达 16.57Gbps 的 DDoS 攻击,此时后端接口已经完全失效,无法支持第二阶段的游戏。

所以在倒计时到 15 分 13 秒的时候,所以我们不得不暂停计时,开始搬家,为第二阶段找一个可以配置 DDos 防护的新 IP 和新网址。

晚上 10 点 20 分,新网站重新上线,同时我们也为 15 分 13 秒设计了一个新谜题,谜底是第二阶段的新网站。

这是一个比较简单的谜题,时间线索会让你找到 1 分 33 秒和 3 分 11 秒,对比第 15 期和 13 期这两个时间点的画面,可以很容易找到这位大叔的脱发面积,也就是右下角新网站的地址:100-140cm.ipaperclip.net。

到 10 点 42,已经有人成功进入网站插上插头,之后,网站的连接人数开始飙升。

终于,11 月 14 号 23 点 09 分,倒计时结束,第二阶段开始了。

(第二阶段)

倒计时的目的是为了让没有第一时间看到视频的观众都有机会参与,也是在为第二阶段积累玩家。

第二阶段的初衷是想让大家交个朋友,所以我们设计了一个实时反馈,并且需要参与者相互协作完成通关的游戏。

这是我的设计初稿

红色色块是障碍物,碰到就失败,蓝色色块是敌人,可以用攻击消灭。通关条件是碰到这两个黄色色块。

而下面的 20 个跳和 20 个攻击按钮则对应回形针在这个位置做出的动作,每个按键点击的人数越多,跳的越高,攻击力越大。

再做些微调,加入美术,就是第二阶段直播的游戏了。

每轮开始之前有 30 秒准备阶段,每一轮每个玩家都可以对每个按钮都可以选择按或者不按。倒计时结束后,回形针会按照准备阶段所有玩家的按钮数值行动,一轮游戏结束后,数值清空,再次进入 30 秒的准备阶段。

前四格的的设计目标主要是教学,玩家需要在前三格不跳,用攻击消灭第一个敌人,然后用一个足够高的跳跃数值跳过后两个障碍物。

而如果有人故意在一开始就点跳,那么就永远无法通过前三格。

对于进入第二阶段的玩家,第一反应会认为这是一个投票游戏,攻击和跳跃哪个的票数高就执行哪个动作,但其实没那么简单。选择跳是不够的,跳的高才是关键。

经过混乱的前 30 分钟,玩家第一次合作通过了前 4 格。到凌晨 1 点 20,所有在线的玩家已经可以通过合作,把游戏进度推进到 50%,但在凌晨 1 点 53 分,脚本哥出现了。

我们无法得知这名玩家的 ID ,所以只能和弹幕一样叫他「脚本哥」。

脚本哥的方案是在浏览器控制台添加一段向服务器不停发送请求的代码,从而提高每个按钮的点击数值。

但即使可以刷数值,要通关也没那么容易,而脚本哥不仅写出了脚本,还找到了 bug,在本应该跳起来必死的游戏的起点直接跳到了终点。

这个 bug 和我们游戏的实现方式有关。

游戏里回形针跳跃的本质上是在 Y 轴的移动,以某个速度上升再落下。看起来上升是一个连续的过程,比如它可以像这样在 1 秒内上升 450 个像素,但其实没那么连续。

我们的游戏设定为 45 帧,这意味着看起来流畅的游戏画面其实是由每秒 45 个静态画面连续切换构成的。那么刚刚这个跳跃的本质其实是「每秒位置改变了 45 次,每次瞬移 10 个像素」。

而判断回形针是否死亡,则是在每次瞬移结束后,检测回形针是否和障碍物在坐标上重叠,如果重叠,就判断为死亡。像这样:

所以,理论上来说,只要每秒瞬移的距离够大,是可以直接穿过障碍物而不判定为死亡的。

这个文件夹的尺寸是 50*50,为了每帧能瞬移 50 个像素,每秒的跳跃高度需要超过 2250 像素。

而脚本哥显然可以做到,用每秒 6510 像素的超级撑杆跳直接跳到了终点。

虽然这种通关方式完全在我们的意料之外,但意外也是这场游戏的一部分,第二阶段开始 3 小时后, 11 月 15 日凌晨 1 点 59 分,第三阶段的入口打开了。

(第三阶段)

如果你正常完成了第一阶段,那么在脚本哥通关的一瞬间,你应该就能看懂这张通关画面。

左边的图形和 52 期 2 分 04 秒的球赛结果完全一致,而右边是 SHA-1,一种哈希加密算法。如果你看过回形针第 75 期,应该就还能记得,任何数值经过哈希加密都可以得到一串 40 位 16 进制的字符串。

所以,把左边的信息用 SHA-1 加密,加上后缀 ipaperclip.net,就是最终阶段的页面了。为了防止你不确定要加密哪个词,只要输入对了这 5 种组合中的任意一种都可以定向到最终页面,就是这里:

网页里很清楚写明了最终阶段的规则,根据这个页面线索推理出 ABC 三个路线的对应条目,完成编辑,就能获得对应的奖品,编辑记录的时间会作为最终排名的依据。

这里藏着两条线索,一条是页面背景里的图像,简单处理后我们可以看得很清楚。

另一条是 ABC 路线奖品图片里左上角的数字,我们也处理一下,分别是 0300、0235、0350。

看起来是不是有点熟悉?

确定节目编号,找到时间,推理答案。

如果这三个数字是时间,那就很清晰了,只要找到 ABC 三个路线分别对应的节目编号,对应时间的画面就是谜底。

再看看黑色方块里的 1 和白色方块里的 0,其实对应的是原视频里三个奖品的黑白闪烁。

奖品 A 是黑白黑白黑白,也就是 101010,换上成十进制为42,即第 42 期节目。同理,奖品 B 是 10101 ,第 21 期,奖品 C 是 101,第 5 期。

所以路线 A 对应的条目是回形针第 42 期的 3 分 0 秒——宠物饲养,所以路线 B 对应的条目是回形针第 21 期的 2 分 35 秒——航空旅客运输,而路线 C 对应的条目是回形针第 5 期的 3 分 50 秒——影视特效创作。

进入这三个条目,你会看到我留好的位置,完成编辑,解谜就完成了。

我们可以通过查看回形针手册全站的编辑记录找到最先编辑这三个条目的用户。

在第三阶段开始 12 小时后, 11 月 15 日 13 点 29 分,第一条正确的编辑记录出现在了路线 C 对应的「影视特效创作」,编辑者的 ID 是 MashiroSaber。第一名出现了。

下面是他的获奖感言:

根据规则,他选择了线路 C ,所以获得的也就是线路 C 的奖品:大于 10000 元的回形针节目抽奖周边,但也错过了A——价值 1 万 5 的抽粪三轮车,B——价值 1 万 1 的纯金金条。

而之后到达的 9 人则可以获得剩下奖品的碎片,A 是抽粪车的轮子和抽粪管,B 是金块,C 是周边小礼包。

恭喜大家,你们都很厉害!

最后,我想聊聊这次谜题设计的基本原则:

1.为了让尽可能多的观众参与,所有谜题不需用到复杂的专业知识也能解开。

2.所有刻意给出的线索都有意义,都是推理链条里的必须要素。而其他辅助线索即使找不到也可以完成解谜。

3.尽可能让逻辑链相互衔接。比如通过对常旅客号码、球赛画面、二进制、节目编号等线索的重复使用,即使单个环节被暴力破解,也无法完成顺利通关。

另一方面,我也发现很多观众在解谜群里找到了自己的同类,找到和自己兴趣一样的人并不容易,让回形针的观众都能成为朋友,也是我们第 100 期节目的初衷。

无论如何,和你们在一起玩很开心,拜拜。