基于mcu固件反匯編逆向入門示例-stm32c8t6平臺
本文目標:基于mcu固件反匯編逆向入門示例-stm32c8t6平臺
按照本文的描述,應該可以在對應的硬件上通實驗并舉一反三。
先決條件:擁有C語言基礎,集成的開發環境,比如:IDA 7.0
前言
機緣巧合之下,有使用固件反匯編的經歷,所以寫下此文用作學習筆記。
使用場景
嵌入式固件逆向的場景中會使用到,具體是獲得產品固件的文件內容,進行反編譯,從而繼續研究和驗證,獲取產品的開發思路。在網絡上下載IDA 7.0,進行安裝。
新建工程
第一步:雙擊32bit的ida,選擇new
第二步:找到需要進行分析的文件,最好是分析hex文件,找個工具把bin文件轉成hex文件好一些,打開,選擇小端模式(stm32是小端)分析
第三步:參考如下的配置進行配置工程
工程出來后,會在左邊的窗口發現很多地址,這些地址就是函數,逆向工程的活就是分析這些函數是做啥的,理解函數的意圖
函數分析
雙擊左邊欄的一些函數可以看到詳情,隨便找個地址來進行分析一下,鼠標放在我下圖的黃色函數地址上
按Ctrl + x,可以列出這個函數的調用,函數涉及地方。
在這個函數中按F5,會跳轉到對應的偽c代碼窗口
然后就是分析代碼片段的意圖了,經過現在的ai加持,已經能初步進行分析了。
// 原始代碼
int __fastcall sub_8004770(int a1, int a2)
{char v2; // 用來累加字節值的變量int v3; // 當前處理的字節偏移量int v4; // 需要處理的字節數int v5; // 當前處理的字節在內存中的地址v2 = 0; // 初始化累加變量v3 = 0; // 初始化偏移量v4 = a2 - 2; // 計算需要處理的字節數while (v3 < v4){// 計算當前字節的地址v5 = a1 + v3;// 更新偏移量v3 = (unsigned __int16)(v3 + 1);// 累加當前字節的值v2 += *(_BYTE *)(v5 + 1);}// 返回累加結果經過計算后的值return (unsigned __int8)(-85 - v2);
}// 更容易理解的版本
int calculate_sum_and_offset(int base_address, int length)
{char sum = 0; // 累加器,初始值為0int offset = 0; // 偏移量,初始值為0int target_length = length - 2; // 需要處理的字節數// 遍歷并累加從base_address開始的每個字節的值while (offset < target_length){sum += *(char *)(base_address + offset + 1); // 累加字節值offset++; // 更新偏移量}// 返回計算結果return (unsigned char)(-85 - sum);
}
經過耐心的分析之后,就可以分析出這個代碼片段的意圖是求一個校驗和的功能。
總結
逆向分析相比于正向開發難度不是一個水平的,市場上有一些人專門從事逆向開發的工作,而且逆向開發需要懂匯編,不然逆向出來都是匯編代碼,看不懂就沒法還原代碼了。逆向的人懂正向開發,正向開發的人不一定懂逆向開發,只有產品的價值性很高時才可能進行逆向開發,不然沒必要逆向。畢竟逆向開發可能連固件都獲取不到,main函數也找不到在哪,更別談函數內的各種調用關系了。
筆者在逆向方面也只是小白,只能做到拋磚引玉。更多深層次的東西還需要靜下心來研究。
本文完!!感謝閱讀,感謝關注。