C64《Mercenary》(1985):开局就能触发的一个新漏洞

查看原文 HN 讨论

文章摘要

这是 Games Explained 网站为 Commodore 64 经典游戏《Mercenary》(1985 年,Novagen Software 发行,Paul Woakes 制作)做的一个”迷你站”。页面称它为”开放世界的鼻祖级杰作”:你的飞船坠毁在行星 Targ 上,可以自由探索一座有 233 栋建筑的线框 3D 城市,以及城外和高空的各种去处。整页内容是贡献者 air 逐条反汇编原版游戏代码后写出的技术解读,共 23 节,附带大量可交互的移植演示:飞行、地下房间、物体目录、电脑 Benson 的说话声音、数学例程,都是把 6502 汇编逐个例程移植到网页上,并在 6502 模拟器中与原代码逐字节对照验证过。

标题里的漏洞:开局草地上的隐形电梯。 你开局坠落在城市方格 08-08,巨大的殖民飞船(Colony Craft)就悬停在你正上方 64997 的高度,地面上这里本来没有电梯。但从降落点出发、朝西北走大约 14 秒(约 100 步),有一块边长 1024 单位、肉眼看不出任何标记的草地,在这里按 E 键,游戏会把它当成殖民飞船甲板上的电梯:你”下行”进入殖民飞船的机库(8 号房间),再按一次 E,就上到了甲板,高度显示 64997。原因很简单:殖民飞船悬在 08-08 上空,所以甲板和下方草地共用同一组 X、Y 坐标,只有高度不同;而 E 键的判定只检查所在方格和 X、Y 的中间字节,从不读取高度。于是甲板电梯正下方的那块草地,表现得和电梯一模一样。作者说这个漏洞对游戏的破坏没有想象中大:8 号机库的三扇门都锁着,开局时你最远只能到机库和甲板,基本上唯一的出路就是坐”特快电梯”,也就是直接从殖民飞船顶上走下去,一路翻滚摔回城市。页面给出了复现步骤:等开场动画播完、Benson 打出”CRASH LANDED ON TARG”后,右转八分之三圈面向西北,走 14 秒左右按 E;最稳妥的办法是在 VICE 模拟器的监视器里直接改坐标。

其他发现,挑几个有意思的。

HN 评论精华

这个帖子只有 63 分、11 条评论,讨论很少。之后还有人以「C64 Mercenary: a novel exploit bug in a 41-year-old game」为题重复提交了两次,都只有 dang 留下的指向本帖的链接,没有额外讨论。

漏洞是怎么发现的。 提交者 a1r(也就是页面的贡献者 air)总结说:在起点西北方向约 100 步处有一块隐形草地,作者忘了做高度检查,按 E 就能传送到头顶上方的殖民飞船,”这个 bug 41 年来一直没被人注意到”。paulgerhardt 问他是怎么找到的,能不能用于速通跳关。a1r 回答说,他做了一个用于自动化逆向工程、专门寻找有趣 bug 的技能(skill),是 Opus 5.5 发现了这一个,相关源码已放在 GitHub 上。至于速通的问题,systemnate 提醒文章里已经写了:机库的门都锁着,到了甲板也只能跳下来。

怀旧。 aenis 说这款游戏对他影响巨大,他 9 岁时在 Commodore Plus/4 上玩:”那种自由探索的感觉!城外远处的隐藏电梯,可以摧毁的建筑,还有那颗卫星!”amiga386 悼念了 2017 年 7 月 15 日去世的作者 Paul Woakes,并用游戏里的梗致意:”愿他那至关重要的 12939 永不断供。”uzidil 分享了自己大约十年前做的一个网页版致敬作品,aenis 说他今年本来想自己移植,现在不用了。TacticalCoder 说自己当年有 C64、各种游戏、工具和一个可以冻结程序改内存数值的”Power Cartridge”,C64 是他多年的全部生活,可他竟然没听说过《Mercenary》,惊叹于在那么少的内存和资源下能做到这些;他的结尾是:”告辞,我要去为下一个网站加载的 JavaScript 体积哀叹了。”salvarito 称赞网站的讲解非常细致,Razengan 则说他总有一天要把《M.U.L.E.》也研究透。