自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

通過USB入侵微控制器固件

商務(wù)辦公
在本文中,我想演示如何從運行在Cortex M0上的安全USB設(shè)備中提取固件。

 在本文中,我想演示如何從運行在Cortex M0上的安全USB設(shè)備中提取固件。

誰入侵了視頻游戲機?

在電子游戲機的世界里,充斥著各種假冒偽劣產(chǎn)品。所謂需求創(chuàng)造供給,不乏有不少投機者想要在這塊產(chǎn)業(yè)價值數(shù)十億美元的蛋糕上分一杯羹。而現(xiàn)今,你總能找到那么幾款設(shè)備,讓幾乎所有的游戲控制器,在對盜版游戲,假冒的游戲手柄或配件,甚至外掛上都喪失所有限制。

從視頻游戲機誕生起的二十年來,其游戲控制器都是由硬件制造商設(shè)定的專有系統(tǒng)。制造商在設(shè)計的過程中會涵蓋各種保護措施,以確保這些控制器只運行簽名過的代碼,讓用戶只玩合法有執(zhí)照的游戲,以及官方授權(quán)的配件。某些國家,試圖破解自己的視頻游戲機甚至是非法的。

但與此同時,這種高規(guī)格的保護措施也使得游戲機成為了一個有吸引力的目標。對信息安全和逆向工程感興趣的愛好者來說,這個謎題越難,解起來就越有趣,尤其是如果你從小就喜歡電子游戲的話。

DualShock 4保護方案

關(guān)注我twitter賬戶的讀者可能知道,我長期以來一直致力于對游戲控制器及其相關(guān)產(chǎn)品做逆向研究。在PlayStation 4(索尼公司出品的一款游戲機)剛問世那會兒,我就曾利用其FreeBSD內(nèi)核(PlayStation 4基于FreeBSD內(nèi)核)中的一個漏洞探究了該產(chǎn)品的內(nèi)部架構(gòu)和工作原理。我做了很多不同的研究,其中就包括,在PS4中USB認證是如何工作的,以及它如何區(qū)分授權(quán)設(shè)備并阻止未經(jīng)授權(quán)的設(shè)備。這個主題很有趣,我之前在其他控制器上也做過類似的研究。PS4的認證方案比Xbox 360使用的要簡單得多,但效果并不差。

圖1.PlayStation 4 USB配件授權(quán)方案

過程如下:PS4向DualShock 4(一款游戲手柄)發(fā)送0x100個隨機字節(jié),DualShock 4則創(chuàng)建一個RSASSA-PSS SHA-256簽名作為響應(yīng),并將其發(fā)送回驗證它所需的加密常數(shù)N和E(公鑰)之間,這些常數(shù)對于所有正規(guī)制造的DualShock 4游戲手柄來說都是唯一的。DualShock 4還會發(fā)送一個驗證N和E所需的簽名,它使用相同的RSASSA-PSS SHA-256算法,此加密常數(shù)存儲在內(nèi)核中,對所有PS4游戲機都是相同的。

這意味著,如果你想認證自己的USB設(shè)備,僅僅破解PS4的內(nèi)核是不夠的,你需要將私鑰存儲在游戲手柄中。然而即使有人成功破解了游戲手柄并獲得了私鑰,索尼仍然可以通過固件更新將私鑰列入黑名單里。如果游戲控制器在8分鐘后還沒有收到身份驗證響應(yīng),它就會停止與游戲手柄間的通信,只有將其從USB端口拔出并再次將其插入后它才能工作。這就是早期的假冒游戲手柄的工作機制,它每8分鐘就模擬一個USB端口拔掉/插入過程。

關(guān)于假冒DualShock 4的謠言

自DualShock 4問世以來,沒有任何跡象表明有人成功攻破了此項機制。然而最近,我聽說市場上新冒出了一些假的DualShock 4,無論外觀還是功能都與正品都一模一樣。我的好奇欲讓我從中國的商店里訂購了一些。

在我等待包裹到達的時間里,我決定收集更多關(guān)于假冒游戲手柄的信息。在多次搜索之后,我找到了一個名為Gator Claw的游戲手柄。

圖2.未經(jīng)授權(quán)的Gator Claw游戲手柄

不過Reddit上也有評論說,它只能工作八分鐘,不過后來開發(fā)人員通過固件更新成功的解決了這個問題,上圖所示的購買頁面里包含了固件更新的鏈接和使用手冊。

圖3.Gator Claw固件更新手冊

嵌入式固件的基礎(chǔ)分析

我做的第一件事是查看固件更新器可執(zhí)行文件的資源部分。

圖4.在Gator Claw固件更新器的資源中找到的固件

經(jīng)常為嵌入式設(shè)備編寫代碼的讀者可能不會對這種文件格式感到陌生。這是Intel HEX文件格式,通常用于編程微控制器,許多編譯器(例如GNU Compiler)以這種格式輸出編譯代碼。此外,我們可以看到固件的開頭沒有高熵,字節(jié)序列很容易識別,這意味著固件未經(jīng)過加密或壓縮。將該文件解碼并以hex編輯器加載(十六進制編輯器能直接打開該格式文件)后,我立馬看到了它的編譯架構(gòu)——ARM Cortex-M。

圖5.Gator Claw的固件(左)和ARM Cortex-M的矢量表(右)

根據(jù)ARM Cortex-M的規(guī)范,前兩個字(黃框和紅框標出部分)是初始堆棧指針,之后的是異常向量表(綠框標出)。該表中,前兩個字是復(fù)位向量,用作固件入口點,而其他異常處理程序的高地址則提示了固件的基址。

除固件外,固件更新程序的資源部分還包含一個配置文件,里面有對不同微控制器的描述。 說明開發(fā)人員最有可能使用的是來自微控制器制造商的公開可用源代碼,這就能解釋為什么這個配置文件中帶有源代碼。

圖6.對不同的微控制器描述的配置文件

在配置文件中搜索微控制器標識符后,我們找到了制造商的站點——Nuvoton。不需要任何許可協(xié)議就可以下載技術(shù)文檔和SDK的產(chǎn)品信息。

圖7.Nuvoton微控制器制造商的網(wǎng)站

現(xiàn)在我們有了固件,知道了它的體系結(jié)構(gòu)和微控制器制造商,還知道了基本地址、初始堆棧指針和入口點。

ARM處理器有兩種不同的指令集:ARM(32位指令)和Thumb(使用Thumb-2 32位指令擴展的16位指令)。Cortex-M0僅支持Thumb指令,因此我們在IDA Pro中加載固件時將“Processor options – Edit ARM architecture options – Set ARM instructions”中的單選按鈕切換為“NO”。

之后,我們可以看到固件已經(jīng)加載到基址0,自動分析幾乎可以識別每個功能?,F(xiàn)在的問題是如何推進固件的逆向工程。

圖8.固件功能之一

如果對固件作分析,會看到整個它使用基址0x40000000對內(nèi)存執(zhí)行讀寫操作,這是內(nèi)存映射到輸入輸出(MMIO)寄存器的基本地址。這些MMIO寄存器允許你訪問和控制所有微控制器的外圍組件,固件所做的一切都是通過訪問它們來實現(xiàn)的。

圖9.外圍控制器的內(nèi)存映射

通過搜索地址0x40000000的技術(shù)文檔,我們發(fā)現(xiàn)這個微控制器屬于M451家族。既然已經(jīng)了解了微控制器家族,就下載這個平臺的SDK和代碼示例。在SDK中,我們找到一個頭文件,它定義了所有MMIO地址、位字段和結(jié)構(gòu)。我們還可以用所有庫編譯代碼示例,并將它們與IDB中的函數(shù)進行比較,或者在源代碼中查找MMIO地址的名稱,并將其與我們的反匯編進行比較。這使得逆向工程的過程非常簡單。那是因為我們知道微控制器的架構(gòu)和模型,并且我們對所有MMIO寄存器進行了定義。如果我們沒有這些信息,分析就會復(fù)雜得多。 可以說,這就是為什么許多供應(yīng)商只在簽署了NDA之后才發(fā)布SDK。

圖10.在固件中查找?guī)旌瘮?shù)

在巨人的陰影下

在等待假手柄到來之際,我分析了Gator Claw的固件,但對固件的內(nèi)部并沒有太多深挖的興趣——無外乎是身份認證數(shù)據(jù)被發(fā)送到另一個可以通過I2C訪問的微控制器,再將響應(yīng)送回控制器。Gator Claw手柄的開發(fā)者可能也知道他們的固件會被逆向破解,繼而被同行模仿生產(chǎn)出更多的紡織品,這樣也會對他們的業(yè)務(wù)造成負面的影響。為了防止這種情況的發(fā)生,他們使用了另一種微控制器來保障機密,這個做法也是十分常見的,因為黑客們在他們的產(chǎn)品上投入了很多精力,他們也不想被其他黑客攻擊。

在這個固件中,真正引起我注意的是一些看似沒有使用過的字符串,它很可能是USB設(shè)備描述符的一部分。這個字符串是故意留下的嗎?會不會是某種簽名?上述猜想是很有可能的,因為該字符串是一家硬件制造商的名稱,該廠商以制造邏輯分析儀而聞名,并且它還有一個專門游戲部門,正朝著成為原始設(shè)備制造商(OEM)的目標奮進。該公司還擁有許多游戲配件的生產(chǎn)專利。除此之外,通過它的網(wǎng)站我了解到,在其品牌下有大量待銷的游戲配件。

在它出售的產(chǎn)品中,有二十幾款適配器能讓手柄與不同品牌的控制器相連。例如,可以把Xbox 360的游戲手柄連接到PS4,也可以把PS3的游戲手柄連接到Xbox one,等等。還有的適配器,可以將PC鼠標和鍵盤連接到PS4、Xbox One、任天堂游戲機、各種手柄和印刷電路板上。所有產(chǎn)品都提供了與Gator Claw類似的固件更新程序,但有一個顯著的區(qū)別——所有固件都是經(jīng)過加密的。

圖11.其中一個產(chǎn)品的手動和加密固件示例

Gator Claw手柄在印刷電路板的設(shè)計上可能就是模仿了該廠商。在下圖中我們可以看到兩個微控制器,其中一個應(yīng)該是Nuvoton M451,另一個則是額外用于保障機密的微控制器。所有線路最終都匯聚到了黑色的模件中(下圖中紅色圈出部分),它應(yīng)該是主微控制器,而帶有四個黃色引腳的微控制器(下圖中黃色圈出部分)應(yīng)該具備了I2C工作所需的功能。

圖12.Gator Claw印刷電路板的設(shè)計

啟示

這時我終于收到了來自深圳的包裹,打開后我簡直大吃一驚,如果我不說,我想你也會以為這就是原版的DualShock 4。這是一款用制作精良的無線游戲手柄,帶有工作觸控板、揚聲器和耳機接口。

[[260932]]

圖13.假DualShock 4手柄的外觀

手柄啟動后進入DFU模式,在此模式下將游戲手柄連接到PC后,它被識別為具有不同標識符和特征的另一個設(shè)備。那么接下來的事情就昭然若揭了……

圖14.假DualShock 4手柄的印刷電路板

我將幾根導線焊接到看起來像JTAG點的地方,并將其連接到JTAG編程器。編程工具識別微控制器,但它設(shè)置了安全鎖。

圖15.編程工具識別微控制器,但它啟用了安全鎖

通過USB攻擊微控制器固件

在前面這段相當冗長的介紹之后,現(xiàn)在是時候回到本文的主題。USB(通用串行總線)是外圍設(shè)備的行業(yè)標準。它的設(shè)計非常靈活,可以廣泛應(yīng)用。USB協(xié)議定義了兩個實體——一個主機與其他連接的設(shè)備,連接設(shè)備分為集線器、人機界面、打印機、成像、大容量存儲設(shè)備等類。

圖16.USB設(shè)備的連接方案

設(shè)備與主機之間的數(shù)據(jù)和控制交換的過程是通過一組單向或雙向管道的進行的。一個設(shè)備可以具有許多不同的端點以交換不同類型的數(shù)據(jù)。

圖17.數(shù)據(jù)傳輸類型

有四種不同類型的數(shù)據(jù)傳輸:

  • 控制傳輸(用于配置設(shè)備)
  • 批量數(shù)據(jù)傳輸(以相對較大和突發(fā)的數(shù)量生成或使用)
  • 中斷數(shù)據(jù)傳輸(用于及時但可靠地傳輸數(shù)據(jù))
  • 同步數(shù)據(jù)傳輸(通過預(yù)先協(xié)商的傳輸延遲占用預(yù)先協(xié)商的USB帶寬量)

所有USB設(shè)備必須支持端點0處的特殊指定管道,USB設(shè)備的控制管道將連接到該管道。

這些類型的數(shù)據(jù)傳輸是使用根據(jù)以下方案提供的分組來實現(xiàn)的。

圖18.USB協(xié)議中使用的數(shù)據(jù)包

USB協(xié)議實際是一個狀態(tài)機,在本文中我們不會檢查所有這些數(shù)據(jù)包。下圖中可以看到控制傳輸中使用的數(shù)據(jù)包示例。

圖19.控制傳輸

批量傳輸、中斷傳輸和同步傳輸這三種類型的數(shù)據(jù)傳輸是可選的,它們的存在和使用與否將視目標而定,但控制傳輸則是所有USB設(shè)備都支持,且控制傳輸?shù)母袷胶艹R?,這使得控制傳輸成為了分析漏洞時最常利用的方法。

下面的方案顯示了用于執(zhí)行控制傳輸?shù)腟ETUP包的格式。

圖20.SETUP包的格式

SETUP包占用8個字節(jié),它可以根據(jù)請求的類型獲得不同類型的數(shù)據(jù)。有些請求對所有設(shè)備都是通用的(例如GET DESCRIPTOR),而其他的取決于設(shè)備的類別和制造商許可。要發(fā)送或接收的數(shù)據(jù)長度是SETUP數(shù)據(jù)包中提供的16位字。

圖21.標準的和特定類別的請求示例

總結(jié):控制傳輸使用非常簡單的協(xié)議,所有USB設(shè)備都支持。它可以有很多額外的請求,而我們可以控制數(shù)據(jù)的大小。所有這一切使控制傳輸成為模糊和干擾的完美目標。

漏洞利用

為了破解我買的假手柄,我不必模糊它,因為我在查看Gator Claw代碼時發(fā)現(xiàn)了漏洞。

圖22.HID類請求處理程序中的漏洞代碼

函數(shù)HID_ClassRequest()用于模擬原始DualShock 4手柄的工作,并實現(xiàn)與PS4一起工作所需的最少請求。函數(shù)USBD_GetSetupPacket()用于獲取SETUP包,根據(jù)報告的類型,它要么使用USBD_PrepareCntrlIn()發(fā)送數(shù)據(jù),要么使用usbd_preparecntrout()接收數(shù)據(jù)。USBD_GetSetupPacket()不檢查請求數(shù)據(jù)的長度,這應(yīng)該能讓我們讀取固件內(nèi)部的部分閃存,并讀取和寫入SRAM存儲器的開始部分。

圖23.控制傳輸期間緩沖區(qū)溢出

DATA數(shù)據(jù)包的大小在USB設(shè)備描述符中定義(也通過控制傳輸接收),但容易被忽略的是這個大小定義的是單個數(shù)據(jù)包的長度,可能有很多數(shù)據(jù)包的長度取決于在SETUP包中所設(shè)置的。

值得注意的是,Nuvoton網(wǎng)站上提供的代碼示例也沒有檢查長度,可能導致的結(jié)果就是使用此代碼作為參考的所有產(chǎn)品中都會留有類似的漏洞。

圖24.利用SRAM存儲器中的緩沖區(qū)溢出漏洞

SRAM(靜態(tài)隨機存取存儲器)是一種被堆棧占用的存儲器。SRAM通常也是可執(zhí)行存儲器(可配置的),這通常是為了將經(jīng)常調(diào)用的代碼片段(例如,實時操作系統(tǒng))復(fù)制到SRAM來提高性能。雖然不能保證堆棧的頂部可以通過緩沖區(qū)溢出來訪問,但這么做的可能性仍然很高。

令人驚訝的是,利用USB固件的主要障礙竟然是操作系統(tǒng)。我在使用Windows時觀察到以下內(nèi)容,但我認為大部分內(nèi)容也適用于沒有特殊補丁的Linux。

首先,操作系統(tǒng)不允許你在控制傳輸期間讀取超過4kb;其次,根據(jù)我的經(jīng)驗,操作系統(tǒng)不允許在控制傳輸期間寫入多個DATA數(shù)據(jù)包;第三,USB設(shè)備可能有隱藏的請求,所有使用它們的嘗試都會被操作系統(tǒng)阻止。

這很容易用包括手柄在內(nèi)的人機界面設(shè)備(HID)來演示。HIDs附帶了其他描述符(HID描述符、報告描述符、物理描述符),而報告描述符與其他描述符非常不同,它由描述所支持報告的不同項組成。如果報告描述符中缺少報告,那么操作系統(tǒng)將拒絕完成它,哪怕它是在設(shè)備中處理的。這基本上減少了USB設(shè)備固件漏洞的發(fā)現(xiàn)和利用情況,而這些細微差別很可能在過去阻止了漏洞的發(fā)現(xiàn)。

為了解決這個問題而不必閱讀和重新編譯Linux內(nèi)核的源代碼,我只使用了我手邊的低端儀器:Arduino Mega板和USB Host Shield(總計小于30美金)。

圖25.連接方案

在使用上述方案連接設(shè)備后,我使用Arduino板來執(zhí)行控制傳輸,而不必受到操作系統(tǒng)的任何干擾。

圖26.Arduino Mega + USB Host Shield

我從深圳買的假游戲手柄與Gator Claw具有相同的漏洞,我做的第一件事就是轉(zhuǎn)儲部分固件。

圖27.部分轉(zhuǎn)儲固件

查找固件轉(zhuǎn)儲基址的最簡單方法是查找包含指向已知數(shù)據(jù)的指針的結(jié)構(gòu)。之后,我們可以計算地址的增量并將固件的部分轉(zhuǎn)儲加載到IDA Pro。

圖28.指向已知數(shù)據(jù)的指針的結(jié)構(gòu)

固件轉(zhuǎn)儲允許我們找出printf()函數(shù)的地址,該函數(shù)輸出工廠質(zhì)量保證所需的UART信息。 更重要的是,我能夠在轉(zhuǎn)儲中找到hexdump()函數(shù),這意味著我甚至不需要編寫shellcode。

圖29.尋找有助于漏洞利用的函數(shù)

在游戲手柄的印刷電路板上找到UART點,焊接導線并將它們連接到TTL2USB適配器后,我們可以在串行終端中看到輸出。

圖30.游戲手柄啟動期間的標準UART輸出

Nuvoton微控制器的標準庫附帶一個非常方便的硬故障異常處理程序,它輸出寄存器轉(zhuǎn)儲。這極大地促進了漏洞利用過程,并能對其進行調(diào)試。

圖31.堆棧覆蓋導致硬故障異常后的UART輸出

轉(zhuǎn)儲固件的最終漏洞可以在下面的屏幕截圖中看到。

圖32.利用和shellcode在UART上轉(zhuǎn)儲固件

但是這種轉(zhuǎn)儲固件的方法并不完美,因為Nuvoton M451家族的微控制器可能有兩種不同類型的固件—主固件(APROM)和用于設(shè)備固件更新的微型固件(LDROM)。

圖33.不同模式下閃存和系統(tǒng)內(nèi)存的存儲器映射

APROM和LDROM映射到相同的內(nèi)存地址,因此只能轉(zhuǎn)儲其中一個。 要獲得LDROM固件轉(zhuǎn)儲,我們需要禁用安全鎖并使用編程工具讀取閃存。

圖34.Shellcode禁用安全鎖

加密失敗

對負責更新的固件(LDROM)的分析表明,它主要是來自Nuvoton的標準代碼,但是添加了用于解密固件更新的代碼。

圖35.用于解密固件更新的加密算法方案

用于解密固件更新的加密算法是自定義塊密碼。它是在密碼塊鏈接模式下執(zhí)行的,但是塊大小只有32位。該算法接受一個密鑰,該密鑰是產(chǎn)品的文本(ascii)標識符,以及定義應(yīng)該在當前塊上執(zhí)行什么轉(zhuǎn)換的指令數(shù)組。在遇到鍵和數(shù)組的末尾后,它們的當前位置被設(shè)置為初始位置。轉(zhuǎn)換列表包括6個操作:異或、減法、減法(反向),以及相同的操作(但是交換了字節(jié))。因為固件包含大量充滿0的區(qū)域,所以很容易計算這個算法的秘密部分。

圖36.固件更新加密密鑰

將從假手柄的固件中提取的算法對比到上述的制造商所生產(chǎn)的產(chǎn)品中,發(fā)現(xiàn)所有產(chǎn)品都在使用這種加密算法,利用該算法的漏洞,我們可以計算所有設(shè)備的加密密鑰并解密固件更新。換句話說,在假冒產(chǎn)品中使用的算法導致該制造商開發(fā)的所有產(chǎn)品的安全性都受到威脅。

結(jié)論

這篇博文寫得很長,但我真的很想讓廣大觀眾做好準備。我給出了一個關(guān)于嵌入式固件分析,找到漏洞,并利用它們獲取固件轉(zhuǎn)儲和在USB設(shè)備上執(zhí)行代碼的操作指南。

故障攻擊的主題不包括在本文的范圍內(nèi),但此類攻擊對USB設(shè)備也非常有效。對于那些想要了解更多相關(guān)信息的人,我建議您觀看此視頻。對于那些想知道如何從DualShock 4獲取算法和密鑰以制作盜版產(chǎn)品的人,我建議閱讀這篇文章。

至于用于保障機密的微控制器,我發(fā)現(xiàn)并不是所有的設(shè)備都使用它,只是為了增加隱蔽性。但該微控制器不保守任何秘密,僅用于SHA1和SHA256。這項研究還幫助愛好者創(chuàng)建自己的開源項目,用于游戲控制器。

對于購買假冒游戲手柄的用戶來說,他們并不能因獲得了利益而沾沾自喜,因為制造商會屏蔽非法使用的密鑰,而用戶最終也無法使用游戲手柄或獲得固件更新的提示。

責任編輯:武曉燕 來源: 嘶吼
相關(guān)推薦

2021-09-16 09:11:31

物聯(lián)網(wǎng)微控制器IOT

2022-03-10 15:54:45

嵌入式開發(fā)多核微控制器技術(shù)

2020-09-24 10:20:16

物聯(lián)網(wǎng)

2022-10-19 10:26:46

2011-07-12 17:10:05

域控制器組策略

2015-09-16 11:13:16

WLAN無線控制器Tolly 測試華為

2011-07-14 10:28:54

額外域控制器

2016-09-23 16:20:47

2015-08-07 15:28:46

選取城市控制器源碼

2023-08-13 18:31:45

SDN控制器

2015-02-02 09:37:42

SDN控制器

2011-07-12 09:29:10

主域控制器備份域控制器

2017-11-23 11:28:07

德州儀器MCUTI

2024-09-27 16:28:07

2011-04-18 09:45:02

USB嵌入式Linux

2009-01-12 11:16:58

控制器控制器行為行為結(jié)果

2012-05-21 12:26:40

2013-12-19 09:32:01

SDN南向網(wǎng)絡(luò)控制

2017-11-23 17:27:35

Yii框架IntelYii框架深度剖析

2012-02-24 10:57:43

點贊
收藏

51CTO技術(shù)棧公眾號