微控制器對網絡安全威脅和攻擊的保護有限。因此,物聯網(IoT) 設備和依賴它們的嵌入式系統的安全性可能會受到損害。
為了提高物聯網設備或其固件的安全性,您需要確切地知道使用了哪些微控制器。掌握這些知識為更深入的軟件分析開闢了新的可能性,從而更有效地改進解決方案的性能和安全性。在本文中,我們展示了一種使用固件分析來識別微控制器型號的方法。
本文將對尋求自動執行微控制器識別過程的有效方法的嵌入式軟件開發人員和逆向工程專家有所幫助。
什麼是微控制器以及如何識別微控制器如今,人們每天使用各種嵌入式系統和物聯網設備,其中裝有各種微控制器。微控制器或微控制器單元(MCU) 是設計用於在嵌入式系統中執行特定操作的小型集成電路。
工程師經常在醫療物聯網設備、汽車系統,甚至航天工業中使用MCU。無論一個設備是測量你的心率、檢測空氣中的煙霧,還是管理你的智能汽車的能源消耗,都會有一整套微控制器參與到這個過程中。
一個基本的微控制器通常由三個核心組件組成:
處理器
記憶
輸入/輸出(I/O) 外設
微控制器通常具有有限的內存和帶寬資源,並且專用於特定任務。大多數微控制器都是定制的,沒有前端操作系統。
由於資源有限,微控制器很容易成為網絡犯罪分子的目標。這就是為什麼要確保IoT 設備得到適當的保護,解決設備所依賴的微控制器的特定漏洞和弱點至關重要。
當您擁有從頭開始構建的自定義設備時,您可能會了解它的所有來龍去脈。但是,如果您的項目記錄不完整,或者您必須使用您一無所知的物聯網設備,那麼首要任務是確定其使用的微控制器型號。
如何識別單片機型號?試圖將不同的二進製文件彼此區分開來可能具有挑戰性,尤其是當二進製文件使用大量相似的代碼或執行相似的功能時。在識別與微控制器相關的二進製文件時,您很容易遇到執行類似任務的函數,這會使事情變得比可執行二進製文件更加模糊。
然而,有一種有效的方法不僅可以識別微控制器的型號,還可以使過程自動化。
首先,讓我們看一下識別MCU型號需要採取的關鍵步驟:
要自動化此過程並能夠快速輕鬆地識別微控制器模型,您需要:
自動生成C 風格的偽代碼。您可以使用IDA-Pro 或Ghidra 等工具執行此操作。
從微控制器的代碼或數據庫中收集要搜索的微控制器的所有標頭。
現在讓我們看看如何使用這種方法識別未知的微控制器。
根據硬件地址識別MCU型號在本節中,我們將討論如何通過分析其外圍設備的硬件地址來識別微控制器的型號。
由於外圍設備使用硬件訪問,你應該可以在單片機的二進制代碼中看到對靜態硬件地址的訪問,而這些地址應該定義在一個C頭文件中。此外,由於這些地址是硬編碼的,因此它們不應受到二進制地址空間佈局隨機化(ASLR)的嚴重影響。
要遵循我們的指南,您需要了解C、Python和以下工具:
命令
IDA專業版
GNU 編譯器集合(GCC)
py-c-預處理器
我們將使用NXP的S32 PPC 微控制器,特別是MPC5 定時器演示。但是,請記住,下面描述的方法可以應用於您遇到的任何MCU。這種方法唯一可能效率低下的情況是,如果有一個與您的MCU 模型非常相似的微控制器;例如,如果兩個或多個MCU 型號由同一家公司製造並且具有相同的外圍設備。
現在讓我們開始吧。
1.分析單片機源碼使用MPC5 微控制器演示並在IDA-Pro 中查看其源代碼。您應該會以類似結構的模式看到一些對外圍設備的引用。當您深入研究時,您將看到對MPC5744P.h標頭的引用以及此類定義:
這些是對微控制器外圍設備的硬編碼引用。
你注意到它們是結構了嗎?這意味著由於填充和對齊,它們在內存中看起來會略有不同。
這些結構地址將是您的關鍵信息來源,因此您需要通過解析來獲取所有這些地址,而無需花費太多時間和精力。
2. 解析和排序來自標題的信息由於手動查找和復制硬件地址是一項繁瑣且耗時的任務,您可以嘗試將此過程自動化。
由於結構地址是定義,您可以使用GCC 通過以下命令解析它們:
在哪裡
包含微控制器頭文件的路徑。
執行此命令允許轉儲所有#definitions預處理器值。然後,您可以通過使用grep 實用程序處理目標結構來過濾接收到的信息。
一旦獲得GCC 的輸出,就可以使用正則表達式(regex)來過濾定義名稱和地址。在我們的示例中,我們將使用RE Python 模塊在Python 中使用正則表達式。
我們選擇使用Python 工具,因為Python 易於閱讀且易於學習。也不需要學習內存管理,相比其他一些語言,我們可以簡單方便地完成我們的任務。
以下是如何在Python 中使用正則表達式過濾數據:
注意:如果你遇到一些需要評估定義的場景
你將需要一個預處理器。預處理器將獲取#definitions值並在預編譯時解析出這些值,因此您不必通過多個標頭手動搜索它們。
以下是使用Python 的py-c-preprocessor執行此操作的方法:
現在,讓我們回到我們的分析。
3.將二進制轉儲為C風格的偽代碼如果您的硬件地址排序正確,您應該看到每個新外圍設備的地址從哪裡開始,從而能夠在二進製文件中找到外圍結構。
但是,嘗試在十六進制編輯器中解析二進製文件可能很困難。相反,您可以打開二進製文件並在IDA Pro 中對其進行分析。
在IDA Pro 中打開二進製文件後,您可以通過單擊file → produce file → C file生成帶有C 風格偽代碼的文件。帶有C 風格偽代碼的文件將保存微控制器模型識別所需的地址。
4.在偽代碼中搜索外設地址一旦有了C 文件,就可以開始搜索外圍設備地址了。如果您查看帶有C 風格偽代碼的文件,您會看到多行地址。
請注意,由於所存儲信息的大小,這些地址在偽代碼中略有偏差。
您應該能夠簡單地加載頭文件,解析和排序定義,然後使用C 風格的偽代碼在文件中搜索它們。和上一步一樣,可以使用regex解析C文件,使用parse_memory_locations_from_C_file函數過濾出自己需要的地址:
然後你需要將你從頭文件中拉取的排序後的地址和在C 風格的偽代碼文件中找到的地址傳遞給perform_search函數。
注意:從技術上講,如果您知道結構的大小,則可以在確切位置自動找到所有具有相同大小的結構。但是,我們不會描述這個過程,因為它超出了當前指南的範圍。
5.識別單片機型號使用C 風格偽代碼在文件中搜索外設地址後,您可以嘗試識別您的微控制器。為此,將二進製文件標頭中的硬件地址與C 文件中的地址進行比較。通過計算不同微控制器的加權分數,您將能夠識別您正在處理的那個。
以下是我們示例的結果:
加權得分最高的微控制器就是您要找的那個。在我們的例子中,它是MPC5744P.h 微控制器。
要查看我們指南中使用的腳本的完整代碼,請轉到Apriorit GitHub頁面。
結論微控制器是當今物聯網設備的重要組成部分。了解特定設備包含哪些微控制器對於有效提高設備的性能和安全性是必要的。
Recommended Comments