binwalk是路由器韌體分析的必備工具,該工具最大的優點就是可以自動完成指定檔案的掃瞄,智慧型發掘潛藏在檔案中所有可疑的檔案型別及檔案系統。
1、binwalk和libmagic
binwalk的掃瞄實現方法,就是把重複而複雜的手工分析方法通過程式實現。但是binwalk並不是簡單地使用file命令識別檔案型別,原因在於file命令占用了太多的磁碟來讀寫i/o,效率太低,而且file命令識別檔案型別是從檔案的第乙個位元組開始,且只能把磁碟上的乙個檔案識別成一種檔案格式,所以會占用很多磁碟空間來儲存檔案,此外,使用file命令,就需要逐字節把路由器檔案分割成多個檔案,檔案的i/o也必然會極大影響掃瞄效率。
libmagic動態庫為檔案掃瞄提供了更好的解決方案。識別libmagic庫函式,可以直接掃瞄檔案的記憶體映象,從而提高掃瞄效率。libmagic庫識別檔案系統和檔案型別依然依賴magic簽名檔案。
在binwalk中,主要使用來自libmagic庫的4個函式,分別為magic_open、magic_close、magic_buffer、magic_load。
magic_t magic_open(int flags); -----> 建立並返回乙個magic_cookie指標。
void magic_close(magic_t cookie); -----> 關閉magic簽名資料庫並釋放所有使用過的資源。
const char *magic_buffer(magic_t cookie, const void *buffer, size_t len); -------> 讀取buffer中指定長度的資料並與magic簽名資料庫進行對比,返回對比結果描述。
int magic_load(magic_t cookie, const char *filename); ---------> 從filename指定檔案載入magic簽名資料庫,binwalk把多個magic簽名檔案組合到乙個臨時檔案中用於載入。
binwalk是使用python編寫的,它通過python呼叫libmagic庫中的匯出函式並使用物件導向的方式進行封裝,封裝檔案在binwalk/src/binwalk/core/magic.py中。magic類包含兩個成員函式:
magic.buffer(data)函式,讀取記憶體緩衝區資料,判斷是否符合某一檔案型別。
magic.close()函式:關閉magic簽名資料庫,釋放所有使用的資源。
2、binwalk的提取與分析
2.1、韌體掃瞄
命令:binwalk firmware.bin -----> 通過掃瞄能夠智慧型地發現目標檔案中包含的所有可識別的檔案型別。
2.2、提取檔案
命令:binwalk -e firmware.bin ------> 選項「-e"和「--extract"用於按照定義的配置檔案中的提取方法從韌體中提取探測到的檔案系統。
命令:binwalk -me firmware.bin -----> 選項「-m"和「--matryoshka"用於根據magic簽名掃瞄結果進行遞迴提取,僅對"-e"和「--dd"選項有效。
命令:binwalk -me -d 5 firmware.bin ----> 選項「-d"和「--depth="用於限制遞迴提取深度,預設深度為8,僅當「-m"選項存在時有效。
2.3、顯示完整的掃瞄結果
命令:binwalk -i firmware.bin ------> 選項"-i"和「--invalid"用於顯示掃瞄的所有結果(即使是掃瞄過程中被定義為「invalid「的項)。
當我們認為binwalk錯把有效的檔案當成無效檔案時,可以通過該選項來檢查。
2.4、指令系統分析
選項「a"和「--opcodes"用於掃瞄指定檔案中通用cpu架構的可執行**。
由於某些操作碼簽名比較短,所以比較容易造成誤判。如果我們需要確定乙個可執行檔案的cpu架構,可以使用該命令。
命令:命令:binwalk -a 70|more
使用binwalk掃瞄從firmware.bin中提取的檔案的檔案「70」中的可執行**,在該檔案中可以發現cpu的架構(大端或者小端也會給出)。
檔案系統 why檔案系統
為什麼需要檔案系統,可否由作業系統直接寫裸裝置?裸裝置是一種沒有經過格式化的磁碟或分割槽,即讓作業系統直接管理操作磁碟設定,進行資料讀寫等。通過檔案系統的方式組織磁碟儲存和資料管理有很多好處,比如 1.資料讀取 管理等操作變得簡單便捷 檔案系統給使用者提供了乙個簡單的操作介面,只需簡單的操作就能實現...
檔案系統 檔案系統的架構
vfs是具體檔案系統的抽象,依靠超級塊 inode dentry以及檔案這些結構來發揮作用,檔案系統的架構就體現在這些結構的使用方式中。1 超級塊作用分析 1 2 所有的dentry都指向乙個dentry hashtable dentry hashtable是乙個樹組,每乙個樹組成員都是hash鍊錶...
檔案系統 編寫檔案系統
8.5 編寫乙個檔案系統 如果寫乙個實際檔案系統,但是涉及的東西太多,不容易簡明扼要的理解檔案系統的實現。linux核心中提供的romfs檔案系統是個非常理想的例子,既有實際應用架構,也清晰明了,故以romfs為例項分析檔案系統的實現。一 linux檔案系統的實現要素 編寫新檔案系統涉及一些基本物件...