バイナリファイルを端末へ直接catせず、まずfile -- ./sample.binで形式候補を読み取り確認し、od -Ax -tx1z -N 256 -- ./sample.binまたはxxd -g 1 -l 256 ./sample.binで先頭256バイトだけを16進表示します。16進ダンプは各バイトを曖昧なく見せる診断表現で、元データを「文章」に変換するものではありません。実行ファイル、文書、画像、データベースは形式固有ツールで解析し、未知ファイルを実行しません。逆変換や編集は作業コピーでのみ行い、前後のサイズとSHA-256、cmpで完全一致を確認します。
バイナリとテキストの違いを目的から考える
すべてのファイルはバイト列です。テキストは文字コードと改行規則で文字として解釈できるバイト列、バイナリは画像、実行形式、圧縮、独自構造などを含む広い呼び方です。ASCIIらしい部分が見えても全体がテキストとは限らず、拡張子が.txtでも内容がバイナリの場合があります。
目的を「先頭マジックを確認」「既知オフセットの値を見る」「埋め込み文字列を探す」「二ファイルが同一か確認」「安全な転送用ASCIIへ符号化」に分けます。目的ごとにfile、od/xxd、strings、cmp、base64を使い分けます。未知形式をテキストエディターで開いて保存すると、改行/文字コード変換で壊す恐れがあります。
fileで形式と文字コード候補を確認する
file -- ./sample.binはファイルシステム情報、マジック、言語テストなどで形式を分類します。MIME情報ならfile --mime -- ./sample.binを使えます。これは確定的な安全判定ではなく、マジックデータベースやファイル内容に基づく識別です。悪意あるファイルが偽装できるため、出所、署名、ハッシュ、隔離も確認します。
シンボリックリンクをたどるかはfileのオプションと環境で変わるため、対象のstat結果と実体を確認します。圧縮内部の解析オプションはCPU/メモリを多く使う恐れがあります。大容量や不信データは隔離した非特権環境で、サイズ上限とタイムアウトを設けます。
odで先頭を16進+文字表示する
od -Ax -tx1z -N 256 -- ./sample.binはオフセットを16進(-Ax)、1バイト単位の16進と印字可能文字(-tx1z)、最大256バイト(-N 256)で表示します。-vを追加すると同一行の省略記号*を使わず全行を出します。最初は範囲を限定して端末とログを守ります。
GNU odの既定はオフセットもデータも8進で、期待する一般的な16進ダンプとは表示が違います。明示オプションを使い、オフセット基数と値の単位を記録します。複数バイト整数として表示する場合はエンディアンと型幅が関係しますが、x1の一バイト表示は元の並びを直接示します。
オフセットと長さを限定して読む
特定位置はod -Ax -tx1z -j 0x100 -N 64 -- ./sample.binのように-jでスキップ、-Nで読み取り上限を指定します。GNU odは16進接頭辞やK/Mなどの単位を解釈します。仕様書のオフセットが10進か16進か、ファイル先頭基準か構造先頭基準かを確認します。
ファイルサイズを越える位置、負の値、巨大な長さを利用者入力から無検証で渡しません。調査記録にはファイルSHA-256、サイズ、オフセット、長さ、表示形式を残します。同じ名前のファイルが後で差し替わっても、ハッシュで対象を識別できます。
xxdで見やすい16進ダンプを作る
xxd -g 1 -l 256 ./sample.binは16進オフセット、1バイトごとの16進、右側のASCII欄を表示します。-s 0x100 -l 64で位置と長さを限定できます。xxdは環境によって別パッケージなので、command -v xxdとxxd -vを確認し、自動化では利用可能性を前提条件にします。
ASCII欄は印字可能バイトの補助表示で、UTF-8などの完全な文字解釈ではありません。右欄だけをコピーして元データだとみなしません。色付き表示はログや比較に制御コードを混ぜるため、再現可能な診断では色なしを使います。
stringsは埋め込み文字列の候補だけを出す
strings -a -n 6 -- ./sample.binは全体から既定の文字集合で6文字以上続く印字可能列を候補として出します。-t xを加えるとオフセットを16進表示できます。実行形式のエラーメッセージ、URL、ライブラリ名の手掛かりにはなりますが、構造を解析した結果ではありません。
文字列が出ないことは情報がない証明ではありません。圧縮、暗号化、UTF-16、短い文字列は見落とします。逆にランダムバイトが偶然文字列に見える偽陽性もあります。strings出力には資格情報、内部URL、個人データが出る可能性があるため、公開チケットへ無加工で貼りません。
base64は可読化ではなく符号化である
base64 --wrap=76 ./sample.bin > sample.bin.b64はバイナリを印字可能ASCIIへ符号化します。内容の意味は読めず、暗号化でも匿名化でもありません。GNU Coreutilsの説明ではサイズは元の約133%へ増えます。メールやテキスト経路での転送に使う場合も、経路の容量、改行規則、機密保護を確認します。
復号は新しい出力へbase64 --decode sample.bin.b64 > sample.recoveredとし、既存の元ファイルへ直接上書きしません。--ignore-garbageは壊れた入力を黙って受け入れる範囲を広げるため、信頼性が必要な復元で安易に付けません。復号の終了状態、サイズ、SHA-256、cmpを確認します。
xxd -rの逆変換は作業コピーで検証する
xxd ./sample.bin > sample.hexとし、未編集のダンプをxxd -r sample.hex sample.recoveredで別ファイルへ戻せます。プレーン16進はxxd -pとxxd -r -pを対にします。ただしxxdの公式man pageは、逆変換がゴミを黙って飛ばし、オフセットに従って出力先をシークし、既存出力を切り詰めない場合があると注意しています。
そのため既存バイナリを出力先にせず、空の新規ファイルを使います。ASCII欄を編集しても逆変換へ反映されず、16進欄の編集は実際のバイトを変えます。実行形式、署名付き文書、データベースを手作業でパッチせず、形式固有の安全な編集/再生成手順を使います。
cmpとハッシュで同一性を確認する
元と復元が完全一致するかはcmp --silent -- ./sample.bin ./sample.recoveredの終了状態で確認できます。0は同一、1は差異、2はエラーです。差分位置が必要ならcmp -lがありますが、大きく異なるファイルでは出力が膨大になるため、まず無出力比較とサイズ、ハッシュを使います。
sha256sum -- ./sample.bin ./sample.recoveredも記録します。ハッシュが同じなら同一性の強い確認になりますが、コマンドが読めなかった、別ファイルを指定したなどのエラーを見落とさず終了状態を確認します。バックアップは符号化テキスト一つだけにせず、元バイナリ、メタデータ、検証ハッシュをアクセス制限された媒体へ保持します。
二つのバイナリ差分は範囲を絞る
まずcmp --silent -- before.bin after.bin、次にcmp -n 4096 -- before.bin after.binで先頭範囲を比較します。差がある場合は、それぞれを同じodまたはxxdオプションで別診断ファイルへ出し、テキストdiffを取ります。Bashのプロセス置換は便利でもシェル依存なので、再現手順には一時ファイルとコマンド版を明示します。
バイナリの数バイト差が意味するものは形式依存です。タイムスタンプ、圧縮、署名、チェックサム、アドレス再配置で広範囲に変わることもあります。差分位置だけで改ざんや原因を断定せず、形式パーサー、署名検証、ビルド記録と照合します。
未知ファイルを実行・マウント・展開しない
表示のために未知の実行ファイルを起動したり、文書を通常アプリで開いたり、ディスクイメージをホストへマウントしたりしません。file、stat、ハッシュ、限定ダンプは読み取り中心ですが、解析ツール自体の脆弱性やリソース消費は残ります。不信データは非特権の隔離環境で、ネットワークなし、読み取り専用コピー、容量/時間上限を設けます。
マルウェア調査や法的証拠は組織のインシデント/フォレンジック手順へ従います。atime、隔離属性、監査証跡を変える可能性があるため、勝手にコピーや変換を開始しません。証拠保全が不要な一般診断でも、原本を変更せず作業コピーで行います。
出力にも元と同じ機密性を適用する
16進ダンプ、strings、base64は元データの情報を保持または露出します。テキストになったから安全ではありません。出力ファイルのumask、所有者、ACL、保存先、暗号化、バックアップ、削除期限を元データ以上に厳しくします。端末スクロールバックやCIログも保存媒体として扱います。
調査記録には対象ハッシュ、ツール/版、コマンド、範囲、時刻、終了状態を残し、結果の抜粋だけを共有します。診断終了後は承認された保持期限で作業ダンプを削除し、原本と検証記録を必要期間保管します。
確認チェックリスト
- 未知バイナリをcatや実行で開いていない
- fileとstatで形式・サイズ・リンクを確認した
- od/xxdはオフセットと長さを限定した
- strings出力を構造解析や安全性判定と誤解していない
- base64を暗号化や圧縮と誤解していない
- xxd -rは空の新規出力へ実行した
- cmp・サイズ・SHA-256で復元を検証した
- 診断テキストも元と同じ機密区分で保護した

コメント