《毁灭战士》连续运行两年后因整数溢出崩溃,玩家复现32年前经典漏洞
9月18日,诞生于1993年的经典游戏《毁灭战士》近日因一项持续两年的极限测试引发关注。一位名为明基(Minki)的技术爱好者在运行该游戏近两年半后,成功复现了一个源于原始代码的整数溢出漏洞,导致游戏最终崩溃。
明基使用了一台2003年上市的华硕MyPal A620掌上电脑(Pocket PC),搭载Windows Mobile系统和英特尔XScale ARMv5芯片。他通过DIY改装,为该设备配备了基于18650锂电池的不间断电源(UPS),并接入路由器USB口以维持5V稳定供电。在几乎忘记这个实验的存在后,他在近日发现设备屏幕上最终弹出了应用程序崩溃的提示。
崩溃的根本原因可追溯至《毁灭战士》原始代码中的一个设计细节。游戏在“吸引模式”(无人操作自动演示状态)下每次播放新演示文件时,其内部计时变量“gametic”不会被重置。该变量以35Hz的频率递增,被存储为32位有符号整数,最大值为2,147,483,647。一旦超过该值,便会发生整数溢出,在x86架构中会跳转为最大负值,最终导致游戏崩溃。
根据计算,以原版35Hz频率运行,溢出时间约为1.95年。而明基的实验持续了约两年半,推测与其使用的WinDOOM Windows CE移植版本(Doom4CE)有关——该版本可能将计时频率调整为30Hz以提升在老硬件上的稳定性,从而使溢出时间延长至约2.26年,更接近实际运行时长。
《毁灭战士》自发布以来凭借海量Mod和玩家自制内容保持着持久生命力,但几乎无人让游戏连续运行如此之久。此次实验不仅验证了原始代码中一个被忽视的边界问题,也展现出经典软件在极端条件下的有趣行为。