文章出處

智能設備逆向工程之外部Flash讀取與分析篇

 

author: rayxcp

0x00 前言


目前智能家居設備的種類很多,本文內容以某智能豆漿機為例完成對其的固件提取和分析。

究其分析內部邏輯的原因可能會有很多種,和安全相關的原因主要有:

  1. 了解設備內部運行邏輯,逆向后有條件更改原有邏輯
  2. 通過逆向后的代碼找到可利用的漏洞或原有隱藏功能

0x01 讀取Flash


首先,準備好螺絲刀,鑷子等工具。把設備拆解。取出設備主控板。如下圖:

正面,其中紅圈所在的黑色小板是Wi-Fi模塊,上面的8腳Flash的芯片已通過吹焊臺的熱風機取下。

反面圖

當目標為取得設備的運行邏輯時,首先需要找到運行邏輯存放的位置。以STM32 MCU的開發板為例,會有多種boot模式,其中一種boot模式是從MCU內部的Flash中啟動,也就是說系統啟動初期的邏輯在這種模式下是從MCU內部Flash讀出的。但是這部分Flash的大小受限,通常容量情況為32KB ~ 512KB。那么其他的邏輯會通過SPI或者總線接口連接的外部Flash或SD卡等存儲設備存放。針對這一款設備,除了MCU內部Flash外,板上還預制了一顆容量為2MB的外部Flash。

本篇關注外部Flash上的邏輯獲取,通過SWD方式讀取MCU內部Flash和調試等方法會在后續章節介紹。智能家居設備上一般的外部Flash為SOP8寬體芯片。見下圖插座上的8腳芯片:

圖中紅圈的芯片就是從設備Wi-Fi模塊上取下的Flash

Flash廠商品牌常見的有: winbond,gigadevice等。

以gigadevice GD25Q16名稱為例

  • GD為廠商名
  • 25為芯片系列號
  • 16為MBit容量 也就2MB字節大小的Flash

Flash的內容可以通過編程器讀取,首先在PC端安裝相關的驅動和軟件(在購買時會由商家提供)后,就可以讀取Flash內容了。對編程器的選擇上建議一定要帶上插座,這樣可以減少芯片的吹焊次數。此外還有芯片夾,可以夾住板上的Flash芯片,直接嘗試讀取,免于取下的過程,但是實測成功率不是很理想。

一般連接PC后,編程器配套的軟件會自動識別出芯片類型和大小等信息。如果沒有可手工嘗試選擇近似的型號(根據芯片名稱)。

點擊讀取,待讀取結束后,可以將讀出的內容保存為bin文件。至此就獲取到了Wi-Fi模塊上Flash中的二進制內容。

0x02 逆向分析


在得到bin文件后就可以開始逆向分析了。

從設備MAC地址以及一些bin文件中特征字串和Wi-Fi模塊的外觀形態判斷,該設備Wi-Fi模塊使用的是上海漢楓公司(之后簡稱HF)提供的HF-LPT100S-10。該模塊包含一枚HF自研的MCU(HF-MC101,內置128KB SRAM)。而模塊上的Flash大小2MB。

將bin文件放入IDA,在加載的第一步中設置CPU類型為ARM Little End(根據該款設備的CPU類型)。之后會出現內存選項,如下圖。這里可選設置RAM的起始位置和大小,這一步將方便之后設置RAM中的變量名,建議根據芯片實際情況進行設置。這里RAM是128KB,起始位置是0x20000000。

現在需要分析bin中包含的邏輯。在HF官網上提供了SDK的下載(基于Keil開發環境)。通過查看SDK包含的文檔,得到如下針對ROM內容的結構描述。

這時可以建立一個ida py腳本,將得到的信息添加其中,在IDA中標注出各個segment:

當然也可以直接按長度,提取出各個段,例如提取出bin文件前512KB的app_main內容(見下面的附件)。

在進一步分析代碼前可以先標記出基礎庫,例如標記出文件管理,內存操作等相關函數。一般有兩種方式,第一種從文件自身的調試打印信息或者符號表包含的信息反推出函數;第二是加載獲取的FLIRT類信息到當前文件。

FLIRT是Fast Library Identification and Recognition Technology的縮寫,可以在https://www.hex-rays.com/products/ida/tech/flirt/index.shtml中找到相關的描述。簡單的說就是通過建立庫函數中使用匯編指令串以及各類引用的特征值匹配到當前當目標文件,標注出已知的各種函數名。當然定位函數,除了單純指令串特征值外,諸如bindiff類插件也會通過函數內邏輯,和相互間調用關系來確定函數,這樣的好處是提高庫函數的命中范圍和提高準確度。類似技術運用在函數定位上可以參見下面的插件:

https://github.com/devttys0/ida/tree/master/plugins/rizzo

針對LPT100S,有兩類庫文件可以導入,一類是Keil自身的一些庫,還有就是在HF提供的SDK中包含的庫LPB100Kernel.lib。通過FLIRT工具包,可以從這些庫中提取出sig文件。步驟如下(以LPB100Kernel.lib為例):

  1. 下載ida的sdk文件,解壓其中的flirt.zip
  2. 在bin目錄下找到對應系統的目錄,運行
    1. Pelf LPB100Kernel.lib LPB100Kernel.pat
    2. Sigmake LPB100Kernel.pat LPB100Kernel.sig
      1. 這時會報錯,打開LPB100Kernel.exc,處理沖突函數并刪掉開頭處的注釋
      2. 重新運行該條命令
  3. 將生成的LPB100Kernel.sig復制到ida安裝目錄\sig\arm\下

在IDA界面中通過Load File -> FLIRT signature file方式加載通過上面步驟生成的sig文件。之后就能生成如下效果了。

除了SDK中的庫文件,Keil自帶的C基礎庫在Keil安裝目錄下的ARMCC\arm\lib\中,可以按照同樣過程生成sig文件,并加載至分析文件中。這樣mem,str等基本的函數調用也會匹配上。

至此就能更方便的查看內部邏輯了。

0x03 感謝


piaca和redfree

http://www.devttys0.com/

0xFF 版權聲明


本文獨家首發于烏云知識庫(drops.wooyun.org)。本文并沒有對任何單位和個人授權轉載。如本文被轉載,一定是屬于未經授權轉載,屬于嚴重的侵犯知識產權,本單位將追究法律責任。


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()