精華區beta Modchip 關於我們 聯絡資訊
我們在第一篇文章中提到,要在Wii上面執行未授權軟體是很困難的 不過這當然無法阻擋駭客(Hacker)想在Wii上面執行自製(HomeBrew)軟體 的決心。當然,他們成功了,這邊先介紹一些相關的知識 1. 緩衝區溢位(Buffer Overflow) 可以說大多數的安全漏洞都是出自緩衝區溢位 起因是,我們最常使用的C語言,並沒有檢查緩衝區(Buffer)的大小 我們常常會在程式中設定一個固定大小的陣列(array)當做緩衝區 例如說用40個字元來儲存使用者姓名 在一般的狀況下,是沒什麼問題的 不過如果原始資料故意輸入超過40個字元 C語言在讀取的時候,依然會依序將它拷貝進陣列 結果,超過40個字元的部份,就會蓋寫記憶體中其它用途的地方 而造成所謂的Stack Overflow,或Heap Overflow 駭客就利用這點,來執行一些原本系統不允許的的動作 2. Twilight Hack Wii上面,最早也最有名的一個緩衝區溢位攻擊 利用特殊的存檔,造成薩爾達傳說:曙光公主的緩衝區溢位問題 結果就是可以不經由正常的程序,執行自製的程式 由於是利用漏洞的關係,所以可以跳過檢查機制,執行任何你想要的程式 (基本上都是執行SD上根目錄的boot.elf或boot.dol) SYSMENU ----------> 曙光公主 ---------------> 自製程式 光碟頻道 Twilight Hack 由於是利用有問題的存檔 所以後來的系統選單會檢查有問題的存檔並刪除,進而封住這個漏洞 在4.0系統選單的系統無法使用Twilight hack 3. Indiana Pwns/Smash Stack 在曙光公主被封住之後,還有二個漏洞被發現 一個是LEGO Indiana Jones(無日版),一個是大亂鬥美版 Indiana Pwn同樣是利用存檔的漏洞,理論上也可以被修復 (目前為止未被修復) Smash Stack則是遊戲本身去讀取SD造成的問題 所以會非常不容易被修復,甚至有可能永遠存在 不過前述的這種方式,需要這三片遊戲其中一片 而且要進入遊戲玩一下,才能執行自製程式,不是很方便 所以主流是另一種BannerBomb的方式 4. BannerBomb BannerBomb是利用SD資料管理(3.0~4.1) 或SD Menu(4.2)的緩衝區溢位來執行自製程式 這個方法,只需要一張SD卡,不需要特別的遊戲即可執行,相當方便 (但是系統選單必須是3.0以上,這就是為什麼軟改需要升到3.0以上的原因) 只要進入特定的系統選單位置,如SD Menu 就可以選擇執行自製程式了 (目前沒有4.3上面可用的BannerBomb) 5. Trucha Bug 單單可以執行程式,駭客們當然是不能滿足的 如果可以安裝成頻道,多方便啊! 但是任天堂在你安裝程式的時候,會檢查簽章,該怎麼辦呢? 這時候有人發現了一個bug,也就是有名的Trucha Bug 在比對你的RSA憑證(不懂請看本系列第一篇)是否有效時 任天堂犯了一個很嚴重的錯誤 在驗證憑證的有效性時,我們曉得需要Hash = Hash'(第一篇中有詳述) 但是很不幸地,任天堂使用了「字串比對」,而不是「記憶體比對」 字串比對有什麼問題?C語言中,字元值0代表字串的結束 只要遇到0,不管後面還有沒有,他都會停下來 所以,如果Hash中有0,它的有效長度被縮短了! 駭客也就可以比較輕易地偽造出一個假的憑證和簽章 也就是說,這個演算法,其實並沒有被破解 但是它的檢查機制卻有漏洞! 這個漏存在於當時所有的IOS和boot1之中 可以偽造簽章之後,也就大開了Wii軟改的方便之門 自製頻道(HBC)、自製的IOS、自製的Boot2 不管你想裝什麼東西進Wii,都可以 多彩多姿的Wii軟改世界,也就此展開了 (關於Trucha bug的攻防戰,後面再做說明) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.23.102 ※ 編輯: priv 來自: 140.113.23.102 (07/12 17:30)
RXCPU:這內容寫成快變魔戒了 應該會大受歡迎XDDDD 07/12 17:44
muscidae:看到這篇只有感動可以形容,文筆也很好! 07/12 17:46
RXCPU:從兩光公主的威能被封印之後 眾壯士們組成了威能遠征隊... 07/12 17:51
※ 編輯: priv 來自: 140.113.23.102 (07/12 17:52)
priv:今天先到這..未完待續 07/12 17:53
priv:也可以建議一下內容 07/12 18:00
VV11:大推 07/12 20:32
black430:看到這裡 才知道原來是這麼一回事! 不推不可! 07/12 20:35
JohnGod21:膜拜 07/12 21:07
SansWord:我喜歡這篇!去年修了密碼學很有感覺~ 07/13 00:11
ainigi:overflow應該是讓他coredump, 然後在console執行自製程式 07/13 00:40
makoto888:太強了........駭客和遊戲機廠商之間的戰爭永無止境啊 07/13 12:01
saygreen:寫得真好,期待後續>///</ 07/13 14:13
danny8376:修正一下 代表字串結束的是ascii為0的字元 不是數字0 07/13 15:40
ruemann:應該是說當比對到字串值為0時,就代表字串結束 07/13 15:45
是有點容易誤解,改好了 ※ 編輯: priv 來自: 140.113.23.102 (07/13 16:27)
priv:接下來因為要進入到最複雜的部份,會晚一點才出文 07/13 16:56
priv:野心不會太大,目標是講完一般人弄不清楚的觀念就好 07/13 16:57
X200:看完這三篇只能說太強大了 07/13 21:13
asoedarren:請問填0如何造假? 是類似injection的做法嗎? 07/13 21:42
tinganhsu:C裡面讀字串陣列 假如是ILOVEYOU 最後會有個/0 07/13 21:44
tinganhsu:就是利用這個東西 只比較一部份 一部份造假不難 07/13 21:45
tinganhsu:讀到/0會自動停止讀取 沒讀到會一直讀下去 07/13 21:46
tinganhsu:可能就是利用這特性吧 我比較少逛Gbatemp 07/13 21:46
tinganhsu:以上有錯請訂正m(_ _)m 07/13 21:46
priv:一般是利用stack buffer overflow 07/13 23:57
priv:修改function return address 07/13 23:57
priv:細節可以上網找資料自己研究看看 07/13 23:58
priv:喔不好意思我看錯,是要問trucha bug對吧 07/14 00:00
priv:你講的差不多很接近了 07/14 00:01
henry74918:讚! 07/14 15:08
※ 編輯: priv 來自: 140.113.23.102 (07/15 16:32)