0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何利用IDA Pro逆向分析ARM二進(jìn)制映像

技術(shù)讓夢想更偉大 ? 來源:技術(shù)讓夢想更偉大 ? 2023-11-30 10:30 ? 次閱讀

在本文中,我們將以ANYTONE 878UVII對講機(jī)中的固件為例,為大家演示如何對ARM固件映像進(jìn)行逆向分析。不過,本文中的大部分內(nèi)容,對于ARM架構(gòu)來說都是通用的。

本文假設(shè)讀者已經(jīng)熟悉IDA Pro,并且至少分析過一些普通的二進(jìn)制文件。如果您還不熟悉IDA,只需在網(wǎng)上搜索一下,就能找到許多非常優(yōu)秀的入門教程,大家可以先通過它們來掌握相關(guān)的基礎(chǔ)知識。

固件映像就本文來說,我們只需IDA Pro和ANYTONE 878UVII對講機(jī)的固件映像就能搞定我們的實(shí)驗(yàn)。并且,所需的映像還可以從分銷商網(wǎng)站下載。實(shí)際上,下載哪個(gè)版本并不重要,但本文是將以2.04版本為例進(jìn)行介紹。

wKgaomVn9TuACAuwAAAQISh9Rf4210.png

在下載的更新包中,我們可以找到FW文件夾,其中包含三個(gè)文件:CDI、SPI和CDD文件。其中,CDD是最大的文件,它實(shí)際上就是我們要分析的固件映像。

這次我們的運(yùn)氣不錯,因?yàn)檫@個(gè)固件映像并沒有加密,否則,事情就會麻煩一些。它只是內(nèi)部閃存中的映像,甚至連文件頭都沒有。并且,該文件的元數(shù)據(jù)被拆分為單獨(dú)的文件。所以,我們可以直接在IDA Pro中加載CDD文件。

技術(shù)背景ANYTONE 878系列對講機(jī)使用的是GigaDevice GD32 ARM Cortex-M4微控制器:通過拆開對講機(jī),我們就能看到這些芯片的型號。

除了拆對講機(jī)外,實(shí)際上還有另一種更方便的方法:查詢FCC。如果您的設(shè)備符合FCC的要求,網(wǎng)上應(yīng)該有關(guān)于它的公開信息。這時(shí),我們可以直接在FCC或獨(dú)立的數(shù)據(jù)庫中搜索制造商的信息。大多數(shù)情況下,我們會找到一份帶有“內(nèi)部照片”的文件。這個(gè)文件通常能夠提供我們感興趣的信息,比如芯片型號等,這樣,我們就不用拆機(jī)了。

重要的是,我們建議大家下載CPU的數(shù)據(jù)表,并保存起來供后面使用:后面步驟中需要設(shè)置的參數(shù),都可以從中找到。

關(guān)于CPU的相關(guān)設(shè)置首先要做的是,把CDD拖到打開的IDA Pro窗口中,或者通過文件菜單打開它。IDA會檢測出這是一個(gè)二進(jìn)制文件。然后,將“Processor type”指定為 “ARM little-endian”,具體如下圖所示。

wKgaomVn9TqAS66SAABsZUG96zU804.png

現(xiàn)在,先別按“Ok”按鈕,因?yàn)檫€要對處理器選項(xiàng)進(jìn)行一些設(shè)置。我們知道,這種設(shè)備使用的處理器是基于ARMv7E-M架構(gòu)的。因此,我們必須對處理器選項(xiàng)做相應(yīng)的修改。最佳設(shè)置如下圖所示;為此,需要按下“Processor options”菜單中的“Edit ARM architecture Options”按鈕,這樣就可以找到中間的窗格了。

wKgaomVn9TuAcsO5AAKzuKC6O_A269.png

由于這個(gè)項(xiàng)目與Thumb指令集高度相關(guān),所以也建議在“ARM specific options”中勾選“No automatic ARM THUMB switching”選項(xiàng)。雖然這一點(diǎn)并沒有顯示在上面的截圖中,但對本項(xiàng)目來說的確是一個(gè)非常有用的設(shè)置。

加載映像現(xiàn)在,我們已經(jīng)完成了基本的CPU設(shè)置。接下來,我們需要將加載的固件映像重新定位到正確的偏移量處。這個(gè)固件映像將被加載到IDA數(shù)據(jù)庫的ROM部分。由于CPU不會從文件中的0x00處開始加載映像,所以,我們必須重新定位。如果跳過這一步,交叉引用將被破壞,反匯編文件將無法正常工作。我們的目標(biāo)設(shè)備中使用的ARM CPU將要求映像從偏移量0x8004000處開始。這里其實(shí)就是映射到物理ROM的內(nèi)存位置,所以,我們需要將文件映射到這個(gè)地址。

在單擊“Load new file”對話框中的Ok按鈕之后,將會出現(xiàn)如下所示的對話框。通常情況下,RAM的大小和ROM的大小并不需要調(diào)整。它們現(xiàn)在已經(jīng)正確地自動填充好了。

wKgaomVn9TuADb8rAAA8_LCw2hI762.png

接下來要做的事情,就是創(chuàng)建一個(gè)RAM分區(qū)。為此,可以勾選“Create RAM section”,分配的RAM將從0x20000000位置開始,長度為0x17FFF。

如何找到正確的內(nèi)存偏移量如果讀者是第一次接觸這方面的內(nèi)容,通常會有這樣的疑問:這些值是如何確定的?答案很簡單,我們可以從之前下載的數(shù)據(jù)手冊中找到它們。

從第17頁的內(nèi)存映射部分,我們可以找到主閃存(固件文件)的加載地址。而在第16頁中,我們可以找到SRAM偏移量和這段內(nèi)存的長度。

wKgaomVn9TuAf6wbAACSYjkg5G0430.png

很簡單吧?上面所做的只是將文件/映像重新定位到從我們的數(shù)據(jù)表中獲取的正確位置。關(guān)于主閃存有一個(gè)小技巧,第一個(gè)0x4000似乎是由引導(dǎo)程序獲取的,所以,我們的二進(jìn)制文件必須位于0x8004000處。

二進(jìn)制文件的結(jié)構(gòu)對于第一次使用IDA的讀者來說,感覺可能非常奇怪:它并沒有像其他軟件一樣進(jìn)行自動分析,也沒有展示程序代碼,相反,它只是給出了大量的十六進(jìn)制字符。難道是我們哪里做錯了嗎?很可能不是。如果您正在使用IDA Pro分析固件映像,這是非常正常的現(xiàn)象。這里的難點(diǎn)在于,我們必須自己從頭開始進(jìn)行分析。

wKgZomVn9TuABCT7AAMoC0T1-QA117.png

但這也沒有想象的那么難。首先,讓我們考察文件的開頭位置。這是ARM CPU開始執(zhí)行代碼的地方。在這個(gè)偏移量處,一個(gè)被稱為向量表的結(jié)構(gòu)被定位,它在ARM Cortex通用用戶指南中有很好的詳細(xì)描述。

wKgaomVn9TuAfPaKAAB2E3mYq2w884.png

正如我們在用戶指南的圖形中所看到的,偏移量0x0000(0x08004000)處包含初始堆棧指針。CPU將在這個(gè)地址加載接下來的四個(gè)字節(jié),并將其用作指向未來堆棧的指針。

復(fù)位處理程序接下來的字節(jié)是各種處理程序,最重要的是復(fù)位處理程序(reset handler)。它正是CPU要啟動或重新啟動時(shí)將會跳轉(zhuǎn)到的地方。

wKgZomVn9TuAf5jMAAAc8p4rBvA873.png

它又是一個(gè)4字節(jié)的地址,對于我們的映像來說,這個(gè)地址很容易解析。正如鏈接的ARM用戶指南文章所告訴我們的,如果地址的最低有效位為1,則處理程序?yàn)門humb。

在我們的例子中,該地址的最后一個(gè)字節(jié)是0xF9,二進(jìn)制形式為11111001B。我們可以看到,這里的最低有效位確實(shí)是1。因此,我們需要將復(fù)位處理程序的入口點(diǎn)改為Thumb。實(shí)際上,復(fù)位處理程序的實(shí)際偏移量也由于該位的值而移動了一個(gè)字節(jié)。

0xF9 = 11111001b (with Thumb indicator)

0xF8 = 11111000b (without)

單擊這個(gè)偏移量,就會跳轉(zhuǎn)到復(fù)位處理程序的地址減1個(gè)字節(jié)的地方?,F(xiàn)在,請按“Alt+G”,這時(shí)會打開一個(gè)對話框,我們需要將下面的部分定義為Thumb(CODE16)。

wKgZomVn9TqABPyIAAAWqTFaDgU504.png

這個(gè)項(xiàng)目主要涉及Thumb指令集,因此,您也可以從ROM段的第一個(gè)字節(jié)開始使用Thumb代碼。請記住,這一點(diǎn)并非適用于所有的ARM項(xiàng)目。但對于這個(gè)項(xiàng)目來說,這是沒問題的。

將當(dāng)前偏移量改為CODE16后,只需按“C”,就能在該偏移量處創(chuàng)建代碼了?,F(xiàn)在,我們就應(yīng)該可以看到復(fù)位處理程序的代碼了。

wKgZomVn9TqABC0uAAAVwLd4rm4605.png

查找其他代碼和字符串上面介紹的方法雖然能用,但是通過手動方式來創(chuàng)建所有的代碼是相對繁瑣的。別擔(dān)心,我們可以借助于腳本來完成這些任務(wù)。實(shí)際上,Maddie Stone已經(jīng)為IDA Pro創(chuàng)建了許多非常方便的腳本,能夠給我們帶來極大的便利。

由于她的腳本不能用于較新的IDA版本(在寫這篇文章時(shí),最新的版本為7.7),所以,我們專門把適用于IDA 7.x版本的腳本上傳到了Github上,讀者可以從https://github.com/alexander-pick/IDAPythonEmbeddedToolkit下載。為了支持基于ARM的項(xiàng)目,我已經(jīng)對這些代碼做了相應(yīng)的處理。

首先,我們可以使用腳本define_code_functions.py,在0x08004000到0x080963DC大致范圍內(nèi)創(chuàng)建代碼。如果腳本詢問是否要撤銷現(xiàn)有的代碼,請選擇No。

IDA Pro應(yīng)該可以正常工作了,此時(shí)的ROM部分應(yīng)該開始變得更有趣了。

wKgZomVn9TuAIWLoAAAC6lENaAg511.png

接下來,我們可以使用make_strings.py腳本,在ROM的其余部分創(chuàng)建字符串。這時(shí),你會在其中發(fā)現(xiàn)許多我們感興趣的字符串。

關(guān)于字符串引用分析這個(gè)固件時(shí),我們會發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象。由于ANYTONE的開發(fā)人員為多國語言創(chuàng)建了固件,所以,他們使用了引用表。因此,這可能導(dǎo)致我們會遺漏某些字符串的引用。之所以會發(fā)生這種情況,是因?yàn)檫@些字符串是根據(jù)選擇的語言來動態(tài)加載的。遺憾的是,基于IDA的靜態(tài)分析是無法解決這個(gè)問題的。

不過,引導(dǎo)過程中的一些字符串是直接嵌入的,所以它們解析起來問題不大。因此,我們可以從這些字符串開始下手。

wKgZomVn9TuAMFoyAABau0RWYtw939.png

為了做進(jìn)一步的分析,我們需要能夠識別一些基本的OS函數(shù),即操作嵌入字符串的函數(shù),比如“print”或“read”函數(shù)等。當(dāng)然,類似“memcpy”這樣的函數(shù)在各種操作系統(tǒng)中都是非常常見的。

非常值得注意的是“print_string”函數(shù)(一旦識別出來,我就把它重命名為這個(gè)名字)。它接受一些坐標(biāo)和一個(gè)字符串作為參數(shù),并將字符串顯示在屏幕上給定的位置處。這個(gè)函數(shù)在啟動菜單中被大量使用。

從固件鏡像中的字符串可以識別出設(shè)備使用的RTOS(實(shí)時(shí)操作系統(tǒng))是μC/OS-II。μC/OS-II是一個(gè)用ANSI C編寫的免費(fèi)實(shí)時(shí)操作系統(tǒng)。關(guān)于該系統(tǒng)的進(jìn)一步介紹,以及相關(guān)文檔,讀者可以在這里找到;而相關(guān)代碼則可以從這里下載。感興趣的讀者可以參考這些資料,它們應(yīng)該對您有很大的幫助。

I/O和外圍設(shè)備像這樣基于ARM的CPU通常使用特殊的內(nèi)存區(qū)域來處理地址總線、GPIO、I/O或簡單的定時(shí)器時(shí)鐘,具體請參閱數(shù)據(jù)表。實(shí)際上,在第14頁中,大家可以找到我們用來指定加載偏移量的內(nèi)存映射。該映射還包含要添加到數(shù)據(jù)庫中的特殊內(nèi)存區(qū)域。

打開IDA中的內(nèi)存區(qū)域視圖(segments view)并將它們添加到數(shù)據(jù)庫中,結(jié)果應(yīng)該與下圖類似。如果你想偷懶,則可以使用這個(gè)IDC(https://github.com/alexander-pick/useful-script-and-code/blob/master/GD32F303xx_segments.idc)來完成這個(gè)過程。

wKgZomVn9TuAeKUGAAEqeV2b0sA150.png

現(xiàn)在,請重新運(yùn)行自動分析(Options -> General -> Reanalyse program)以創(chuàng)建交叉引用。

一旦你完成了上面的步驟,就可以查看感興趣的內(nèi)存區(qū)域,看看是否有對它們的交叉引用。這些可以幫助您找到使用特定總線、GPIO或I/O的函數(shù)。

如果您查找操作UART的函數(shù),只需檢查UART區(qū)域,就會找到對它的引用。這在沒有或只有很少字符串作為引用的情況下是特別有用的。

小結(jié)我認(rèn)為,到目前為止,您應(yīng)該已經(jīng)具備了自己研究這一主題所需的一切。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9028

    瀏覽量

    366496
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10807

    瀏覽量

    210852
  • 二進(jìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    786

    瀏覽量

    41564
  • IDA
    IDA
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    7918

原文標(biāo)題:如何利用IDA Pro逆向分析ARM 二進(jìn)制映像

文章出處:【微信號:技術(shù)讓夢想更偉大,微信公眾號:技術(shù)讓夢想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何進(jìn)行Linux二進(jìn)制分析

    器和逆向工具并且依賴我們的黑客直覺來掌控我們正在逆向的目標(biāo)程序。我們必須理解二進(jìn)制格式、內(nèi)存布局和給定處理器指令集的復(fù)雜性。我們因此成為微處理器上的程序的主人。一個(gè)逆向工程師對
    發(fā)表于 07-18 06:25

    二進(jìn)制絕對調(diào)相(解調(diào))工作原理

    二進(jìn)制絕對調(diào)相工作原理:二進(jìn)制絕對調(diào)相(相絕對調(diào)相)利用載波不同  位的絕對值來傳遞數(shù)字信息。(2BPSK)
    發(fā)表于 10-21 13:00 ?5499次閱讀
    <b class='flag-5'>二進(jìn)制</b>絕對調(diào)相(解調(diào))工作原理

    二進(jìn)制相對調(diào)相(二進(jìn)制差分調(diào)相2DPSK)的工作原理

    二進(jìn)制相對調(diào)相(二進(jìn)制差分調(diào)相2DPSK)的工作原理
    發(fā)表于 10-21 13:01 ?3181次閱讀
    <b class='flag-5'>二進(jìn)制</b>相對調(diào)相(<b class='flag-5'>二進(jìn)制</b>差分調(diào)相2DPSK)的工作原理

    二進(jìn)制

    二進(jìn)制   二進(jìn)制與十進(jìn)制的區(qū)別在于數(shù)碼的個(gè)數(shù)和進(jìn)位規(guī)律有很大的區(qū)別,顧名思義,二進(jìn)制的計(jì)數(shù)規(guī)律為逢二進(jìn)一,是以2為基數(shù)的計(jì)數(shù)體制。10這
    發(fā)表于 04-06 23:48 ?8155次閱讀
    <b class='flag-5'>二進(jìn)制</b>

    二進(jìn)制時(shí)鐘電路

    二進(jìn)制時(shí)鐘電路
    發(fā)表于 09-11 11:22 ?3098次閱讀
    <b class='flag-5'>二進(jìn)制</b>時(shí)鐘電路

    同步二進(jìn)制計(jì)數(shù)器

    同步二進(jìn)制計(jì)數(shù)器 1.   同步與異步二進(jìn)制加法計(jì)數(shù)器比較態(tài)序表和工作波形一樣電路結(jié)構(gòu)不同:  異步二進(jìn)制加法
    發(fā)表于 09-30 18:37 ?1.2w次閱讀
    同步<b class='flag-5'>二進(jìn)制</b>計(jì)數(shù)器

    二進(jìn)制編碼和二進(jìn)制數(shù)據(jù)

    二進(jìn)制編碼和二進(jìn)制數(shù)據(jù)   二進(jìn)制編碼是計(jì)算機(jī)內(nèi)使用最多的碼制,它只使用兩個(gè)基本符號"0"和"1",并且通過由這兩個(gè)符號組成的
    發(fā)表于 10-13 16:22 ?4750次閱讀

    二進(jìn)制數(shù)的運(yùn)算規(guī)則

    二進(jìn)制數(shù)的運(yùn)算規(guī)則  二進(jìn)制數(shù)之間可以執(zhí)行算術(shù)運(yùn)算和邏輯運(yùn)算,其規(guī)則簡單,容易實(shí)現(xiàn)?! 。?) 加法運(yùn)算規(guī)則    0 + 0 = 0         例如:
    發(fā)表于 10-13 16:24 ?2.3w次閱讀

    什么是二進(jìn)制計(jì)數(shù)器,二進(jìn)制計(jì)數(shù)器原理是什么?

    什么是二進(jìn)制計(jì)數(shù)器,二進(jìn)制計(jì)數(shù)器原理是什么? 計(jì)數(shù)器是數(shù)字系統(tǒng)中用得較多的基本邏輯器件。它不僅能記錄輸入時(shí)鐘脈沖的個(gè)數(shù),還可以實(shí)現(xiàn)
    發(fā)表于 03-08 13:16 ?3.1w次閱讀

    二進(jìn)制電平,什么是二進(jìn)制電平

    二進(jìn)制電平,什么是二進(jìn)制電平 在二進(jìn)制數(shù)字通信系統(tǒng)中,每個(gè)碼元或每個(gè)符號只能是“1”和“0”兩個(gè)狀態(tài)之一。若將每個(gè)碼元可能取的狀態(tài)增
    發(fā)表于 03-17 16:51 ?2341次閱讀

    二進(jìn)制移頻鍵控原理圖分析

    二進(jìn)制移頻鍵控原理圖分析 1.2FSK信號的產(chǎn)生原理框圖
    發(fā)表于 03-19 16:48 ?2345次閱讀

    二進(jìn)制加法程序【匯編版】

    二進(jìn)制加法程序【匯編版】二進(jìn)制加法程序【匯編版】二進(jìn)制加法程序【匯編版】二進(jìn)制加法程序【匯編版】
    發(fā)表于 12-29 11:02 ?0次下載

    二進(jìn)制加法程序【C語言版】

    二進(jìn)制加法程序【C語言版】二進(jìn)制加法程序【C語言版】二進(jìn)制加法程序【C語言版】二進(jìn)制加法程序【C語言版】
    發(fā)表于 12-29 11:03 ?0次下載

    二進(jìn)制SCA指紋提取黑科技: go語言逆向技術(shù)

    二進(jìn)制SCA指紋提取黑科技: go語言逆向技術(shù) 華為云DevCloud軟件開發(fā)平臺在2022華為伙伴暨開發(fā)者大會重磅推出了4大新能力,其中的二進(jìn)制成分分析安全檢測能力,能夠?qū)崿F(xiàn)對開源軟件漏洞的全面
    的頭像 發(fā)表于 10-13 22:20 ?651次閱讀
    <b class='flag-5'>二進(jìn)制</b>SCA指紋提取黑科技: go語言<b class='flag-5'>逆向</b>技術(shù)

    二進(jìn)制編碼器工作原理 如何選擇二進(jìn)制編碼器

    二進(jìn)制編碼器是一種數(shù)字電路,它將輸入的二進(jìn)制代碼轉(zhuǎn)換為對應(yīng)的輸出信號。在數(shù)字系統(tǒng)中,編碼器用于將數(shù)據(jù)從一種形式轉(zhuǎn)換為另一種形式,以便于處理和傳輸。 二進(jìn)制編碼器工作原理 輸入與輸出關(guān)系 :
    的頭像 發(fā)表于 11-06 09:44 ?159次閱讀