作者:Yimi Hu & Light @ PwnMonkeyLabs
原文鏈接:https://mp.weixin.qq.com/s/_-CUaJJnrWlcDuUGVL4x8w
簡介
經過了前面五篇的學習,想必各位讀者已經掌握了一些必要的技能,可以適當的增加一些難度了。在本專題的第六篇以及下一篇文章中,我們將對果加門鎖進行分析。
果加的智能門鎖大體分為兩個系列,其一是家用版智能門鎖,其二是公寓版智能門鎖。家用版智能門鎖通過BLE與手機通信,并通過手機間接與果加云端通信;公寓版門鎖通過433MHz與其對應的網關通信,網關與果加云端通信。盡管通信方式不同,但是家用版和公寓版門鎖的架構和用到的芯片都是類似的,因此本篇及下一篇文章中,我們重點對家用版門鎖的固件進行分析,偶爾提及公寓版門鎖。
固件分析
固件,通常是指驅動底層硬件的軟件程序,固件直接與硬件打交道,控制硬件實現各種邏輯功能。而在IoT設備中,固件通常包含了RTOS(Real Time Operating System, 實時操作系統)和應用軟件,提供了從底層驅動到高層應用的所有功能。
大部分IoT設備的固件存儲在Flash中,在進行分析之前,首先需要設法獲取設備固件。
2.1 固件獲取
家庭版果加智能門鎖需要通過使用者的手機間接連接到果加的云端服務器,我們只要監聽app的通信數據,就可以發現門鎖更新時的固件下載地址,如下圖2-1所示。

上圖中的抓包工具是fiddler,鑒于該軟件是本專題中第一次出現,所以這里做個簡短的介紹。Fiddler是一款由Progress公司開發的免費抓包工具,官網是:https://www.telerik.com/fiddler。在眾多的抓包工具中,我們認為fiddler的界面比較好看。使用fiddler抓取手機通信時,需要對fiddler進行兩處設置,同時對手機也做兩處設置,fiddler的兩處設置截圖如下:

上圖中,左側設置為解密HTTPS通信,右側設置為允許局域網其他設備連接代理。手機的兩處設置截圖如下:

上圖中,左側設置為添加fiddler的根證書,右側設置為通過fiddler代理轉發通信數據。圖中10.0.0.16是運行fiddler的計算機ip,8888是fiddler默認的監聽端口。設置完畢之后,就可以抓取手機通信。在本專題的后續文章中,可能涉及到一些證書校驗而導致無法抓包的情況,到時我們會更深入地討論。
相對來講,公寓版的果加智能門鎖要麻煩一些。公寓版的果加智能門鎖在433MHz信道與其網關進行無線通信,網關通過有線連接到互聯網,進而訪問果加云端。我們在交換機上做了一次端口監控,通過分析鏡像而來的通信數據找到了固件的下載地址。

2.2 分析準備
通常情況下,我們選擇IDA作為固件分析工具,IDA是一款非常卓越的反匯編工具,相信很多人都曾使用過,這里就不做過多的介紹了。不同于Windows程序或者Android程序,IoT設備的固件在開始逆向之前要做一些準備。如果要分析Windows程序,一般都是直接拖到IDA中,IDA會自動識別為PE格式文件,并幫助我們選擇好處理器型號等信息(MetaPC),如下圖:

而對于IoT設備,IDA無法自動完成上述分析,因為固件往往與IoT設備的底層硬件直接相關,而在底層硬件中MCU(Microcontroller Unit, 微控制單元)是最為關鍵的一部分,不同MCU會使用不同的指令集、文件系統等。因此,要使用IDA分析固件,必須先確定MCU的相關信息。
正如我們在第二章開頭所述,固件一般要包含一個實時操作系統,設備上電后就會引導啟動這個RTOS。如果設備是基于嵌入式Linux操作系統運行的,那么就會引導Linux kernel程序。此時,在固件中還可以發現Linux文件系統,而文件系統中的各個程序將是我們的分析重點。如下圖所示:

上圖中可以看到海康威視智能門鎖網關有Squashfs文件系統和JFFS2文件系統,還有U-Boot引導程序等。
如果設備是運行其他RTOS,如FreeRTOS等,那么,此時的固件文件可能就完全是一段編譯好的包含代碼和數據的可執行文件。我們這次要分析果加智能門鎖的固件,就是單純的一個可執行文件,如下圖所示:

為了幫助我們快速辨別固件文件中都有什么,binwalk是個非常好用的工具,其官方的下載地址為:https://github.com/ReFirmLabs/binwalk。我們在整理本篇時,發現binwalk的開發團隊出了一個商業版binwalk pro,可以在線分析和提取固件,好像還挺有意思。在圖2-6和圖2-7中,我們已經展示了binwalk對于固件的分析輸出,其中圖2-6是海康智能門鎖網關的固件內容,本專題的后續文章中會酌情考慮要不要分享一下拿海康智能門鎖的案例;在圖2-7中,binwalk沒有任何輸出,說明binwalk無法辨別此固件的內容,實際上這個固件完全是個可執行文件。除此之外,binwalk還可以直接解壓提取固件中的內容,但果加智能門鎖的固件并沒有什么可以提取的內容。
此時,如果是嵌入式Linux操作系統,那么就可以開始分析他文件系統中的關鍵程序了。IDA可以自動解析出ELF文件格式,然后開始反匯編工作。但是果加智能門鎖的固件完全是個單片機程序,那么IDA不能完成自動解析工作,所以我們需要手動指定一些解析信息。
首先我們需要確定MCU使用的指令集,首先通過MCU上刻印的芯片型號(STM32L071),找到對應的Reference Manual或Datasheet,通過這些文檔可以確定MCU使用了Arm Cortex-M0+內核,該內核采用Armv6-M架構,如下圖所示。

IDA中已經內置了Armv6-M架構的指令集,我們只需要載入文件時做出如下圖的配置即可:

確定了指令集之后,我們還需要設置固件加載地址。熟悉PE結構的讀者,肯定知道PE頭中有個重定位表。當PE文件的加載地址并非其默認地址時,就需要根據重定位表對PE文件中的全局變量、絕對跳轉地址等進行重定位修復。但果加智能門鎖這種固件程序,是沒有這些復雜的格式,所以如果不能確定代碼的加載地址,IDA加載的時候就會出現很多不能解析的跳轉和全局變量。通常MCU都會有一塊固定的存儲區域用于存儲代碼,這個區域的起始地址就是固件的加載地址,這些信息同樣可以在References Manual或Datasheet中找到。果加智能門鎖使用的STM32L071的相關信息如下圖所示:
圖2-10
上圖中顯示固件代碼會加載到Flash System Memory區域,即0x0800 0000地址之后的內存。那么我們在IDA加載過程中設置ROM起始地址為0x0800 0000,如下圖:

2.3 程序分析
上文中已經給IDA指定了解析固件所需要的部分信息,等IDA加載完畢之后,我們發現IDA依舊將其當成一個binary文件,并未解析出任何代碼,這是因為IDA不知道該從哪里開始解析。此時我們可以翻看programming mannual,查到與中斷向量表有關的內容,如下圖:

由上圖可知,固件的起始部分應是中斷向量表。設備上電之后執行的代碼,即Reset復位中斷,位于中斷描述表中第二項所指的位置,偏移0x4,截圖如下:

跳轉到此位置(0x8001BD),然后按’c’令IDA將此處解析為代碼,IDA將解析出大量的代碼段和函數。之后,我們就可以開始固件的逆向分析工作了。

到此,我們已經完成了固件中的指令解析,那么接下來的工作就是理解這些代碼的邏輯。這部分內容將會在本專題的下一篇文章中介紹。
小結
本篇中,我們開始了對果加智能門鎖的分析。相比于前幾篇,對果加智能門鎖的分析要更為復雜一些,一方面需要綜合運用前幾篇中講到的各種技能和分析方法,另一方面需要我們結合硬件知識對固件代碼進行綜合分析。本篇中提到的Datasheet、References Manual、Programming Mannual均可從st官網下載到,地址如下:
https://www.st.com/zh/microcontrollers-microprocessors/stm32l071rz.html。到本篇結束時,我們只是剛剛做好了準備工作,真正的分析內容將放到下一篇中與大家分享。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1532/
暫無評論