strings 從二進位提取文字 文章首圖

strings 從二進位提取文字

strings 從二進位提取文字:逆向工程與除錯的利器

在 Linux 系統管理與開發的日常中,我們經常需要處理 ELF 執行檔、共享庫(Shared Libraries)或是各種二進位檔案。當我們面對一個陌生的二進位檔案,想要快速了解其中包含的資訊(例如:版本號、錯誤訊息、字串常數或路徑設定),直接使用 catless 只會看到一堆亂碼。這時,strings 指令就成為了我們最強大的偵察兵。

strings 是 binutils 套件的一部分,它的主要功能是掃描二進位檔案,找出其中連續的可列印字元(printable characters),並將它們提取出來。這篇文章將深入解析 strings 的用法,幫助你掌握這項基礎卻極實用的技術。

什麼是 strings?

簡單來說,二進位檔案中不僅包含機器碼,還夾雜著大量的文字資訊。這些文字可能出現在程式碼的常量區、錯誤處理區塊或配置檔載入邏輯中。strings 指令會忽略非文字的二進位數據,僅輸出長度達到預設值(通常為 4 個字元)以上的連續可列印字串。

基本用法與選項解析

在 Ubuntu 或 Debian 系統中,strings 通常預設已安裝。若未安裝,可透過 sudo apt install binutils 進行安裝。

1. 基本提取

最簡單的用法是直接指定檔案名稱:

strings /usr/bin/ls

執行後,你會看到 ls 命令相關的許多文字資訊,例如:

/lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libselinux.so.1
Usage: ls [OPTION]... [FILE]...
Try 'ls --help' for more information.

2. 指定最小字串長度 (-n)

預設情況下,strings 只輸出長度大於等於 4 的字串。如果你只想看較長的關鍵詞(例如路徑或長錯誤訊息),可以使用 -n 選項:

# 只輸出長度大於等於 10 的字串
strings -n 10 /usr/bin/ls

3. 顯示偏移量與檔案名稱 (-t)

在分析大型檔案或需要對照原始碼位置時,了解字串在檔案中的偏移量(offset)至關重要。-t 選項可以顯示每個字串的起始位置:

# 以十六進位顯示偏移量
strings -t x /usr/bin/ls | head -n 5

輸出範例:

1234 /lib/x86_64-linux-gnu/libc.so.6
5678 /lib/x86_64-linux-gnu/libselinux.so.1
9012 Usage: ls [OPTION]... [FILE]...

4. 僅顯示可執行檔中的字串 (-e)

二進位檔案中可能包含編碼不同的字串(如 UTF-16、UTF-32)。-e 選項允許你指定編碼類型:

  • s:ASCII(預設)
  • S:16 位元小端序(UTF-16LE)
  • b:16 位元大端序(UTF-16BE)
  • l:32 位元小端序(UTF-32LE)
  • L:32 位元大端序(UTF-32BE)
# 同時提取 ASCII 和 UTF-16 字串
strings -e sS /usr/bin/ls

實際應用場景

場景一:分析共享庫依賴

當你想快速查看某個程式依賴了哪些系統庫,而不想使用 ldd 的複雜輸出時,strings 是一個快速檢視工具:

# 查看 ls 命令依賴的動態連結庫
strings /usr/bin/ls | grep -E "\.so\.[0-9]"

場景二:搜尋惡意軟體或異常路徑

在資安分析中,常需檢查二進位檔案是否包含可疑的 IP 位址、網址或敏感路徑。結合 grep 可以高效完成此任務:

# 搜尋檔案中是否包含疑似 IP 位址的字串
strings /path/to/suspicious_binary | grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"

場景三:除錯程式錯誤訊息

當程式崩潰或行為異常時,開發者常需從核心轉儲(core dump)或二進位檔中尋找錯誤訊息。使用 -n 過濾短字串,可快速定位關鍵資訊:

# 從核心轉儲檔中尋找錯誤訊息
strings core_dump | grep -i "error\|fatal\|panic"

常見問題

Q1: 為什麼 strings 沒有顯示所有字串?

strings 預設只提取長度大於等於 4 的可列印字元序列。這是因為二進位資料中常會有隨機位元組合,若允許過短的字串,會產生大量無意義的雜訊。若你懷疑有較短的字串被忽略,可嘗試降低 -n 的值,但需注意輸出量會大幅增加。

Q2: strings 能處理壓縮或加密的檔案嗎?

不能。strings 只能直接掃描檔案的二進位內容。若檔案是 gzip、zip 等壓縮格式,或經過加密,需先解壓縮或解密,才能使用 strings 提取內容。對於壓縮檔,建議先使用 file 指令確認格式,再選擇適當的解壓工具。

小結

strings 雖然是個簡單的工具,但在 Linux 系統分析、除錯與資安審查中扮演著不可或缺的角色。它讓我們能快速窺探二進位檔案的內部世界,而不必進入複雜的逆向工程流程。掌握 strings 的選項與應用場景,將大幅提升你的 Linux 工作效率。下次遇到神秘二進位檔時,不妨先試試 strings,也許答案就在其中。