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

逆向工程物聯(lián)網(wǎng)固件解析part 1

安全 應(yīng)用安全
在本文中,我們展示了智能空氣凈化器逆向工程固件的實(shí)際示例,強(qiáng)調(diào)了研究其架構(gòu)的重要性。本文對(duì)于致力于網(wǎng)絡(luò)安全項(xiàng)目、想要了解逆向工程物聯(lián)網(wǎng)設(shè)備的細(xì)微差別和步驟的開發(fā)團(tuán)隊(duì)很有幫助。

物聯(lián)網(wǎng) (IoT) 設(shè)備已經(jīng)成為我們?nèi)粘I睢⒐ぷ鳝h(huán)境、醫(yī)院、政府設(shè)施和車隊(duì)的重要組成部分。比如:Wi-Fi打印機(jī)、智能門鎖、報(bào)警系統(tǒng)等等。2020 年,美國(guó)居民平均擁有十多個(gè)聯(lián)網(wǎng)設(shè)備。但出于實(shí)用性而選擇物聯(lián)網(wǎng)設(shè)備的用戶還需要確保這些設(shè)備的安全。

由于物聯(lián)網(wǎng)設(shè)備通常連接到內(nèi)部家庭或公司網(wǎng)絡(luò),因此破壞此類設(shè)備可以為犯罪分子提供對(duì)整個(gè)系統(tǒng)的訪問權(quán)限。2021 年前六個(gè)月,智能設(shè)備遭受了約 15 億次攻擊,攻擊者試圖竊取數(shù)據(jù)、挖掘加密貨幣或構(gòu)建僵尸網(wǎng)絡(luò)。

確保物聯(lián)網(wǎng)設(shè)備良好安全性的一種方法是執(zhí)行逆向工程活動(dòng),這將幫助您更好地了解特定設(shè)備的構(gòu)建方式,并允許您對(duì)設(shè)備及其固件進(jìn)行進(jìn)一步分析。

在本文中,我們展示了智能空氣凈化器逆向工程固件的實(shí)際示例,強(qiáng)調(diào)了研究其架構(gòu)的重要性。本文對(duì)于致力于網(wǎng)絡(luò)安全項(xiàng)目、想要了解逆向工程物聯(lián)網(wǎng)設(shè)備的細(xì)微差別和步驟的開發(fā)團(tuán)隊(duì)很有幫助。

研究固件架構(gòu)的重要性

逆向工程物聯(lián)網(wǎng)固件的過程因所研究的設(shè)備而異。

物聯(lián)網(wǎng)設(shè)備發(fā)展得非常快,市場(chǎng)的主導(dǎo)架構(gòu)一直在變化。不到十年前,最流行的選擇主要是 x86 或 ARM,不太可能是 MIPS 或 PowerPC。但現(xiàn)在,您需要了解多種微控制器架構(gòu)來對(duì)嵌入式設(shè)備進(jìn)行逆向工程:Tricore、rh850、i8051、PowerPC VLE等。

深入學(xué)習(xí)單一架構(gòu)不足以在物聯(lián)網(wǎng)逆向工程中取得成功。如果開發(fā)人員有必要盡快開始逆向工程,他們應(yīng)該從學(xué)習(xí)固件架構(gòu)和結(jié)構(gòu)的基礎(chǔ)知識(shí)開始。

這正是我們想要在本文中描述的:逆向工程師研究他們以前從未見過的新架構(gòu)和固件格式的方式。

在本文中,我們使用了小米空氣凈化器 3H 的固件轉(zhuǎn)儲(chǔ)。我們選擇它是因?yàn)樗?ESP32 CPU(即Tensilica Xtensa 架構(gòu))的固件轉(zhuǎn)儲(chǔ)。這是一種相當(dāng)奇特的架構(gòu)選擇,但在需要 Wi-Fi 通信的物聯(lián)網(wǎng)設(shè)備中很常見。您可以在此 GitHub 頁面上找到我們將作為本文示例進(jìn)行逆向工程的固件 (ESP-32FW.bin) 。

這種情況的挑戰(zhàn)是,沒有針對(duì)固件架構(gòu)的現(xiàn)有反編譯器,并且反匯編器幾乎不支持它。然而,這是逆向工程師當(dāng)今面臨的一個(gè)非常準(zhǔn)確的例子。

物聯(lián)網(wǎng)固件逆向工程過程由以下五個(gè)階段組成:

逆向工程物聯(lián)網(wǎng)固件解析part 1逆向工程物聯(lián)網(wǎng)固件解析part 1

1.確定架構(gòu)

在對(duì)物聯(lián)網(wǎng)設(shè)備進(jìn)行逆向工程之前要問的第一個(gè)問題是如何了解逆向工程所需的固件的架構(gòu)。

最直接的找出方法是閱讀 CPU 的數(shù)據(jù)表并從中了解答案。但在某些情況下,您所擁有的只是固件本身。在這種情況下,您可以使用以下兩個(gè)選項(xiàng)之一:

1. 字符串搜索可能允許您找到一些剩余的編譯字符串,其中包含有關(guān)編譯器名稱和體系結(jié)構(gòu)的信息。

2. 二進(jìn)制模式搜索要求您了解不同類型的微控制器架構(gòu)中經(jīng)常使用的指令。您可以在固件中搜索特定架構(gòu)常見的二進(jìn)制模式,然后嘗試將固件加載到支持此類架構(gòu)的反匯編程序中以驗(yàn)證您的猜測(cè)。

一旦確定了架構(gòu)類型,您就可以開始選擇用于進(jìn)一步逆向的工具集。對(duì)于 ESP-32FW.bin,我們已經(jīng)知道它將是 Tensilica Xtensa 架構(gòu),因此我們需要選擇要用于研究的反匯編程序。

2.選擇反匯編工具

在研究了可以支持 Xtensa 的適當(dāng)反匯編程序后,我們最終得到了三個(gè)選項(xiàng):IDA、Ghidra和Radare。

我們決定首先嘗試使用 Ghidra 和 IDA,因?yàn)槲覀円呀?jīng)擁有將這些工具成功應(yīng)用于不同逆向工程項(xiàng)目的豐富經(jīng)驗(yàn)。由于 IDA 沒有用于 Xtensa 的反編譯器,只有用于反匯編器的 CPU 模塊,因此我們決定首先嘗試使用 Ghidra(我們使用的是 10.0 版本)。

Ghidra 默認(rèn)不支持 Xtensa,因此我們需要先為 Ghidra 安裝 Tensilica Xtensa 模塊。

Xtensa 的反匯編程序可以工作,但反編譯程序存在一些問題,如下面的屏幕截圖所示:

屏幕截圖 1. 有關(guān) Ghidra 反編譯器中未實(shí)現(xiàn)指令的警告屏幕截圖 1. 有關(guān) Ghidra 反編譯器中未實(shí)現(xiàn)指令的警告

經(jīng)過一段時(shí)間的反匯編,我們意識(shí)到 Xtensa 的 Ghidra 處理器模塊在多種情況下難以確定指令長(zhǎng)度。因此,我們放棄了 Ghidra,轉(zhuǎn)而使用 IDA(我們使用的是 7.7 版本)。

起初在處理器模塊列表中找到 Xtensa 很困難,但最終我們?cè)谶@里找到了它:

屏幕截圖 2. IDA 處理器模塊列表中的 Xtensa屏幕截圖 2. IDA 處理器模塊列表中的 Xtensa

IDA 中的處理器模塊看起來足夠穩(wěn)定,因此我們決定堅(jiān)持使用 IDA。

3. 加載固件

第一步是將固件加載到正確的映像基地址,以便將所有全局變量指針解析為有效地址。為此,有必要了解代碼在二進(jìn)制文件中的位置。

我們首先在基地址加載固件0,并嘗試標(biāo)記盡可能多的代碼。為了能夠在 IDA 中正確標(biāo)記代碼,我們需要學(xué)習(xí) Xtensa 固件常見的典型指令序列。為了找出在函數(shù)序言中使用哪些指令,我們從GitHub 中獲取了一個(gè)示例:esp8266/Arduino:適用于 Arduino 的 ESP8266 核心。

編譯器似乎使用了以下指令:entry a1, XX

該指令根據(jù)參數(shù)的值轉(zhuǎn)換為字節(jié)序列,例如 36 41 00 / 36 61 00 / 36 81 00 XX。

通過實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 IDA 腳本來搜索此類模式,可以標(biāo)記大約 90% 的代碼:

屏幕截圖 3. 在 IDA 中標(biāo)記代碼的結(jié)果屏幕截圖 3. 在 IDA 中標(biāo)記代碼的結(jié)果

一旦我們找到了代碼,就該探索并看看它看起來是否正確。

看看下面的截圖,很明顯有問題。字符串資源被正確引用,但call8指令指向字符串,而不是代碼。并且有些call8指令指向不存在的地址。通常這意味著映像基址錯(cuò)誤,固件必須加載到其他基址,而不是0.

屏幕截圖 4. 發(fā)現(xiàn) call8 指令指向字符串和不存在的地址屏幕截圖 4. 發(fā)現(xiàn) call8 指令指向字符串和不存在的地址

確定基地址的常見方法是:

1.選擇一個(gè)字符串。

2.使用該字符串地址的低位部分查找引用它的代碼。

3.找出真實(shí)的字符串地址和我們?cè)诖a中看到的地址之間的差異。因此,我們可以理解如何移動(dòng)代碼的地址以匹配字符串的當(dāng)前地址。

在這種情況下,我們發(fā)現(xiàn)基地址一定是0x3F3F0000,但即使使用它,call8指令仍然無效。這可能意味著二進(jìn)制數(shù)據(jù)被分段,并且閃存中的代碼被分段映射到 RAM。因此,有必要將固件分割成多個(gè)片段,并將這些片段加載到 IDA 的適當(dāng)段中。

我們查看了固件中的字符串,發(fā)現(xiàn)它確實(shí)是分段的:

屏幕截圖 5. 固件分段證明屏幕截圖 5. 固件分段證明

經(jīng)過進(jìn)一步研究,我們發(fā)現(xiàn)了ESP IDF 框架。由于我們的目標(biāo)固件包含該框架的某些版本,因此我們可以嘗試使用其源代碼來了解固件結(jié)構(gòu)。

我們?cè)?ESP IDF 內(nèi)的 bootloader_utility.c 源代碼文件中發(fā)現(xiàn)了一個(gè)有趣的bootloader_utility_load_partition_table()函數(shù),這意味著固件必須包含分區(qū)表。

屏幕截圖 6. bootloader_utility_load_partition_table() 屏幕截圖 6. bootloader_utility_load_partition_table()

為了識(shí)別分區(qū)表,我們繼續(xù)探索源代碼,最終找到了 esp_partition_table_verify ()函數(shù),該函數(shù)由bootloader_utility_load_partition_table()函數(shù)調(diào)用:

屏幕截圖 7. 發(fā)現(xiàn) esp_partition_table_verify() 函數(shù)屏幕截圖 7. 發(fā)現(xiàn) esp_partition_table_verify() 函數(shù)

所以一定有ESP_PARTITION_MAGIC和ESP_PARTITION_MAGIC_MD5:

逆向工程物聯(lián)網(wǎng)固件解析part 1逆向工程物聯(lián)網(wǎng)固件解析part 1

二分搜索AA 50給了我們很好的結(jié)果:

屏幕截圖 8. AA 50 的二分搜索成功結(jié)果屏幕截圖 8. AA 50 的二分搜索成功結(jié)果

兩者ESP_PARTITION_MAGIC都ESP_PARTITION_MAGIC_MD5可以在附近看到。最有可能的 sub_3F3F4848 是esp_partition_table_verify()。

由于我們已經(jīng)知道esp_partition_table_verify函數(shù)在哪里,因此我們能夠找到bootloader_utility_load_partition_table函數(shù)和 ESP_PARTITION_TABLE_OFFSET 文件偏移量:

屏幕截圖 9. 查找 bootloader_utility_load_partition_table

屏幕截圖 9. 查找 bootloader_utility_load_partition_table 和 ESP_PARTITION_TABLE_OFFSET

屏幕截圖 10. 查找偏移值屏幕截圖 10. 查找偏移值

ESP_PARTITION_TABLE_OFFSET 是 ESP32-FW.bin 文件中的文件偏移量?,F(xiàn)在我們只需要知道分區(qū)表?xiàng)l目的結(jié)構(gòu)。ESP IDF框架的源代碼再次幫助了我們:

逆向工程物聯(lián)網(wǎng)固件解析part 1逆向工程物聯(lián)網(wǎng)固件解析part 1

我們已將這些結(jié)構(gòu)導(dǎo)入 IDA 并將其應(yīng)用到分區(qū)表數(shù)據(jù)中:

屏幕截圖 11. 將結(jié)構(gòu)導(dǎo)入 IDA 并將其應(yīng)用到分區(qū)表數(shù)據(jù)屏幕截圖 11. 將結(jié)構(gòu)導(dǎo)入 IDA 并將其應(yīng)用到分區(qū)表數(shù)據(jù)

如您所見,esp_partition_pos_t.offset 是每個(gè)分區(qū)的文件偏移量,我們現(xiàn)在可以將 ESP32-FW.bin 拆分為分區(qū)。 

但是我們?nèi)绾尾拍軐⒚總€(gè)分區(qū)加載到適當(dāng)?shù)牡刂纺??似乎有一個(gè)image_load()函數(shù)負(fù)責(zé)將固件分區(qū)映射到地址空間:

屏幕截圖 12. 將固件分區(qū)映射到地址空間屏幕截圖 12. 將固件分區(qū)映射到地址空間

逆向工程物聯(lián)網(wǎng)固件解析part 1逆向工程物聯(lián)網(wǎng)固件解析part 1

接下來,每個(gè)分區(qū)被分成段。在標(biāo)題之后,您可以看到一個(gè)結(jié)構(gòu),后面是實(shí)際數(shù)據(jù):

逆向工程物聯(lián)網(wǎng)固件解析part 1逆向工程物聯(lián)網(wǎng)固件解析part 1

這里,esp_image_segment_header_t.load_addr是 CPU 地址空間中段數(shù)據(jù)的虛擬地址。

分區(qū)內(nèi)的段如下所示:

逆向工程物聯(lián)網(wǎng)固件解析part 1逆向工程物聯(lián)網(wǎng)固件解析part 1

現(xiàn)在,有了有關(guān)段的完整信息,我們可以將分區(qū)拆分為段并將它們加載到 IDA 中的適當(dāng)?shù)刂贰N覀兛梢允謩?dòng)完成此提取工作,也可以嘗試通過 IDA 加載器插件將其自動(dòng)化。

盡管如此,Ghidra 似乎已經(jīng)實(shí)現(xiàn)了這樣的加載器。

本文翻譯自:https://www.apriorit.com/dev-blog/reverse-reverse-engineer-iot-firmware如若轉(zhuǎn)載,請(qǐng)注明原文地址

責(zé)任編輯:武曉燕 來源: 嘶吼網(wǎng)
相關(guān)推薦

2022-07-29 08:06:31

物聯(lián)網(wǎng)終端安全

2022-09-30 15:37:59

物聯(lián)網(wǎng)無線(OTA)固件

2022-10-08 14:14:57

物聯(lián)網(wǎng)設(shè)備零售商

2019-11-20 18:47:26

物聯(lián)網(wǎng)OTA軟件

2022-11-08 10:19:15

2018-03-05 08:23:40

物聯(lián)網(wǎng)互聯(lián)網(wǎng)網(wǎng)絡(luò)技術(shù)

2020-06-22 10:21:44

物聯(lián)網(wǎng)藍(lán)牙技術(shù)

2023-08-18 11:42:51

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

2019-11-20 10:04:21

物聯(lián)網(wǎng)通訊協(xié)議IOT

2020-10-25 15:50:07

物聯(lián)網(wǎng)工業(yè)技術(shù)

2023-07-24 11:48:59

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

2019-01-24 08:16:42

空中固件物聯(lián)網(wǎng)IOT

2020-06-01 14:15:57

物聯(lián)網(wǎng)通信協(xié)議無線通訊

2019-07-26 05:52:04

土木工程物聯(lián)網(wǎng)IOT

2016-11-28 14:45:00

IBM

2016-01-13 10:34:57

物聯(lián)網(wǎng)物聯(lián)網(wǎng)技術(shù)

2019-04-08 11:18:09

2011-08-15 09:36:01

2011-02-22 16:47:34

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

2021-04-13 11:00:12

云計(jì)算物聯(lián)網(wǎng)
點(diǎn)贊
收藏

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