使用IDA pro逆向ARM M系核心的Bin固件

使用IDA pro逆向ARM M系核心的Bin固件

​ 物聯網和智能設備這兩年仍是比較火的,咱們的手中或多或少都有了幾個智能設備,好比手環,智能手錶,或者門鎖什麼之類的東西,可是同窗們在作逆向的時候,卻有不少問題。要否則是根本拿不到固件,要否則是拿到了Bin以後看不懂,這篇文章帶你們手把手調教IDA pro,讓他逆向無符號的Bin文件。linux

一.意義

​ 先說一下逆向固件的意義把,通常來講,這種小東西都會和外界有交互,藍牙,WIFI,網絡,4G,zigbee等等,咱們逆向出他的協議就能夠發現其中的安全問題。好比若是你逆向了一個手環的協議,發現它沒有作身份驗證或者驗證不嚴謹,就能夠批量的影響手環,或者你搞定了一個網絡協議,可能發現一個網絡的暴露服務,對雲平臺發起攻擊,等等。windows

 

​ 咱們固然能夠從APP上入手去搞,可是這幾年,隨着APP加固的大面積使用,難度係數正在上升,而硬件上,特別是M系的MCU,爲了成本,運算速度和功耗,不多有使用加密一類防護手段的。STM32系列可使用設置RDP位的方式鎖死固件讀取,可是這樣搞了以後,程序也就沒有辦法升級了,同時也帶來了開發和調試時間上的消耗,面對整分奪秒的市場,使用的仍是不多的。(實際上即使是開了防護也是有方法搞的。。。)安全

二.經過文件結構使IDA正確反彙編

​ 在開始搞以前,咱們先了解一下文件的結構。網絡

 

​ 你們熟悉的windows或者linux下的可執行文件,裏面會包含一些函數信息,也會包含加載基址,段,架構等信息,可是嵌入式設備爲了減少flash的佔用,這一切通通沒有。因此拖進IDA中以後是這個樣子的。
架構

 

IDA會問你,他是什麼架構的。函數

 

​ 咱們能夠經過查詢芯片信息的方式或獲得架構的信息(ARM架構固然是ARM啊),選擇使用ARM小端序進行反彙編。加密

 

 

​ 肯定進入以後,IDA還會問你一些信息。指針

 

 

​ IDA會問你,RAM的位置,ROM的位置和加載基址。因爲咱們什麼都不知道,直接按OK進入,等咱們拿到了一些信息以後回來改。調試

 

 

​ 進去以後是這個樣子的,先別慌,咱們還要改一個東西。索引

 

​ M系使用的是ARM的Thumb指令集,因此須要先改成Thumb指令集彙編。按ALT+g,把裏面T的值改成0x1.

 

 

以後就成了這個樣子

 

 

咱們先在0x00000000的位置按d,改變IDA的顯示位數,到DCB。在0x00000004的位置也同樣。

 

 

這個時候就要對整個ARM M核心的啓動流程有熟悉了,首先,0x00000000位置的值做爲棧的SP指針,以後把0x00000004位置的值寫入PC指針,也就是芯片上電以後開始的位置。

 

這個時候,就看出加載基質的做用了,因爲加載基地址不明確,咱們跳不到0x10001065中去。

 

咱們能夠在每一個0x2對齊的位置去按C(由於Thumb指令是0x2對齊的),讓IDA Pro強行反彙編。

 

按了幾個以後,就會發現整個調用的架構逐漸清晰起來了。

 

這時候,會發現一些位置的地址是紅色的,表示超出索引

 

 

能夠看出這兩句使用BX的絕對跳轉,加載基地址不會小於0x10000000,實際上就是0x10000000.具體加載基址的肯定,仍是須要研究人員對硬件和架構的熟悉,有很大程度是猜和試的成分。

 

好比上面的兩句話,實際上就是0x00000004地址上的值跳轉過來的,0x10001065和0x10001064相差0x1,這是一個歷史遺留問題,可是不會產生影響,CPU會自動糾偏。憑藉此就能夠得出加載基址的位置。

 

去年KCON,有一個議題就是講如何自動尋找加載地址,利用的就是固件中一些絕對的加載位置,有興趣你們能夠看一下。

 

肯定了加載地址,咱們從新載入以後,就能夠看見正常的調用關係了。

 

 

以後在仍是按照上面的方法,進行操做,因爲加載地址是正確的,就能夠識別出不少的函數調用關係,咱們按C強制讓ida pro彙編的地方也會少不少。

 

裏面還會發現一些紅色的地址,這就要參考硬件的芯片手冊肯定意義了

 

有一些函數是硬件中斷處理函數,由硬件觸發,與主線沒有調用關係,因此仍是會發現一些沒有反彙編的代碼,手動按C彙編一下就好了。

 

可是其中的函數沒有名字,是這個樣子的,很難受

 

 

怎麼辦呢?因爲硬件的底層函數大部分都是標準函數,由芯片廠商提供,所以能夠本身搭建一個和目標相同的開發環境,編譯一個函數比較全的固件,以後使用bindiff進行函數查找。

 

咱們先寫一個函數比較多的程序,以後編譯,獲得axf文件,使用ida進行反編譯

 

axf文件是有不少輔助信息的,拖入以後ida pro直接能夠識別

 

反彙編以後,代碼結構和函數名能夠直接顯示出來

 

 

這個時候直接關閉,保存反彙編的結果

 

打開目標bin文件,恢復出函數結構以後,打開bindiff,加載以前保存的axf文件的反彙編結果

 

 

加載以後

 

 

能夠看到函數名的對應關係

 

 

咱們也能夠簡單看一下bindiff的匹配原理是什麼,每一個匹配的函數,bindiff都會給一個匹配理由

 

 

這樣咱們就可使用IDA PRO繼續進一步的分析了,但願這篇文章拋磚引玉,可讓你們的研究出更多好玩的東西。
----------------分割線---------------------------------------
今天下載的NSA剛發佈的ghidra 9.0,逆向ARM M也是同一個套路,只不過操做的鍵位不一樣。效果以下:
還算能夠可是他的diff功能更傾向於查找不一樣點,我暫時還沒找到構建函數名索引,目前仍是IDA Pro比較好用

相關文章
相關標籤/搜索