作者:Yimi Hu & Light @ PwnMonkeyLabs
原文鏈接:https://mp.weixin.qq.com/s/SJhFVndjqTpSbZCN_sFW1g
前言
在本專題的上一篇中,我們完成了用IDA加載解析家庭版果加智能門鎖的固件。用IDA加載解析只是準備工作,我們理解這些代碼才是最終目的。本篇我們就開始嘗試分析這些代碼。
仔細看一下IDA解析出的代碼,內容多,沒有調試信息,也沒有可參考的字符串,這就導致很難弄清楚這些代碼的作用,更遑論分析代碼。所以,我們在本篇中嘗試以BLE通信為突破口,以此來研究一下這大片代碼的含義。根據BLE通信的特征,有2個方法找到固件中的關鍵代碼。如下:
A. 通過果加BLE通信的幀格式,直接在代碼中定位幀格式中的常量,可以快速找到BLE通信數據的解析函數。
B. 通過硬件電路,找到MCU與BLE芯片的通信引腳。然后查看文檔確定該引腳映射的內存地址,最后定位到代碼中BLE發送和接收函數。
這里我們采用A方法,B方法會在接下來的文章中介紹,大概是在關于鹿客門鎖的篇章中,如果可以分享的話。家庭版果加智能門鎖與配套的果加app進行BLE通信,所以通過逆向果加app可以確定BLE通信數據包的格式,并在格式中找到幫助我們定位固件代碼的常量。所以我們先開始app的逆向分析。
app分析
2.1 Java層分析
在本專題的前幾篇文章中,我們已經分析過幾個app了,這里也采用類似的方法。首先來觀察果加app輸出的日志,幸運的是筆者在2018年分析的果加家庭版智能門鎖app并沒有隱藏日志內容,而是大大方方的打印了出來。通過搜索日志內容中的關鍵字符串,我們很容易定位到發送BLE開鎖指令的關鍵代碼在cn.igoplus.locker.ble包中,截圖如下:

上圖為通過JEB反編譯工具分析該apk的截圖,相比于Jadx反編譯工具,JEB要更為方便一些。進一步追蹤BLE通信數據的生成過程,可以發現所有BLE通信指令的生成全部都在native函數中,這些native函數的聲明在cn.igoplus.locker.ble.cmd包中,如下圖所示:

這些函數的定義在都在libBleCmd.so中,翻閱代碼就可以找到該so的名稱和加載位置,如下圖所示:

那么,就開始分析該so的代碼吧。
2.2 Native層分析
通過zip工具解壓縮apk程序包,在lib\armeabi-v7a文件夾中即可找到libBleCmd.so庫文件,如下圖所示:

該文件可以被IDA自動解析,并不需要像上一篇解析固件那樣進行一系列的配置工作,如下圖所示:

待解析完畢之后,我們可以打開Exports選項卡,查看這個so文件的所有導出函數,如下圖:

在導出函數中可以找到所有BLE指令的生成函數,以及Decrypt和Encrypt用于加密或者解密BLE通信數據的函數,看函數命名應該是和Tea算法有點關系。在Tea算法中,存在幾個常量用于加密或解密運算,而這幾個常量就可以幫助我們定位關鍵代碼。所以,我們跟進Decrypt函數看一下,得益于強大的Hex-Rays Decompiler插件,我們可以按F5快捷鍵,直接查看關鍵位置的偽代碼:

上圖中,我們用紅框標識出了2個常量,接下來就通過這些常量分析一下固件代碼。
固件分析
開始固件分析之前,首先按照本專題上一篇中的相關內容,完成IDA對固件的加載工作。這里有一點要說明,從上一篇的截圖中,可以看到Armv6-M是Armv7-M的子集,所有Armv6-M可運行的程序能夠直接移植到Armv7-M架構上,將上一篇的截圖復制過來如下:

在上一篇中,我們解析時設置架構為Armv6-M,但是我們在撰寫本篇時,發現有些指令無法在IDA中使用Armv6-M架構進行反匯編,當我們改為使用Armv7-M架構時,很順利地解析了所有指令。很奇怪,我們也沒找到問題的原因,如果有知道原因的讀者可以告訴我們。在后文中,一律采用Armv7-M架構進行解析。
完成解析之后,我們就需要在固件文件中查找2-2節提到的常量,按alt + t快捷鍵,搜索我們找到的常量,如下圖所示:

搜索結果如下:

經過反復對比libBleCmd.so的Decrypt函數和固件F0-S1_1_1-H1_0-R.bin的代碼之后,我可以確定固件中Encrypt和Decrypt函數的位置,如下圖:

上圖中,其他位置的代碼雖然也引用了常量‘0xCE6D’,但看代碼內容不太像是Encrypt和Decrypt函數。
在此基礎之上,我們查找Decrypt函數的交叉引用,可以定位到代碼如下圖所示:

上圖中,兩處關鍵代碼已經用綠框圈出。首先看第一處關鍵點,即0xBABEC0DE位置,如果有讀者看過家庭版果加智能門鎖app的日志,肯定會記得這個常量,部分日志內容截圖如下:

可以看到,BLE消息就是以0xBABEC0DE字節開頭。由此可以推斷,圖3-5中的固件代碼應該是在處理接收到的BLE消息。進一步分析代碼,可以確定Decrypt函數的三個參數分別為:消息密文,消息長度和解密密鑰,并由此推斷內存MEMORY[0x20001848]開始的幾個字節應該是存儲了解密密鑰。通過搜索MEMORY[0x20001848]的交叉引用,可以找到密鑰的生成代碼、使用代碼等,并由此進一步擴大我們對固件代碼的理解,但這里就不再深入分析了。
通過對上述代碼的分析,我們可以猜測圖3-5中的sub_800B528函數具體功能應該是對接收到的消息進行預處理,檢驗消息頭是否正確,crc校驗是否正確,是否可以成功解密等。如果一切都順利,那么該函數返回0。搜索sub_800B528函數的交叉引用,可以定位到sub_800EB20函數,如下圖所示:

通過分析上圖中的代碼,可以確定該函數其實是對sub_800B528函數的封裝,根據sub_800B528的返回值,設置某些關鍵的內存。此外,還可以分析得出以內存0x20002D44開始的幾個字節中,存儲的是收到的BLE消息密文;內存MEMORY[0x20000174]存儲的是接收到的BLE數據長度。由此,我們對固件代碼的理解逐步增加。
繼續向上回溯調用sub_800EB20函數的位置,我們可以找到sub_80000C8函數。這個函數非常大,且非常復雜。具體的分析就留到下一篇中在進行討論吧。
小結
本篇是整個小玩鬧專題的第7篇,也是我們分析家庭版果加智能門鎖的第2篇。在本篇中,我們對家庭版果加智能門鎖的配套app進行了簡單的分析,著重研究了其BLE指令的構造過程以及so中的BLE指令加密和解密算法。然后根據BLE指令的特征,我們在門鎖的固件中定位到了解析BLE指令的代碼,并根據定位到的代碼逐步理解認識整個果加門鎖固件的邏輯。余下的關于該門鎖的分析內容已經不多了,我們將在下一篇中結束家庭版果加智能門鎖的分享內容。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1533/
暫無評論