はじめに
Linux (Ubuntu) で作業をしていると、実行ファイルやコンパイル済みのプログラムなど、いわゆる「バイナリファイル」の中身を確認したくなることがあります。
しかし、テキストファイルと同じ感覚で cat や less コマンドを使ってしまうと、画面が解読不能な記号(文字化け)で埋め尽くされてしまいます。最悪の場合、ターミナルの表示が崩れて操作不能になってしまうことも……。
▼ less でバイナリファイルを開いてしまった例
"wtmp" may be a binary file. See it anyway? y
^B^@^@^@^@^@^@^@~^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@~~^@^@rebootそんな時に役立つのが strings コマンド です。 このコマンドを使うと、人間には読めないバイナリデータの中から、「人間が読める文字列(ASCIIテキストなど)」だけを綺麗に抽出 して表示することができます。
本記事では、Ubuntu 環境における strings コマンドのインストール方法から、実務で役立つ便利な使い方までを解説します。
- インストール:
binutilsパッケージの導入方法 - 基本: バイナリから文字列を抽出する方法
- 応用: バージョン情報の確認や、ノイズを減らすフィルタリング術
strings コマンドのインストール(binutils)
いざ strings を使おうとして、まず最初に躓くのがインストールです。 多くの人が直感的に以下のコマンドを実行してしまいます。
$ sudo apt install strings
E: Unable to locate package strings「パッケージ ‘strings’ が見つかりません」と言われてしまいます。 実は、Ubuntu(Debian系)には strings という名前のパッケージは存在しません。
正解は「binutils」パッケージ
strings コマンドは、binutils(Binary Utilities)というパッケージの中に含まれているツールの一つです。 そのため、インストールするには以下のコマンドを実行してください。
sudo apt update
sudo apt install binutils
開発環境などが整っている Ubuntu であれば、最初からインストールされていることも多いです。
インストールの確認
インストールが完了したら、バージョンを表示して確認してみましょう。
$ strings --version
# 出力例
GNU strings (GNU Binutils for Ubuntu) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.
...このようにバージョン情報(例:GNU strings …)が表示されれば、無事に準備完了です。
基本的な使い方
strings コマンドの使い方は非常にシンプルです。 基本的には、中身を見たいバイナリファイルのパスを引数に指定するだけです。基本構文は以下のとおりです。
strings [オプション] ファイル名実行例
試しに、Linux の基本的なコマンドである /bin/ls(これもバイナリファイルです)の中身を覗いてみましょう。
strings /bin/ls▼ 出力結果(一部抜粋) 実行すると、バイナリデータの中から「人間が読める文字列」だけが抽出され、標準出力に表示されます。
/lib64/ld-linux-x86-64.so.2
libselinux.so.1
_ITM_deregisterTMCloneTable
__gmon_start__
...
LS_COLORS
QUOTING_STYLE
COLUMNS本来なら文字化けしていたファイルから、ライブラリ名や環境変数名(LS_COLORSなど)が見事に読み取れるようになりました。
【Tips】大量に出力される場合は less を活用しよう
strings を実行すると、ファイルによっては数千行ものテキストが一気に表示され、画面があっという間に流れてしまいます。
そのため、実務では以下のように パイプ(|)を使って less コマンドに渡す のが一般的です。
strings /bin/ls | lessこうすることで、上下キーでスクロールしたり、less の検索機能(/キーワード)を使って特定のエラーメッセージなどを探したりできるようになります。
現場で使える!便利な活用事例
strings コマンドは、単体で使うよりも grep コマンドと組み合わせて「特定のキーワードを探す」ことで真価を発揮します。 現場でよく使われる2つの事例を紹介します。
事例①: プログラムのバージョンやコンパイラ情報を調べる
「このバイナリ、いつビルドされたバージョンだろう?」 「どのコンパイラ(GCCのバージョン)でコンパイルされたんだろう?」
そんな時、strings で抽出した中から version や GCC といったキーワードで検索をかけます。
# バージョン情報が含まれていないか探す(-i は大文字小文字を区別しない)
strings ./my_program | grep -i "version"
# コンパイルに使用された GCC のバージョンを探す
strings ./my_program | grep "GCC"▼ 出力例
Example Program version 1.2.3 (2025-01-15)
GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0コマンドライン引数(--version)すら実装されていない古いプログラムや、ライブラリファイル(.so)のバージョン確認に非常に有効です。
事例②: 埋め込まれたURLやファイルパスを探す
「この怪しいプログラム、どこに通信しようとしている?」 「設定ファイルはどこから読み込んでいる?」
ソースコードがないバイナリファイルの挙動を解析する際、中に埋め込まれている URL や ファイルパス を抽出することで、手がかりを掴めます。
# HTTP / HTTPS のURLを探す
strings ./unknown_binary | grep "http"
# 設定ファイルのパス(例: /etc/ 以下のパス)を探す
strings ./unknown_binary | grep "/etc/"▼ 出力例
https://api.example.com/check_update
/etc/my_app/config.conf


セキュリティ調査や、ブラックボックス化したレガシーシステムの解析において、この手法は最初の一手としてよく使われます。
ノイズを減らすオプション設定
strings コマンドをそのまま実行すると、短い英数字の並び(偶然テキストとして認識されたゴミデータ)まで大量に表示されてしまいます。 必要な情報だけを効率よく探すために、以下のオプションを活用しましょう。
オプション -n :最小文字数を指定する
「もっと長い文字列だけを表示したい」という場合に便利です。 デフォルトでは「4文字以上」の連続する文字列が表示されますが、これを「10文字以上」などに変更することで、ノイズを劇的に減らせます。
# 10文字以上連続する文字列のみ表示
strings -n 10 ./my_programURL やエラーメッセージなど、意味のある文章を探す場合は -n 10 くらいに設定すると、非常に見やすくなります。
オプション -t :ファイル内の位置(オフセット)を表示する
「抽出された文字列が、バイナリファイルのどの場所(何バイト目)にあるのか」を知りたい場合に使います。 引数には d (10進数)、o (8進数)、x (16進数) を指定できます。
# 文字列の場所を 16進数 (hex) で左側に表示
strings -t x ./my_program▼ 出力例
4020 ELF
4040 /lib64/ld-linux-x86-64.so.2
4200 version 1.0.0


「このメッセージが表示される条件を解析したい」といった場合、ここで判明したアドレス(オフセット)を元にバイナリエディタで該当箇所を開く、といった高度な解析が可能になります。
まとめ
本記事では、Ubuntu でバイナリファイルの中身を確認できる strings コマンドについて解説しました。
- 導入
-
パッケージ名は
stringsではなくbinutils - 基本
-
catで文字化けするファイルも、stringsなら文字だけ抽出できる - 活用
-
grepと組み合わせてバージョン調査をしたり、-nオプションでノイズを除去して使う。
以上、最後までお読みいただきありがとうございました。


