【Ubuntu】strings コマンドの使い方|バイナリファイルから文字・バージョン情報を抽出する方法

  • URLをコピーしました!
目次

はじめに

Linux (Ubuntu) で作業をしていると、実行ファイルやコンパイル済みのプログラムなど、いわゆる「バイナリファイル」の中身を確認したくなることがあります。

しかし、テキストファイルと同じ感覚で catless コマンドを使ってしまうと、画面が解読不能な記号(文字化け)で埋め尽くされてしまいます。最悪の場合、ターミナルの表示が崩れて操作不能になってしまうことも……。

▼ 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 で抽出した中から versionGCC といったキーワードで検索をかけます。

# バージョン情報が含まれていないか探す(-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_program

URL やエラーメッセージなど、意味のある文章を探す場合は -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 オプションでノイズを除去して使う。

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

インフラ(クラウド/NW/仮想化)から Web 開発まで、技術領域を横断して活動するエンジニア💻 コンシューマー向けエンタメ事業での新規開発・運営経験を活かし、実戦的な技術ノウハウを発信中

[ Certs ] CCIE Lifetime Emeritus / VCAP-DCA ✒️ [ Life ] 技術書・ビジネス書愛好家📖 / 小・中学校で卓球コーチ👟

目次