BinWalk安裝和命令參數詳解

  • 2019 年 10 月 8 日
  • 筆記

前言

本周一 安恆萌新粉絲群:928102972分享的工具為 binwalkBinwalk是一款快速、易用,用於分析,逆向工程和提取韌體映像的工具。簡單易用,完全自動化腳本,並通過自定義簽名,提取規則和插件模組,還重要一點的是可以輕鬆地擴展。 在CTF的MISC類題型和IOT安全的韌體解包分析中廣泛應用,可以大大提高效率。該工具對linux支援較好,對於windows功能支援較差,有條件的童鞋可以在linux上使用練習該神器。

BinWalk安裝部署

binwalkgithub項目:https://github.com/ReFirmLabs/binwalk binwalk的wiki:https://github.com/devttys0/binwalk/wiki binwalk是一款 python編寫的工具,目前 python2.xpython3.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