您好,登錄后才能下訂單哦!
本篇內容介紹了“什么是Binbloom”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Binbloom是一款針對二進制源碼的固件分析軟件,該工具旨在幫助廣大研究人員分析固件的二進制源碼,并自動化判斷目標固件中的某些功能特性。該工具兼容所有常見的系統架構,因為該工具只會對目標固件進行簡單的特性統計。
為了計算出加載地址,在使用Binbloom之前,我們還需要一些外部逆向工程分析工具來幫助我們提取目標固件中的潛在函數列表。
加載地址:Binbloom可以解析原始二進制固件并確定其加載地址。
字節順序:Binbloom可以使用一些啟發式算法來確定目標固件的字節順序。
UDS數據庫:Binbloom可以解析原始二進制固件,并檢查它是否存在有包含UDS命令id的數組。
首先,廣大研究人員需要使用下列命令將該項目源碼克隆至本地:
git clone https://github.com/quarkslab/binbloom.git cd binbloom
接下來,使用下列命令構建最新版本的Binbloom:
mkdir build cd build cmake .. make
最后,使用下列命令安裝最新版本的Binbloom(僅支持Linux系統):
make install
binbloom -f firmware.bin -e
運行上述命令后,Binbloom將返回下列的輸出數據:
Loaded firmware.bin, size:624128, bit:fff00000, 000fffff, nb_segments:4096, shift:20 End address:00098600 Determining the endianness Computing heuristics in big endian order: Base: 00000000: unique pointers:1839, number of array elements:217900 Base: 01000000: unique pointers:1343, number of array elements:13085 Base: 02000000: unique pointers:621, number of array elements:5735 Base: 03000000: unique pointers:566, number of array elements:3823 Base: 05000000: unique pointers:575, number of array elements:6139 Base: 80000000: unique pointers:642, number of array elements:528 247210 Computing score in little endian order: Base: 00000000: unique pointers:8309, number of array elements:515404 515404 This firmware seems to be LITTLE ENDIAN
在上述輸出數據中,最后一行才是最重要的一行,因為它給出的是最終的分析結果。其他幾行代表的是Binbloom在目標固件中,無論是在大端模式下還是小端模式下能夠找到的唯一指針的數量和數組元素的數量,而這些信息可以用來幫助確定工具在確定字節順序時所要使用的啟發式方法。
首先,我們需要提供一個包含了潛在函數地址列表的文件,文件內數據格式為十六進制,每個數據占一行,數據形式如下所示:
00000010 00000054 000005f0 00000a50 00000a54 00000ac0 00000b40 00000b6c 00000b74 00000bc0
這個文件需要以固件文件的文件名來進行名命,后跟“.fun”作為文件的后綴名。
這個文件可以利用tag_code.py這個Python腳本所提供的tag_code()函數來生成,使用IDA Pro的生成步驟如下:
在IDA Pro中加載固件文件,選擇地址0;
從IDA Pro的文件菜單中,選擇腳本文件,并選擇py;
在IDA Pro窗口底部的命令行終端中,使用tag_code(),此時將會自動生成函數文件;
如果你想使用其他工具來生成函數文件的話,只要你是以地址0加載固件文件話就都可以。比如說,函數文件中的十六進制值對應的就是固件中的偏移量。
接下來,我們就可以讓Binbloom通過計算潛在函數和固件中的函數指針數組之間的相關分數來計算潛在加載地址(列表):
binbloom -f firmware.bin -b
上述命令執行后,Binbloom將會給我們返回如下所示的輸出結果:
Loaded firmware.bin, size:2668912, bit:ffc00000, 003fffff, nb_segments:1024, shift:22 End address:0028b970 loaded 14903 functions Highest score for base address: 1545, for base address 80010000 For information, here are the best scores: For base address 80010000, found 1545 functions Saving function pointers for this base address... Done.
在上述輸出文件中,我們可以看到目標固件提供了14903個潛在函數,當程序假設加載的基地址為0x8001000時,工具總共在函數指針數組中找到了1545個符合條件的對象。
如果目標固件源碼中存在不同的區域,那么Binbloom將把固件中的不同區域以及對應的加載地址全部顯示出來:
Highest score for base address: 93, for base address 00000000 For information, here are the best scores: For base address 00000000, found 93 functions For base address 00040000, found 93 functions
此時,我們已經獲取到了地址0x00000000以及0x00040000處的代碼段了。
Binbloom將生成兩份輸出文件:
firmware.fad:該文件中包含了已識別函數的地址;
firmware.fpt:該文件中包含了已識別函數指針的地址;
現在,我們可以再次打開IDA Pro(或其他逆向工程分析軟件),以指定的地址加載固件,然后將1545個已識別函數的地址導入進去:
在IDA Pro中以指定地址加載固件;
在文件菜單中,選擇腳本文件,然后選擇py;
選擇.fad文件;
選擇.fpt文件;
Binbloom可以嘗試搜索任何包含了UDS/KWP2000 ID的數組,這里可以使用-u選項實現:
binbloom -f firmware.bin -u
上述命令將返回下列輸出內容:
Loaded firmware.bin, size:1540096, bit:ffe00000, 001fffff, nb_segments:2048, shift:21 End address:00178000 UDS DB position: 1234 with a score of 12 and a stride of 12: 10 00 31 00 26 27 00 80 00 00 00 00 11 00 31 00 24 3d 01 80 00 00 00 00 22 00 10 00 2c 42 01 80 00 00 00 00 27 00 10 00 1c 41 01 80 60 a8 01 80 28 00 31 00 36 7f 01 80 00 00 00 00 2e 00 10 00 18 88 01 80 08 ae 01 80 31 00 30 00 10 41 01 80 00 00 00 00 34 00 10 00 46 4e 01 80 00 00 00 00 36 00 10 00 2a 2d 01 80 00 00 00 00 37 00 10 00 32 3c 00 80 00 00 00 00 3e 00 31 00 54 5b 01 80 00 b2 01 80 85 00 31 00 6a 2f 01 80 00 00 00 00
“什么是Binbloom”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。