はじめに

こんにちは!今回はstringsコマンドについて解説します。

stringsは、バイナリファイルから印字可能な文字列を抽出するコマンドです。実行ファイルやライブラリファイルに埋め込まれた文字列を確認できます。

セキュリティ調査やプログラム分析で、めっちゃ活躍しますよ。

stringsコマンドとは

stringsは、ファイル内にある人間が読める文字列(ASCII文字)を抽出して表示する外部コマンドです。

主な機能:

  1. 文字列抽出 - バイナリファイルから読める文字を抽出
  2. 最小長指定 - 最小の長さを指定可能
  3. オフセット表示 - ファイル内の位置を表示
  4. 複数フォーマット - 異なるエンコーディングに対応
  5. セキュリティ調査 - マルウェアやプログラムの分析

バイナリファイルの内容を簡単に確認できます。

基本構文

1
strings [オプション] ファイル

標準入力からも読み込み可能。

主なオプション

オプション 説明
-n 最小長 指定長以上の文字列のみ表示(デフォルト4)
-t 形式 オフセット表示形式(o=8進数、x=16進数、d=10進数)
-a すべてのセクションをスキャン
-e エンコーディング エンコーディング指定(s=ASCII、S=Unicode等)
-f ファイル ファイルリストから読み込む
- オフセットを表示しない

使用例

例1: 基本的なファイルスキャン

1
strings /bin/ls | head -20

実行結果:

1
2
3
4
5
6
7
8
/lib64/ld-linux-x86-64.so.2
__cxa_finalize
libc.so.6
strrchr
abort
__libc_start_main
__gmon_start__
...

実行ファイルから見つかった文字列を表示。

例2: 最小長を指定

1
strings -n 10 /bin/ls | head

実行結果:

1
2
3
4
5
6
/lib64/ld-linux-x86-64.so.2
__cxa_finalize
__libc_start_main
__gmon_start__
invalid-argument
...

10文字以上の文字列のみ表示。

例3: オフセットを16進数で表示

1
strings -t x test.bin

実行結果:

1
2
3
1234 hello
5678 world
...

各文字列のファイル内位置を16進数で表示。

例4: オフセットを10進数で表示

1
strings -t d test.bin

実行結果:

1
2
3
4660 hello
22136 world
...

オフセットを10進数で表示。

例5: テキストファイルで確認

1
2
echo -e "hello\x00\x01\x02world" > test.bin
strings test.bin

実行結果:

1
2
hello
world

バイナリデータ内の文字列を抽出。

例6: オフセットなしで表示

1
strings - /bin/ls < /bin/ls | head -10

実行結果:

1
2
3
4
5
/lib64/ld-linux-x86-64.so.2
__cxa_finalize
libc.so.6
strrchr
...

オフセット情報を削除(-オプション)。

例7: 標準入力から読み込み

1
echo "test data" | strings

実行結果:

1
test data

標準入力からのデータを処理。

例8: ライブラリファイルのスキャン

1
strings /lib64/libc.so.6 | grep -i "version"

実行結果:

1
2
3
4
GLIBC_2.17
GLIBC_2.16
GLIBCXX_3.4.21
...

ライブラリに含まれるバージョン情報など。

例9: 複数ファイルの処理

1
strings /bin/ls /bin/cat | grep "usage"

実行結果:

1
2
Usage: %s [OPTION]... [FILE]...
...

複数のバイナリから文字列を抽出。

例10: パターンマッチング

1
strings /bin/ls | grep -E "^[A-Z]{5,}$"

実行結果:

1
2
3
USAGE
ERROR
...

特定パターンの文字列を抽出。

Tips・注意点

最小長の選択

1
2
3
4
5
6
7
8
# デフォルト(4文字以上)
strings file.bin

# 短い文字列も表示
strings -n 1 file.bin

# 長い文字列のみ
strings -n 20 file.bin

ノイズを減らすため、最小長を調整します。

grepとの組み合わせ

1
strings /bin/ls | grep -i "command\|version"

grepで特定の文字列を検索。

オフセット情報の活用

1
strings -t x /bin/ls | grep "error"

問題のある箇所をオフセットで特定。

実践的な使い方

セキュリティ調査

1
2
3
#!/bin/bash
suspicious_file="$1"
strings "$suspicious_file" | grep -E "http|ftp|cmd|exec"

不審なコマンドやURL参照を検出。

プログラム分析

1
strings /bin/ls | grep -E "^-[a-zA-Z]" | head

実行ファイルがサポートするオプションを推測。

ライブラリ依存関係確認

1
strings /lib64/libc.so.6 | grep "GLIBC_" | sort -u

ライブラリのバージョン情報確認。

隠された設定値検出

1
strings application.bin | grep -E "localhost|127.0.0.1|config"

アプリケーションに埋め込まれた設定値を発見。

バージョン情報抽出

1
strings /bin/bash | grep -i "version"

バージョン情報をバイナリから抽出。

まとめ

stringsコマンドのポイント:

  • バイナリファイルから文字列を抽出するコマンド
  • デフォルト: 4文字以上の文字列を表示
  • -n 最小長: 最小の文字列長を指定
  • -t 形式: オフセット表示(o=8進数、x=16進数、d=10進数)
  • -a: すべてのセクションをスキャン
  • よく使う組み合わせ: strings file | grep pattern, strings -t x file

バイナリファイルの分析やセキュリティ調査に最高のコマンドですよ!