物聯網和智能設備這兩年仍是比較火的,咱們的手中或多或少都有了幾個智能設備,好比手環,智能手錶,或者門鎖什麼之類的東西,可是同窗們在作逆向的時候,卻有不少問題。要否則是根本拿不到固件,要否則是拿到了Bin以後看不懂,這篇文章帶你們手把手調教IDA pro,讓他逆向無符號的Bin文件。linux
先說一下逆向固件的意義把,通常來講,這種小東西都會和外界有交互,藍牙,WIFI,網絡,4G,zigbee等等,咱們逆向出他的協議就能夠發現其中的安全問題。好比若是你逆向了一個手環的協議,發現它沒有作身份驗證或者驗證不嚴謹,就能夠批量的影響手環,或者你搞定了一個網絡協議,可能發現一個網絡的暴露服務,對雲平臺發起攻擊,等等。windows
咱們固然能夠從APP上入手去搞,可是這幾年,隨着APP加固的大面積使用,難度係數正在上升,而硬件上,特別是M系的MCU,爲了成本,運算速度和功耗,不多有使用加密一類防護手段的。STM32系列可使用設置RDP位的方式鎖死固件讀取,可是這樣搞了以後,程序也就沒有辦法升級了,同時也帶來了開發和調試時間上的消耗,面對整分奪秒的市場,使用的仍是不多的。(實際上即使是開了防護也是有方法搞的。。。)安全
在開始搞以前,咱們先了解一下文件的結構。網絡
你們熟悉的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比較好用