资讯详情

The JTAG/SMC Hack On Xbox360

The JTAG/SMC Hack On Xbox360

原文位于:

http://free60.git.sourceforge.net/git/gitweb.cgi?p=free60/tools;a=blob;f=imgbuild/hack.txt;h=a5675bfa4e414b3688197528b76307f0f5af2ccc;hb=HEAD

名词解释:

KK expl. (KK exploit) KK指(KING KONG),这是游戏《金刚》的名字,漏洞是通过游戏可编辑的着色/渲染操作最终可以修改物理内存。任何代码都可以通过管理程序漏洞来执行。

unsigned shader

vertex shader

shader

hypervisor 管理程序

HRMO

FSB 系统前端总线

XeLL&nbp;                 (Xenon Linux Loader) 由free60.org发布的一个Loader用于引导Linux操作系统,它属于第二阶段的loader,意思是说是由另一个loader来引导的

HV offset

thermal diodes                   电子器件:热敏二极管

 (H)ANA                               芯片厂商名

VM code                               (Virtual Machine code) 虚拟机代码

RROD                                 (Red Ring of Death) 指三个红色橙光形成一个环形,俗称三红,也有人要做死亡的红色光环或死亡红环

1BL                                       (One stage bootloader) 第一阶段的bootloader,后面的nBL类似

"CB"

(Xenon

Zephyr

Falcon

Jasper)                                 括号中的4个东东指的是Xbox的4个硬件版本代号

Fuses                                   见有人翻译成:电子保险

"CF"

"CG"

pairing block                       配对块

dashboard

timing attack                        文档中有时简写成TA

 

工作原理

 

为了能理解这个破解的实现,我们还是先看看KK的漏洞是怎样产生的:

系统管理程序的系统调用处理函数存在严重缺陷,这个问题在4532版本的内核升级(说明)中有介绍。下面这个URL对这个问题进行了详细的描述。

http://www.securityfocus.com/archive/1/461489/30/0/

 

KK漏洞利用内存存在的缺陷,通过着色/渲染操作来实现了一系列对内存的访问,通过这样的操作GPU可以将像素或者vertex shader写入到物理内存中。这些预先构造好的阴影数据覆写了空闲线程的上下文,这样可以使内核跳转到期望的内存地址上,同时CPU的一些寄存器也可以填充成你期望的值。为了能控制所有的寄存器还需要第二阶段的工作,这个阶段我们让PC指针掉转到中断的处理函数。最终的结果是所有的CPU通用寄存器被填充成你期望的值。这时将PC指针填充成内核系统调用指令的地址,根据预先在寄存器上填充好的值(译者注:系统调用和函数调用一样是需要参数的,而和函数调用的区别是不会使用到堆栈而是直接将参数放在通用寄存器中,当然也不是说函数调用就一定要用堆栈来传递参数,具体要看编译器的实现),就可以利用漏洞做我们想做的事情(译者注:直白的说这样已经可以调用系统的API函数了)。

 

这个漏洞允许PC跳转到系统管理程序领空的任何32bits的有效地址空间。为了能跳转的任意地址,我们需要使用到"mtctr, bctr"这2条指令,当然必须先在系统管理程序的领空先找到指令的地址,将PC设到这里就可以间接的实行到任何地址空间的指令。(译者注:mtctr指令后面需要带一个寄存器作为参数,而这条指令的目的就是将PC设置成这个寄存器的值,而前面讲到寄存器是可控的)(译者注:如果你了解过Windows的漏洞利用,一定会知道有一个指令叫jmp esp,非常类似,当我们利用漏洞的时候,也是要设法找到在核心的动态库如kernel32.dll里该指令对应的地址,然后设法将PC跳转到这条指令对应地址上)这点非常重要,因为我们要清零高32bits?(例如:通过设置MSB来禁止HRMO),因为我们希望代码跳转到一块未加密的内存空间。

 

这部分代码经常被用于加载第二阶段的loader,例如XeLL(译者注:Xenon Linux Loader, Xenon上加载Linux的引导程序, Xenon为Xbox板卡硬件版本名),到内存空间,并且执行。XeLL这时候会尝试catch到所有的cpu线程上(因为我们的漏洞程序之影响到了主线程),然后加载用户代码,例如从DVD上。

 

所以,下面这部分内存空间是需要用到的。

- 空闲线程的上下文,位于物理内存的00130360

 

这里存放了堆栈指针(和别的一些填充数据)。当空闲线程被挂起时,我们修改了堆栈指针,当内核重新调度到空闲线程的时候,我们就获得了对CPU的控制。任务切换会根据我们提供的堆栈地址做上下文恢复。

- 上下文恢复,第一步,任意地址,KK漏洞中使用了80130AF0

 

线程的上下文恢复并不包含恢复所有的寄存器,但确可以控制NIP(下条机器指令的地址)。我们设置NIP指向中断的上下文恢复函数,这个函数会根据当前的堆栈指针来加载大多数的寄存器。

- 上下文恢复,第二步,类似于第一步的基地址

 

我们在两次上下文切换中使用了相同的堆栈指针,因为这2次操作并不重叠。第二次的恢复可以将所有寄存器(译者注:上面才说是大多数,这里成所有了,不严谨哦)写成任意的64bits值。

- HV偏移量,4532版本上对应的0x46号系统调用在00002080地址上

 

源于HV的缺陷,我们可以将这个地址写到没有加密的内存空间,因为我们可以跳转到系统管理程序领空的任何地址(例如:通过一个固定的加密前缀)。我们经常在这里写00000350,这个地址在系统管理程序领空对应了指令"mtctr %r4; bctr",这样可以跳转到寄存器r4对应的地址来运行。

- 我们loader的代码,位于任何地址。

 

代码通过系统管理程序来执行,这是最先运行到的我们自己的代码。r4对应的地址并不在系统调用列表中(译者注:这是当然,因为r4指向的是我们loader的入口地址,而我们的loader肯定不会是微软写的系统调用,

这里他没有提到loader是如何被加载到内存上的,当然对于KK的话,他是可以访问任何物理内存的,这个自然不是问题)

 

只要空闲线程和HV的偏移填充好了固定地址。将这2块数据写入内存是很容易的事情,但是放在一块上是不行的(译者注:不知道为什么)幸运的是NAND控制器在做DMA读操作的时候,静载荷数据和ECC数据是分开的。每个页面包含512字节的静载荷和16字节的ECC校验数据。因此一次DMA的读操作就可以将上面2块数据同时加载到内存上。我们用静载荷来放空闲线程的上下文,上下文恢复数据和loader代码。ECC部分来访HV的偏移量。

 

为了做DMA操作,需要访问下面几个NAND控制寄存器。

ea00c01c Address for Payload 存放静载荷的地址

ea00c020 Adresss for ECC 存放ECC的地址

ea00c00c address inside NAND NAND的内部地址

ea00c008 command: read DMA (07) 命令ID:DMA读(07)

 

系统管理控制器(SMC)内部是一个8051的核,SMC位于南桥芯片内部。他来负责电源的上电顺序,只要Xbox360接上电源,他就一直处于工作状态(无论xobx在待机还是工作状态)。他控制了前面板上的按键,内部有一个实时时钟,解码红外模块,控制温度传感器风扇和DVDROM。他通过前面板来设置LEDs灯的状态。系统运行的时候内核通过和SMC的通信,可以查询当前实时时钟,打开DVD托盘,等等。他们是通过一个双向FIFO来通信的(位于系统内存ea001080 / ea001090)。通过阅读XeLL SMC部分的代码可以了解更多信息。

 

SMC也可以访问到NAND芯片,因为在NAND的一个页面上存放了SMC的配置信息。该配置页上存放了温敏二极管的校准信息和监测热源点的信息,等等。51可以访问NAND的控制寄存器,该寄存器被影射到51的特殊功能寄存器中。51访问NAND的协议和内核是一样的,通过对地址的访问实现一个读命令,这时从DATA寄存器中获取读到的数据。(译者注:这个协议自然是一样的,因为是NAND芯片决定的,可参考芯片的datasheet) 标签: 377c01pcb传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司