作者priv (邪恶松鼠)
看板Modchip
标题[Wii ] Wii软改概念解析(三) 缓冲区溢位/Trucha Bug
时间Mon Jul 12 17:16:26 2010
我们在第一篇文章中提到,要在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)
1F:推 RXCPU:这内容写成快变魔戒了 应该会大受欢迎XDDDD 07/12 17:44
2F:推 muscidae:看到这篇只有感动可以形容,文笔也很好! 07/12 17:46
3F:→ RXCPU:从两光公主的威能被封印之後 众壮士们组成了威能远征队... 07/12 17:51
※ 编辑: priv 来自: 140.113.23.102 (07/12 17:52)
4F:→ priv:今天先到这..未完待续 07/12 17:53
5F:→ priv:也可以建议一下内容 07/12 18:00
6F:推 VV11:大推 07/12 20:32
7F:推 black430:看到这里 才知道原来是这麽一回事! 不推不可! 07/12 20:35
8F:推 JohnGod21:膜拜 07/12 21:07
9F:推 SansWord:我喜欢这篇!去年修了密码学很有感觉~ 07/13 00:11
10F:推 ainigi:overflow应该是让他coredump, 然後在console执行自制程式 07/13 00:40
11F:推 makoto888:太强了........骇客和游戏机厂商之间的战争永无止境啊 07/13 12:01
12F:推 saygreen:写得真好,期待後续>///</ 07/13 14:13
13F:→ danny8376:修正一下 代表字串结束的是ascii为0的字元 不是数字0 07/13 15:40
14F:推 ruemann:应该是说当比对到字串值为0时,就代表字串结束 07/13 15:45
是有点容易误解,改好了
※ 编辑: priv 来自: 140.113.23.102 (07/13 16:27)
15F:→ priv:接下来因为要进入到最复杂的部份,会晚一点才出文 07/13 16:56
16F:→ priv:野心不会太大,目标是讲完一般人弄不清楚的观念就好 07/13 16:57
17F:推 X200:看完这三篇只能说太强大了 07/13 21:13
18F:推 asoedarren:请问填0如何造假? 是类似injection的做法吗? 07/13 21:42
19F:→ tinganhsu:C里面读字串阵列 假如是ILOVEYOU 最後会有个/0 07/13 21:44
20F:→ tinganhsu:就是利用这个东西 只比较一部份 一部份造假不难 07/13 21:45
21F:→ tinganhsu:读到/0会自动停止读取 没读到会一直读下去 07/13 21:46
22F:→ tinganhsu:可能就是利用这特性吧 我比较少逛Gbatemp 07/13 21:46
23F:→ tinganhsu:以上有错请订正m(_ _)m 07/13 21:46
24F:→ priv:一般是利用stack buffer overflow 07/13 23:57
25F:→ priv:修改function return address 07/13 23:57
26F:→ priv:细节可以上网找资料自己研究看看 07/13 23:58
27F:→ priv:喔不好意思我看错,是要问trucha bug对吧 07/14 00:00
28F:→ priv:你讲的差不多很接近了 07/14 00:01
29F:推 henry74918:赞! 07/14 15:08
※ 编辑: priv 来自: 140.113.23.102 (07/15 16:32)
30F:推 alan514:好神 07/20 13:00