任意代码注入(漏洞)

  Dream 探险套装 Sprite.png未完成  
  Bag 防尘护目镜 SV Sprite.png非正式术语  
来自神奇宝贝百科


任意代码注入是在多个宝可梦游戏中出现的一个比较高级的漏洞,当它被触发时,玩家可以在游戏机中执行任何他们想要的代码。

原因

在任何机器上的数据存储都可以归为两类:ROM(只读存储器)和RAM(随机存取存储器)。在游戏机中,ROM包含了不能修改的游戏的代码(除非对游戏卡进行物理修改),而RAM包含了可以改变的数据,包括存档的内容(SRAM),屏幕显示的内容(VRAM),和其他的变量(比如玩家是否在对战中,或者当前播放的音效,以及其他任何需要临时存储的值,比如公式的中间结果)。(后两者在机器电源切断时会被清空)

处理器的指令计数器指向下一行应该被读取、执行的代码的内存位置。在正常的情况下,指令计数器在读取一行代码后自增1,依次读取各行代码;但是在很多情况下,某行代码会使指令计数器向其它位置跳转(比如某些代码行只在特定的条件下运行,否则就要被跳过;或者某些情况下,游戏需要等待一个特定的条件触发,才能继续,而且在这之前必须不断地检查这个条件)。造成指令计数器跳转的指令被称作转移指令。正常情况下,所有游戏代码都在ROM中,而所有转移指令都应指向ROM中的一个地址。指令计数器的工作只是简单地读取并执行它指向的任何存储器地址(然后自增1)。错误的转移指令可能会使指令计数器从一个意外的位置开始读取无用值,然后试着将它们解释为代码执行,于是造成未预料的结果。

因此,当某些错误的代码包含了一个指向RAM而不是ROM的转移指令时,任意代码注入漏洞就发生了。由于RAM的值是可以由玩家控制的,玩家可以更改这些可变的值,来注入、执行任意的代码。

任何数量的错误道具,错误招式等都可能允许任意代码注入,因为它们的效果是开发者们没有预料到的,从根本上就是错误的代码。例如,一个普通的道具可能让指令计数器跳转到某处来执行道具的效果(例如,回复一只宝可梦的HP);然而错误道具可能使指令处理器跳转到一个意外的位置,从而开始执行错误指令。

任意代码注入漏洞允许玩家做游戏机硬件可达成的几乎任何事情,具有巨大的潜力,可以看作是“越狱”了游戏机。借助此漏洞,玩家可以在平台上编写新的图形、音乐,甚至是全新的游戏。

方法

在发现一个让指令计数器跳转到RAM的漏洞后,通常跳转到的初始位置很难由玩家控制(例如声音数据)。所以,任意代码注入者通常先在这里执行一小段代码,进行另一个跳转,使指令计数器跳转到一个更加容易更改的内存地址。例如:玩家的同行宝可梦宝可梦寄放系统的数据,包包的内容等。在这一步完成以后,玩家便可以准备好在第二块内存区域内注入代码,让游戏机执行,然后执行第一次跳转(通过使用错误道具,错误招式等),跳转到注入代码的内存区域,执行注入的代码。

对于更加复杂的利用,上面的“两步”跳转可能并不够,因为容易更改的位置(包包宝可梦寄放系统等)的空间终究会耗尽,不足以继续编写代码。然而,将上面的过程扩展为三步是有可能的,这时第二步代码的效果就是向第三步的位置中写入更多代码(相当于一个写入器的作用)。第三步的位置包含更多空间,但不能被玩家轻易修改。一旦第三个区域中写入了足够的代码,玩家就可以将第二处的代码变为一个转移到第三处的指令。这样就可以执行更多代码。[1]

理论上也可以通过某些程序,直接从控制器输入代码并执行,而不必把它们先存储起来。然而这种方法比较复杂,需要准备很多代码,目前无法在不改变游戏的代码和内存(符合TAS)的前提下完成。

如果不预先设置好注入的代码,任意代码注入漏洞可以是非常危险的,因为指令计数器将会跳转到RAM并开始执行数不清的完全不可预测的代码(即当时RAM中的数据),直到偶然遇到一条停止指令。这些执行的指令中就很可能包含破坏性的指令(例如破坏存档内容的指令)。

第一世代

紅/綠/藍

使用错误道具8FRB或者5かいRG可以使指令计数器跳转到存储玩家同行宝可梦数量的RAM位置。这个值(包括在它后面存储的值,例如玩家同行宝可梦的内容,和他们的包包)是非常容易更改的。所以一旦获得了这个错误道具,这个方法可以说是最简单的任意代码注入方法。[2][3][视频 1]

使用8F不通过对战直接得到梦幻

为了在包包拥有尽可能多的道具,以便控制更多的内存区域,可以利用道具复制漏洞

目前所知最简单获得道具8F的方法是通过道具下溢错误。另外一个更加耗时的方法与错误宝可梦94和94 h有关。它们有错误的图鉴编号#213,将玩家包包中的第4个道具损坏。一旦遇到它们,这个道具的编号就会增加16(类似遇到图鉴编号#000的错误宝可梦会使第六个道具的数量增加128)。这个操作允许玩家将一个好钓竿换为一个8F。还存在一个利用超级错误破坏道具数据的更加老的方法。

除了8F和5かい,这些游戏中还存在很多可以触发任意代码注入漏洞的其他方法,例如特定情况下使用错误招式“—”。

皮卡丘

与8F和5かい相似,错误道具ws# #m#导致指令计数器跳转到存储当前盒子中宝可梦列表的RAM位置。这同样允许简单的任意代码注入操作。[4]ws# #m#可以通过道具下溢错误,或者利用错误宝可梦pPkMnp' '获得。

特别地,有一个仅存在与《皮卡丘》中的特殊任意代码注入方法。这个方法可以由任何使皮卡丘不再跟随玩家的事件触发(例如在深灰市宝可梦中心唱歌胖丁,或者宝可梦发烧友俱乐部中的皮皮,或者进入故障市)。当皮卡丘不跟随玩家时进行移动事实上缓慢地破坏了存储当前的地图和它周围数据的内存(例如当前存档的游戏时间,和皮卡丘的亲密度[5],因为游戏用来记录皮卡丘的位置的代码是有错误的[待確認]。所以,以特定的方式行走有可能使地图上出现一个指向RAM地址的公告牌[6]

第二世代

金/銀

主頁面:代币盒错误(漏洞)

在英文版的《金/銀》中,代币盒错误事实上是任意代码注入错误的一种。

在日文版中,代币盒执行某段代码(这段代码告诉玩家他们有多少代币)后以十六进制数57来结束。这个指令使程序停止并返回。然而,在英文版中,这个停止指令无效,使程序转移到VRAM地址$E112,然后在那里执行代码。这个错误在测试时没有被发现的原因是那里的值基本上是由00组成的,所以没有可见的效果。但是如果玩家已经听过了特定宝可梦的叫声,这个地址中的代码可能会产生特定效果,例如显示“which move?he PP of”或者进入错误维度。当收听的是喇叭芽腕力豪力或是菊石兽的叫声时,这个效果使代码再次跳转到$EB12。这个地址的内容可以通过携带特定的同行宝可梦来修改,例如一个23级,携带HP增强剂,第一个招式是梦话沼王。当它作为同行宝可梦的第4位时,它将会使程序转移到电脑的道具存储。这只沼王也可以携带攻击增强剂,这会使程序转移到宝可梦寄放系统盒子的名字处。更改这些数据可以达成许多效果,例如获得时拉比或者错误宝可梦????? (FF),不带宝可梦前往白银山(导致玩家自动获胜),甚至是向游戏机中写入一个全新的游戏。

水晶版

主頁面:重要物品合并(漏洞)

一个时拉比的蛋错误的变种允许玩家控制他们得到的宝可梦的种类和携带道具。这个错误可以使携带道具是一个正常情况下不可能携带的重要物品

将携带的重要物品取下时,如果这个道具在包包中已经存在,会导致这个道具在包包中显示为两个分开的完全一样的道具。这两个道具必须被相邻放置,并且下面必须有一个正常的重要物品。这时,通过选择按钮交换这两个相同的重要物品,会破坏第二个和第三个道具的数据[7]包包中的道具数量意外地减少了,便有可能达成与第一世代中的道具下溢错误相似的效果。这会使玩家的重要物品口袋中出现255个道具;通过道具顺序的交换,还可能将道具下溢的效果传递给其他口袋。

第一世代类似,根据游戏语言不同,通过特定的操作可以将一个特定的招式学习器放置在招式学习器口袋之外,或者破坏玩家的宝可梦图鉴的当前排序模式。利用这两种方法,在错误的状态下使用招式学习器或打开宝可梦图鉴会使游戏跳转到RAM,导致任意代码注入漏洞。

第三世代

綠寶石

主頁面:整个盒子的坏蛋(漏洞)

查看至少一只错误宝可梦??????????的信息,可以导致程序转移到宝可梦寄放系统中宝可梦的昵称的位置。当前唯一已知获得这个错误宝可梦的方法是通过整个盒子的坏蛋。由于存储昵称的数据大小是有限的,这种方法触发的任意代码注入的利用比较有限。

还有至少一个错误招式的动画效果指向SRAM地址$0E0F14C0。可以通过更改此处的数据使动画指针指向电脑中的第11个和第15个道具。整个盒子的坏蛋也是目前唯一已知可以获得学会这个错误招式的宝可梦的方法。另外还可以通过榴石果漏洞的另一个子漏洞获得任意数量的任意错误道具。相比利用宝可梦的昵称,利用这个漏洞能够执行更多代码。但由于存档数据的特性,整个文件总是会偏移一个字节,如果玩家的存档的$0E0F14C0处原本的数据为奇数的话,就不能通过这个方法进行任意代码注入了。[8]

第四世代

鑽石/珍珠白金

在谜之场所中按一定步数行走会错误地触发朋友公园相关的地图事件,可以导致程序转移到计算器等部分宝可表应用使用的数据位置。


参考链接

参考视频

  1. 通过道具下溢的方法获得错误道具8F:Bilibili
遊戲漏洞
第一世代0 ERRORMissingNo.ZZAZZ错误道具复制道具下溢错误地图254对战大木博士
故障市合并宝可梦错误记录冲浪错误居合斩漏洞老人漏洞梦幻漏洞《皮卡丘》的图像错误
任意门剩余HP错误双属性克制信息显示错误脱离连接俱乐部选择按钮错误资料损坏错误
第二世代捕虫大赛数据复制城都宝可梦错误错误维度代币盒错误
时拉比的蛋写生错误训练家之屋错误重要物品合并
第三世代榴石果漏洞时钟电路漏洞整个盒子的坏蛋对战塔盒子复制
第四世代变身招式保留错误冲浪漏洞榴石果漏洞追打所造成的异常天气
第五世代GTS变形错误自由落体重力漏洞
第六世代列表
第七世代列表
第八世代列表
第九世代列表
多个世代克隆漏洞任意代码注入溢出随机数异常更改时间系统
多回合攻击类招式漏洞讲究道具锁定漏洞蓄力的招式覆盖错误
跨世代服务Pokémon HOME漏洞
旁支系列宝可梦+信长的野望漏洞宝可梦大集结漏洞
相关列表错误招式错误属性错误地点错误音乐错误道具错误训练家错误宝可梦坏蛋