任意代碼注入(漏洞)

  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漏洞
旁支系列寶可夢+信長的野望漏洞寶可夢大集結漏洞
相關列表錯誤招式錯誤屬性錯誤地點錯誤音樂錯誤道具錯誤訓練家錯誤寶可夢壞蛋