【RHEL】バイナリファイルを読む方法とコマンド解説

RHEL

今回は、Linuxを使い始めたばかりの方がつまずきやすい「バイナリファイル」について、基礎から丁寧に解説します。「バイナリファイルって何?」「catで開いたら文字化けした…」という経験はありませんか?

本記事では、バイナリファイルの正体から、RHEL(Red Hat Enterprise Linux)上で内容を確認・編集するための代表的なコマンドまでをわかりやすく紹介します。

1. バイナリファイルとは?テキストファイルとの違い

コンピュータが扱うファイルは、大きく「テキストファイル」と「バイナリファイル」の2種類に分類できます。

テキストファイルとは、文字コード(UTF-8やASCIIなど)に従って、人間が読める文字だけで構成されたファイルです。たとえば、シェルスクリプト(.sh)、設定ファイル(/etc/hosts、httpd.confなど)、ログファイル(/var/log/messagesなど)が代表例です。catコマンドやテキストエディタでそのまま内容を確認できます。

一方、バイナリファイルとは、テキスト以外のデータ、つまり機械語の命令コード・画像・音声・圧縮データなどを0と1のバイト列として格納したファイルです。実行ファイル(/usr/bin/ls、/usr/sbin/httpdなど)、画像ファイル(.png、.jpg)、圧縮ファイル(.gz、.tar.gz)、データベースファイルなどが代表例です。

ポイント:
テキストファイル:人間が読める文字のみで構成。catで内容確認可能。
バイナリファイル:0と1のデータの塊。catで開くと文字化けする。

試しにバイナリファイルをcatで開いてみると、以下のように意味不明な記号が表示されます。これはバイナリデータを無理やりテキストとして解釈しようとするためです。

# catでバイナリファイルを開いてみると…
$ cat /usr/bin/ls
ELF>@@
▒▒▒▒▒▒▒▒@@@@ @@ …(文字化け)# ← このように読めない状態になる

このような場合に活躍するのが、バイナリファイルを人間が読める形式で表示するための専用コマンドです。

2. なぜバイナリファイルを読む必要があるのか

「バイナリファイルが読めても意味があるの?」と思われるかもしれません。しかし、インフラエンジニアの現場では、バイナリファイルを確認・解析する場面が意外と多くあります。

  • トラブルシューティング:実行ファイルやデータファイルが破損していないか確認したいとき
  • セキュリティ調査:不審なファイルがマルウェアかどうか調べるとき
  • ファイル形式の確認:拡張子がなくてもファイルの種類を特定したいとき
  • ログやコアダンプの解析:バイナリ形式で出力されたデータを読み解くとき
  • 低レベルな仕組みの学習:ELF形式(Linux実行ファイルのフォーマット)などを理解したいとき

Linux初心者の段階では「バイナリファイルを見る機会はあまりない」と感じるかもしれませんが、中級以上のエンジニアになるにつれて確実に役立つスキルです。基本的なコマンドを今のうちに押さえておきましょう。

3. バイナリファイルの確認コマンド一覧

RHELでバイナリファイルを確認するための主なコマンドをまとめます。

コマンド 主な用途 出力形式 特徴
xxd 16進数ダンプ表示・逆変換 16進数+ASCII 最もよく使われる。逆変換(パッチ適用)も可能
od 8進数・16進数ダンプ 8進数/16進数など 古くからある標準コマンド。多彩な形式指定が可能
hexdump 柔軟な16進数ダンプ 16進数+ASCII -Cオプションで非常に見やすい出力
strings 文字列の抽出 テキスト文字列 バイナリの中から人間が読める文字列だけ抜き出す
file ファイル種別の判定 テキスト情報 拡張子に頼らずファイル形式を正確に判別できる

以降のセクションで、各コマンドの使い方を実例とともに詳しく説明します。

4. xxd:最もよく使われる16進数ダンプコマンド

xxdは、バイナリファイルを16進数(16進ダンプ)で表示するコマンドです。左にアドレス(オフセット)、中央に16進数のバイト列、右にASCII文字が並んで表示されるため、内容が非常に読みやすくなります。RHELではvim-commonパッケージに含まれており、通常はデフォルトでインストールされています。

基本的な使い方

# ファイルの先頭から全体を16進ダンプ表示
$ xxd /usr/bin/ls | head -5
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF…………
00000010: 0200 3e00 0100 0000 6054 4000 0000 0000 ..>…..`T@…..
00000020: 4000 0000 0000 0000 b80f 0200 0000 0000 @……………
00000030: 0000 0000 4000 3800 0900 4000 1e00 1d00 ….@.8…@…..
00000040: 0600 0000 0500 0000 4000 0000 0000 0000 ……..@…….
出力の見方:
左列(00000000: など):ファイル先頭からのバイト位置(オフセット)を16進数で表示
中央列(7f45 4c46…):実際のバイナリデータを16進数で表示(2バイトずつスペース区切り)
右列(.ELF…):対応するASCII文字(表示できないバイトは「.」で表示)

上の例で先頭に「7f 45 4c 46」が見えます。これは「ELF」という文字列に対応しており、Linux実行ファイルであることを示すマジックナンバー(ファイル先頭に置かれた識別子)です。

よく使うオプション

# 先頭の32バイトだけ表示(-l でバイト数を指定)
$ xxd -l 32 /usr/bin/ls# バイナリ(2進数)形式で表示(-b オプション)
$ xxd -b /usr/bin/ls | head -3

# 特定のオフセットから表示(-s でスキップするバイト数を指定)
$ xxd -s 0x100 -l 64 /usr/bin/ls

xxdによるバイナリ編集(逆変換)

xxdの強力な機能として、「16進ダンプをテキスト編集してバイナリに戻す」という逆変換機能があります。

# 1. xxdでダンプをテキストファイルに保存
$ xxd sample.bin > sample.hex# 2. テキストエディタで16進数部分を編集
$ vi sample.hex

# 3. -r(reverse)オプションでバイナリに戻す
$ xxd -r sample.hex > sample_patched.bin

注意:実行ファイルなどのシステムバイナリを直接編集すると、システムが起動しなくなる恐れがあります。学習目的では、必ずコピーを作成してから試してください。

5. od:古くからある定番のダンプコマンド

od(Octal Dump)は、UNIXの時代から存在する伝統的なバイナリ確認コマンドです。デフォルトでは8進数表示ですが、オプションで16進数など様々な形式に切り替えられます。

基本的な使い方

# デフォルト(8進数)で表示
$ od /usr/bin/ls | head -3
0000000 042577 043114 000401 000001 000000 000000 000000 000000
0000020 000402 000076 000001 000000 060140 000100 000000 000000
0000040 000100 000000 000000 000000 005670 000002 000000 000000# -A x:アドレスを16進数、-t x1z:1バイト単位の16進数+ASCII表示
$ od -A x -t x1z /usr/bin/ls | head -3
000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 >.ELF…………<
000010 02 00 3e 00 01 00 00 00 60 54 40 00 00 00 00 00 >..>…..`T@…..<
000020 40 00 00 00 00 00 00 00 b8 0f 02 00 00 00 00 00 >@……………<

主なオプション

オプション 意味
-t x1 1バイト単位で16進数表示
-t x1z 16進数+表示可能なASCII文字も出力
-t d1 1バイト単位で符号付き10進数表示
-A x アドレス表示を16進数にする
-N 数値 先頭から指定バイト数だけ表示

6. hexdump:柔軟な出力形式で解析する

hexdumpは、odに近い機能を持つコマンドで、より見やすいフォーマットで16進数ダンプを出力できます。特に-Cオプションを使うと、xxdに似た「16進数+ASCII」の読みやすい形式で表示できます。util-linuxパッケージに含まれており、RHELにデフォルトでインストールされています。

# -C:16進数+ASCII文字を並べて表示(最もよく使われるオプション)
$ hexdump -C /usr/bin/ls | head -5
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF…………|
00000010 02 00 3e 00 01 00 00 00 60 54 40 00 00 00 00 00 |..>…..`T@…..|
00000020 40 00 00 00 00 00 00 00 b8 0f 02 00 00 00 00 00 |@……………|
00000030 00 00 00 00 40 00 38 00 09 00 40 00 1e 00 1d 00 |….@.8…@…..|
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 |……..@…….|# 先頭64バイトだけ表示
$ hexdump -C -n 64 /usr/bin/ls

xxd と hexdump -C の違い:どちらも16進数+ASCII表示ですが、xxdはvim-commonパッケージ、hexdumpはutil-linuxパッケージに含まれています。どちらも通常デフォルトでインストール済みです。出力形式はほぼ同じなので、慣れた方を使えば問題ありません。

7. strings:バイナリの中から文字列だけを抜き出す

stringsコマンドは、バイナリファイルの中に埋め込まれているASCII文字列を抽出して表示します。実行ファイルに含まれているメッセージや、怪しいファイルに埋め込まれた文字列を確認するのに非常に便利です。

# /usr/bin/ls に含まれる文字列を表示
$ strings /usr/bin/ls | head -15
/lib64/ld-linux-x86-64.so.2
libselinux.so.1
libcap.so.2
libc.so.6
setlinebuf

–color[=WHEN]
-l, –format=long
do not list implied . and ..# 6文字以上の文字列だけ抽出(-n でデフォルトの4文字を変更)
$ strings -n 6 /usr/bin/ls

# 文字列が存在するオフセットも表示(-t x:16進数アドレス付き)
$ strings -t x /usr/bin/ls | head -10

セキュリティ調査での活用:不審なファイルにstringsを実行すると、IPアドレス、URL、コマンド文字列、エラーメッセージなどが見つかることがあります。マルウェア解析の入口として広く使われているテクニックです。手軽に試せるので、まずこのコマンドを使ってファイルの中身を「覗いて」みるのがおすすめです。

8. file:ファイル形式を判別する

バイナリファイルを扱う前に、まずそのファイルが「何者なのか」を確認しておくことが重要です。fileコマンドは、ファイルのマジックナンバー(先頭バイト列)などを解析して、ファイルの種類を判定してくれます。

# ファイルの種類を判定
$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=…, for GNU/Linux 3.2.0, stripped$ file /etc/hosts
/etc/hosts: ASCII text

$ file /var/log/messages
/var/log/messages: ASCII text

# 複数ファイルを一度に確認
$ file /tmp/*

拡張子に頼らないファイル判定:Linuxでは拡張子がなくてもfileコマンドでファイル形式を正確に判別できます。たとえば「.sh」という拡張子がついていても実は実行ファイルだった、あるいは全く拡張子のないバイナリが実は画像ファイルだった、といったケースも見抜けます。正体不明のファイルに対してまずfileを実行する習慣をつけておくと役立ちます。

9. バイナリファイルを編集するには

バイナリファイルの「閲覧」だけでなく「編集」が必要な場合は、専用のバイナリエディタを使います。RHELで利用できる代表的な方法を紹介します。

vi + xxd を組み合わせる方法(最もよく使われる)

RHELのサーバー環境では通常GUIが使えないため、vixxdを組み合わせてバイナリを編集するのが現実的な方法です。

# 1. バイナリモードでviを開く(-b オプション必須)
$ vi -b sample.bin# 2. vi内でコマンドモード(:)に入り、xxdに変換して表示
:%!xxd

# 3. 16進数部分を直接編集する
# (右側のASCII表示部分は変更しないこと。左の16進数部分のみ変更する)

# 4. 編集後、バイナリに戻してから保存
:%!xxd -r
:wq

注意:バイナリ編集は1バイトでもずれると、ファイルが壊れて動作しなくなる可能性があります。必ず元ファイルのバックアップ(cp sample.bin sample.bin.bakなど)を取ってから作業してください。また、システムファイルへの不用意な変更はシステム障害の原因となります。

ghex(GUIバイナリエディタ)

RHEL 8以降でGUI環境を使っている場合は、ghexなどのグラフィカルなバイナリエディタも利用できます。視覚的に操作しやすく、バイトを直接クリックして編集できます。ただし、通常のサーバー環境ではGUIが入っていないことが多いため、CLIベースのxxd+viの組み合わせが主流です。

# ghexのインストール(GNOMEデスクトップ環境がある場合)
$ sudo dnf install ghex -y# 起動
$ ghex sample.bin

まとめ

本記事では、RHELでバイナリファイルを扱うための基礎知識とコマンドを紹介しました。

  • バイナリファイルとは、テキスト以外のデータ(実行ファイル・画像・圧縮ファイルなど)を0と1のバイト列で格納したファイルです。catで開くと文字化けします。
  • xxd:16進数ダンプの定番コマンド。逆変換(パッチ適用)もできる万能ツールです。
  • od:UNIXの歴史あるダンプコマンド。多彩な表示形式に対応しています。
  • hexdump -C:xxdに似た読みやすい16進数+ASCII表示が可能です。
  • strings:バイナリの中から人間が読める文字列だけを抽出します。セキュリティ調査にも活用できます。
  • file:拡張子に頼らずファイルの種類を正確に判定できます。正体不明のファイルに最初に使うコマンドです。
  • バイナリ編集はvi+xxdの組み合わせが現実的。作業前のバックアップを忘れずに。

最初はとっつきにくく感じるバイナリの世界ですが、これらのコマンドを使いこなせるようになると、トラブルシューティングやセキュリティ調査の幅が大きく広がります。ぜひ実際に手を動かしてコマンドを試してみてください。

 

【注意】

このブログは技術に関する知識や経験を共有することを目的としており、情報の正確性に努めていますが、その内容の正確性や完全性を保証するものではありません。ブログの情報を利用する場合は、自己の責任において行動してください。ブログの内容に基づいて行った行動や決定によって生じた損害や被害について、筆者は一切の責任を負いません。

 

記事の内容の一部は、生成AIで作成しています。

RHELITナレッジ
この記事の作者
StarTeller

30歳で異業種からITエンジニアへ転身し、10年以上にわたりインフラエンジニアとして様々な現場でシステム構築・運用に携わってきました。
得意分野はLinux/Windowsのサーバー構築・運用で、ネットワークやAWSなども実務で活用しています。このブログでは、これまでの業務で培った経験を基に、日々の業務で遭遇した問題の解決方法や、システム構築の具体的な手順を解説。現場のエンジニアが実際に「困ったとき」に参照できる情報を意識して投稿していこうと思っています。
※サーバ運用費がかかっているので、広告を掲載させて頂いてます。

StarTellerをフォローする
シェアする
StarTellerをフォローする
タイトルとURLをコピーしました