BinWalk安裝和命令參數詳解
- 2019 年 10 月 8 日
- 筆記
前言
本周一 安恆萌新粉絲群:928102972
分享的工具為 binwalk
。 Binwalk
是一款快速、易用,用於分析,逆向工程和提取韌體映像的工具。簡單易用,完全自動化腳本,並通過自定義簽名,提取規則和插件模組,還重要一點的是可以輕鬆地擴展。 在CTF的MISC類題型和IOT安全的韌體解包分析中廣泛應用,可以大大提高效率。該工具對linux支援較好,對於windows功能支援較差,有條件的童鞋可以在linux上使用練習該神器。
BinWalk安裝部署
binwalk
github項目:https://github.com/ReFirmLabs/binwalk binwalk
的wiki:https://github.com/devttys0/binwalk/wiki binwalk
是一款 python
編寫的工具,目前 python2.x
和 python3.x
都較好的支援,不過在 Python3.x
中運行速度更快。在 kali
裡面已經預裝了,在其他發行版 linux
中安裝也很簡單,不過在 windows
上會稍微繁瑣一些。 windows
下的安裝和使用方法可以參考 pcat
大表哥的方法https://www.cnblogs.com/pcat/p/5256288.html。 wiki
上對於安裝使用已經說的非常詳細了。建議英文好的童鞋可以直接看官方的資料。網上資料也很多,這裡就簡單的翻譯總結一下。 這裡使用 kali linux
演示(基於Debian的linux發行版開發的一個滲透數字取證的系統) 注意: 如果原來系統已經安裝了舊版 binwalk
,這裡建議先卸載再安裝新版本,以防止出現不兼容和API衝突等問題。
$ sudo su //如果不是root帳號建議先獲取root許可權,防止出現許可權不足的問題 $ binwalk //直接運行查看已經安裝binwalk的版本(最新版是v2.1.1,kali 2018里預載的是最新版,如果是1.0運行下面命令,否則可以直接跳過)和各參數的介紹 $ sudo apt-get remove binwalk //卸載binwalk $ sudo apt-get update //更新軟體列表 $ git clone https://github.com/ReFirmLabs/binwalk //獲取binwalk源碼 $ cd binwalk //進入binwalk文件夾 $ sudo python setup.py install //Binwalk遵循標準的Python安裝過程 $ sudo apt-get install python-lzma //如果運行的是Python 2.x,強烈建議安裝可選的Python lzma模組(但不是必需的),python3中已經包含
如果執行命令的中途出現了 無法獲得鎖/var/lib/dpkg/lock-open(11:資源暫時不可用)ubuntu安裝vim及遇到的錯誤處理
,執行下面命令:
sudo rm /var/cache/apt/archives/lock //如果是root帳號可以去掉sudo sudo rm /var/lib/dpkg/lock
binwalk
還需要安裝一些依賴項,具體的大家可以去 Wilk
上查看,如果是 Debian/Ubuntu
源程式碼里已經給了一鍵自動安裝依賴項的腳本,運行命令:
$ sudo ./deps.sh //切換到binwalk目錄下
安裝IDA插件
binwalk
還可以安裝 binwalk IDA
插件,這個功能對於做韌體逆向的功能是非常方便的。安裝:
$ python setup.py idainstall --idadir = / home / user / ida
卸載:
$ python setup.py idauninstall --idadir = / home / user / ida
參數介紹使用
顯示binwalk幫助輸出(`-h, –help)
$ binwalk --help
掃描韌體
binwalk
的主要功能 – 也是迄今為止最受歡迎的功能。 Binwalk
可以掃描許多不同嵌入式文件類型和文件系統的韌體映像,只需給它一個要掃描的文件列表:
$ binwalk firmware.bin DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2" 112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 3797616 bytes 1310832 0x140070 PackImg section delimiter tag, little endian size: 13644032 bytes; big endian size: 3264512 bytes 1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 3264162 bytes, 1866 inodes, blocksize: 65536 bytes, created: Tue Apr 3 04:12:22 2012
文件提取( -e,--extract
)
這個功能也是一個常用的功能,在CTF中很多文件分解的 misc題
都可以使用 binwalk
提高效率相對於使用 winhex
這類工具。 可以使用 -e
選項提取它在韌體映像中找到的任何文件。
$ binwalk -e firmware.bin
簽名分析( -B,--signature
)
對目標文件執行簽名分析,如果未指定其他分析選項,則這是默認值。 如果希望將簽名分析與其他分析器(例如 – 熵)結合使用,請使用此選項:
$ binwalk --signature firmware.bin DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2" 112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 3797616 bytes 1310832 0x140070 PackImg section delimiter tag, little endian size: 13644032 bytes; big endian size: 3264512 bytes 1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 3264162 bytes, 1866 inodes, blocksize: 65536 bytes, created: Tue Apr 3 04:12:22 2012
熵分析( -E,--entropy
)
對輸入文件執行熵分析,列印原始熵數據並生成熵圖。 熵分析可以與–signature,– raw或–opcodes結合使用,以便更好地理解目標文件。 用於識別簽名掃描可能遺漏的有趣數據部分:
$ binwalk -E firmware.bin DECIMAL HEXADECIMAL ENTROPY -------------------------------------------------------------------------------- 0 0x0 Rising entropy edge (0.983751) 1155072 0x11A000 Falling entropy edge (0.000000) 1181696 0x120800 Rising entropy edge (0.990546) 3780608 0x39B000 Falling entropy edge (0.000000)
與–verbose選項結合使用時,將列印為每個數據塊計算的原始熵:
$ binwalk -E --verbose firmware.bin DECIMAL HEX ENTROPY ANALYSIS -------------------------------------------------------------------------------- 0 0x0 0.964914 1024 0x400 0.978591 2048 0x800 0.973048 3072 0xC00 0.976195 4096 0x1000 0.976072 5120 0x1400 0.976734 6144 0x1800 0.976861 7168 0x1C00 0.972385 8192 0x2000 0.972518 ...
注意: 如果是使用 python API
調用熵分析,需要禁用圖形(–nplot)以防止腳本過早退出。
保存熵圖為PNG文件並不顯示( -J,--save
)
$ binwalk --save -E firmware.bin
搜索字元串( -R,--raw=<string>
)
搜索字元串包括轉義的八進位和/或十六進位值。 需要搜索自定義的原始位元組序列時,可以使用此選項:
$ binwalk -R "x00x01x02x03x04" firmware.bin DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 377654 0x5C336 Raw string signature
搜索各種CPU架構常見的可執行操作碼( -A,--opcodes
)
binwalk
可以在指定文件中搜索各種CPU架構常見的可執行操作碼。註: 某些操作碼簽名很短,因此容易產生誤報結果。 當需要在文件中找到可執行程式碼時,如果需要確定可執行文件的體系結構時,可以使用此選項:
$ binwalk -A firmware.bin DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 268 0x10C MIPS instructions, function prologue 412 0x19C MIPS instructions, function prologue 636 0x27C MIPS instructions, function prologue 812 0x32C MIPS instructions, function epilogue 920 0x398 MIPS instructions, function epilogue 948 0x3B4 MIPS instructions, function prologue 1056 0x420 MIPS instructions, function epilogue 1080 0x438 MIPS instructions, function prologue 1356 0x54C MIPS instructions, function epilogue 1392 0x570 MIPS instructions, function prologue 1836 0x72C MIPS instructions, function epilogue 2012 0x7DC MIPS instructions, function prologue 2260 0x8D4 MIPS instructions, function epilogue 2512 0x9D0 MIPS instructions, function prologue 2552 0x9F8 MIPS instructions, function epilogue
搜索簽名的自定義魔術簽名文件( -m,--magic=<file>
)
載入備用魔術簽名文件而不是默認文件。
$ binwalk -m ./foobar.mgc firmware.bin DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 268 0x10C Foobar 412 0x19C Foobar 636 0x27C Foobar
禁用「智慧」簽名匹配( -b,--dumb
)
智慧簽名匹配可能導致錯過其他有效簽名時(例如,通過jump-to-offset關鍵字),可以使用:
$ binwalk -b firmware.bin
顯示所有包括誤標記為無效結果( -I,--invalid
)
binwalk將有效結果誤標記為無效結果,併產生大量垃圾輸出,可以使用:
$ binwalk -I firmware.bin
簽名排除過濾器( -x,--exclude=<filter>
)
不過濾被過濾器匹配的簽名,過濾器是小寫的正則表達式; 可以指定多個過濾器。第一行與指定過濾器匹配的魔術簽名根本不會被載入; 因此,使用此過濾器可以幫助減少簽名掃描時間。用於排除不需要或不感興趣的結果:
$ binwalk -x 'mach-o' -x '^hp' firmware.bin # exclude HP calculator and OSX mach-o signatures
簽名過濾器( -y,--include=<filter>
)
過濾被過濾器匹配的簽名,過濾器是小寫的正則表達式; 可以指定多個過濾器。只會載入第一行與指定過濾器匹配的魔術簽名; 因此,使用此過濾器可以幫助減少簽名掃描時間。僅搜索特定簽名或簽名類型時很有用:
$ binwalk -y 'filesystem' firmware.bin # only search for filesystem signatures
識別反彙編程式碼的CPU體系結構( -Y,--disasm
)
使用 capstone
反彙編程式識別文件中包含的可執行程式碼的CPU體系結構。 使用此掃描指定 --verbose
將另外列印反彙編的指令。 通常比 --opcodes
執行的簡單簽名分析更健壯,但支援更少的體系結構:
$ binwalk --disasm firmware.bin DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 428 0x1AC MIPS executable code, 32/64-bit, little endian, at least 750 valid instructions
設置反彙編結果的最小連續指令數( -T,--minsn
)
將–disasm結果的最小連續指令數設置為有效。默認值為500條指令:
$ binwalk --minsn=1200 -Y firmware.bin DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 428 0x1AC MIPS executable code, 32/64-bit, little endian, at least 1250 valid instructions
反彙編結果連續執行( -k,--continue
)
指示 – disasm不會停在第一個結果:
$ binwalk --continue -Y firmware.bin DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 428 0x1AC MIPS executable code, 32/64-bit, little endian, at least 1250 valid instructions 1048576 0x100000 MIPS executable code, 32/64-bit, little endian, at least 1250 valid instructions ...
忽略–entropy生成的熵圖中的圖例( -Q,--nngend
)
$ binwalk --entropy -Q firmware.bin
禁止對圖形熵地塊–entropy掃描( -N,--nplot
)
$ binwalk --entropy -N firmware.bin
設置上升沿熵觸發電平( -H,--high=<float>
)
僅在與–entropy一起使用時有效。指定的值應介於0和1之間:
$ binwalk --entropy -H .9 firmware.bin
設置下降沿熵觸發電平( -L,--low=<float>
)
僅在與–entropy一起使用時有效。指定的值應介於0和1之間:
$ binwalk --entropy -L .3 firmware.bin
十六進位位元組彩色輸出( -W,--hexdump
)
綠色 – 所有文件中的這些位元組都相同 紅色 – 這些位元組在所有文件中都不同 藍色 – 這些位元組在某些文件中只有不同 可以任意數量的任意文件; 其他有用的選項是–block, – offset, – length和–terse:
$ binwalk -W --block = 8 --length = 64 firmware1.bin firmware2.bin firmware3.bin
注意: 如果您需要頁面輸出安裝most實用程式,因為它更好地支援彩色輸出的分頁。 僅在–hexdump期間顯示包含 綠色
位元組的行:
$ binwalk -W --green firmware1.bin firmware2.bin firmware3.bin
僅在–hexdump期間顯示包含 紅色
位元組的行:
$ binwalk -W --red firmware1.bin firmware2.bin firmware3.bin
僅在–hexdump期間顯示包含 藍色
位元組的行:
$ binwalk -W --blue firmware1.bin firmware2.bin firmware3.bin
提取簽名掃描期間識別的文件( -D,--dd=<type[:ext[:cmd]]>
)
提取 – 簽名掃描期間識別的文件。可以指定多個–dd選項。 type是簽名描述中包含的小寫字元串(支援正則表達式) ext是保存數據磁碟時使用的文件擴展名(默認為none) cmd是在將數據保存到磁碟後執行的可選命令 默認情況下,文件名是找到簽名的十六進位偏移量,除非在簽名本身中指定了備用文件名。 以下示例演示如何使用–dd選項指定提取規則,該選項將提取包含文件擴展名為「zip」的字元串「zip archive」的任何簽名,然後執行「unzip」命令。此外,PNG影像按原樣提取,帶有'png'文件擴展名。 請注意使用'%e'佔位符。執行unzip命令時,此佔位符將替換為解壓縮文件的相對路徑:
$ binwalk -D 'zip archive:zip:unzip %e' -D 'png image:png' firmware.bin
簽名掃描期間遞歸掃描提取的文件( -M,--matryoshka
)
只有有效使用時–extract或–dd。
$ binwalk -e -M firmware.bin
設置提取數據的輸出目錄( -C,--directory=<str>
)
默認值:當前工作目錄 僅適用與使用時–extract或–dd選項:
$ binwalk -e --directory = / tmp firmware.bin
限制–matryoshka遞歸深度( -d,--depth=<int>
)
限制–matryoshka遞歸深度。默認情況下,深度設置為8。 僅在與–matryoshka選項一起使用時才適用:
$ binwalk -Me -d 5 firmware.bin
限制從目標文件中分割出的數據大小( -j,--size=<int>
)
默認情況下,沒有大小限制。 只有有效使用時–extract或–dd。 請注意,此選項不限制外部提取實用程式提取/解壓縮的數據大小。 從具有有限磁碟空間的大型文件中雕刻或提取數據時非常有用:
$ binwalk -e --size=0x100000 firmware.bin
清除無法處理的零文件和文件( -r,--rm
)
只有有效使用時–extract或–dd。 用於清除在提取期間從目標文件複製的誤報文件:
$ binwalk -e -r firmware.bin
刻錄數據但不自動提取/解壓縮該數據( -z,--carve
)
只有有效使用時–extract或–dd。
$ binwalk -e --carve firmware.bin
暴力識別原始deflate壓縮數據流( -X,--deflate
)
用於從具有損壞/修改/缺少標頭的文件中恢複數據。可以與–lzma結合使用。 此掃描可能很慢,因此使用–offset和/或–length限制掃描區域非常有用:
$ binwalk --deflate -o 0x100 -l 10000 firmware.bin
暴力識別原始LZMA壓縮數據流( -Z,--lzma
)
用於從具有損壞/修改/缺少標頭的文件中恢複數據。可以與–deflate結合使用。 由於LZMA壓縮選項的數量不同,此掃描可能非常慢,因此使用–offset和/或–length限制掃描區域非常有用:
$ binwalk --lzma -o 0x100 -l 10000 firmware.bin
常見壓縮選項搜索壓縮流( -P,--partial
)
可以顯著提高–lzma掃描的速度:
$ binwalk --partial -Z -o 0x100 -l 10000 firmware.bin
在掃描到第一個結果停止( -S,--stop
)
與–lzma和/或–deflate選項一起使用時,這將在顯示第一個結果後停止掃描:
$ binwalk --stop -Z firmware.bin
設置目標文件中要分析的位元組數( -l,--length=<int>
)
$ binwalk --length=0x100 firmware.bin
設置起始偏移量( -o,--offset=<int>
)
設置開始分析目標文件的起始偏移量。還可以指定負偏移(距文件結束的距離):
$ binwalk --offset=0x100 firmware.bin
設置所有列印偏移的基址( -O,--base=<int>
)
此值將添加到所有列印結果的原始文件偏移量中:
$ binwalk --base=0x80001000 firmware.bin
設置分析期間使用的塊大小( -K,--block=<int>
)
設置分析期間使用的塊大小(以位元組為單位)。 與 – 熵一起使用時,這決定了在熵分析期間分析的每個塊的大小。 與–hexdump一起使用時,它設置十六進位輸出中每行顯示的位元組數。
$ binwalk --diff -K 8 firmware1.bin firmware2.bin
掃描之前反轉n個位元組( -g,--swap=<int>
)
$ binwalk --swap=2 firmware.bin
掃描結果記錄到指定的文件( -f,--log=<file>
)
除非指定了–csv,否則保存到日誌文件的數據將與終端中顯示的數據相同。 即使指定了–quiet,數據也將保存到日誌文件中:
$ binwalk --log=binwalk.log firmware.bin
日誌數據以CSV格式保存( -c,--csv
)
如果與–cast或–hexdump一起使用,則忽略此選項。 僅在與–log選項結合使用時才有效:
$ binwalk --log=binwalk.log --csv firmware.bin
格式輸出適應終端窗口寬度( -t,--term
)
使輸出更具可讀性:
$ binwalk --term firmware.bin DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------- 0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2" 112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 3805904 bytes 1310832 0x140070 PackImg section delimiter tag, little endian size: 15741184 bytes; big endian size: 3272704 bytes 1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 3268870 bytes, 1860 inodes, blocksize: 65536 bytes, created: Mon Apr 22 04:56:42 2013
禁用輸出到stdout( -q,--quiet
)
與–log或verbose掃描一起使用時最方便,例如–entropy:
$ binwalk --quiet -f binwalk.log firmware.bin
啟用詳細輸出,包括目標文件MD5和掃描時間戳( -v,--verbose
)
如果指定了兩次,如果還指定了–extract,則將顯示外部提取實用程式的輸出:
$ binwalk --verbose firmware.bin Scan Time: 2013-11-10 21:04:04 Signatures: 265 Target File: firmware.bin MD5 Checksum: 6b91cdff1b4f0134b24b7041e079dd3e DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 0 0x0 DLOB firmware header, boot partition: "dev=/dev/mtdblock/2" 112 0x70 LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 3805904 bytes 1310832 0x140070 PackImg section delimiter tag, little endian size: 15741184 bytes; big endian size: 3272704 bytes 1310864 0x140090 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 3268870 bytes, 1860 inodes, blocksize: 65536 bytes, created: Mon Apr 22 04:56:42 2013
掃描名稱與給定正則表達式字元串匹配的文件( -a,--finclude=<str>
)
當與組合–matryoshka和–extract
$ binwalk -M -e --finclude='.bin$' firmware.bin
不要掃描名稱與給定正則表達式字元串匹配的文件( -p,--fexclude=<str>
)
當與組合–matryoshka和–extract
$ binwalk -M -e --fexclude='.pdf$' firmware_archive.zip
指定的埠號上啟用狀態伺服器( -s,--status=<int>
)
狀態伺服器僅偵聽localhost並列印出與當前掃描狀態相關的人類可讀ASCII數據。您可以使用telnet,netcat等連接到它。
$ binwalk --status=8080 firmware_archive.zip
總結
binwalk還有很多功能,比如python API,和IDA配合使用,以及實際應用會遇到很多小技巧,能大大提高取證,逆向韌體和CTF misc的效率。當然也存在特別多的問題,也歡迎童鞋們去使用解決這些問題提交 issue
。