文字列を使用してバイナリ内の隠しテキストを抽出する方法

最終更新: 19/09/2025
  • 文字列は、バイナリで読み取り可能な文字列、フォレンジックおよび CTF のキーのみをフィルタリングして表示します。
  • -n、-e、-t などのオプションは、長さ、エンコード、オフセットを正確に調整します。
  • grep、sort、head、binwalk と組み合わせることで、複雑な調査を高速化します。
  • 機密文字列を保護するには、実行時の暗号化と軽量の難読化を検討してください。

バイナリから隠しテキストを抽出するための文字列ガイド

技術的なことに興味を持つと、 コマンド 彼らは満足感を与えてくれる strings. この小さなユーティリティは、バイトの真ん中に隠された読み取り可能なテキストを明らかにすることができます。実行ファイル、ライブラリ、あるいは一見難解なファイルであっても、 Linux、フォレンジック、CTF、バイナリ デバッグなど、これを習得すると何時間も節約できます。

このガイドでは、 strings 最初から最後まで:基本的な使い方から、他のツールとの強力な組み合わせまで、 テキスト、音声、画像におけるステガノグラフィの実例と開発者向けのヒント 機密性の高い文字列がバイナリで公開されるのを防ぐためのツールです。これらのツールを最大限に活用するための明確な例と実証済みのテクニックをご紹介します。

文字列とは何ですか? また、文字列がなぜ便利なのでしょうか?

コマンド strings ファイルを調べて、そこに含まれる印刷可能な文字シーケンスのみを表示します。 ノイズが豊富なバイナリでは、これにより、興味のあるものだけがフィルタリングされます。: 名前、ルート、メッセージ、署名、実行トラック。

何のために使うのでしょうか?最も一般的な理由は明らかです。 フォレンジック分析、デバッグ、そして単純な技術的好奇心フォレンジックやインシデント対応においては、アーティファクト(URL、ユーザー、コマンド、インストールパス)の特定に役立ちます。開発においては、文字列が埋め込まれているかどうかを確認するのに役立ち、CTFにおいては、クイックリファレンスのための万能ツールとして機能します。

重要なニュアンス:デフォルトで strings 設定可能な最小長の ASCII 文字列を検索します。 これにより、出力に誤検知が多すぎることが防止されます。ただし、ファイルで必要な場合は他の文字セットに調整できます。

バイナリファイルから人間が読める文字列を抽出する

はじめに: 基本的なコマンドの使い方

最も単純な呼び出しは直接的なものです。 バイナリ内の読み取り可能な文字列をすべてリストしたい場合 呼ばれます ejemplo.bin:

strings ejemplo.bin

デフォルトでは、ツールは最小の長さから任意の印刷可能な文字のシーケンスを出力します。 その長さを設定することでノイズを除去できる 貢献せず、興味のあるメッセージに焦点を当てています。

たとえば、10 文字以上の文字列のみを表示するには、最小長修飾子を使用します。 役に立たないマッチを大幅に減らす.

strings -n 10 ejemplo.bin

複数のファイルを一度に転送することもできます。 バイナリセットを検査するときに便利です (たとえば、実行可能ファイルまたはライブラリのフォルダー):

strings archivo1.bin archivo2.bin archivo3.bin

結果を微調整するための高度なオプションとテクニック

一般的な最初の最適化は、エンコードを指定することです。デフォルトではASCIIが想定されますが、 異なるエンコード(8ビット、UTF-16LE/BE)が疑われる場合、パラメータ -e それが鍵です。

GNU実装では strings, 典型的な旗 -e incluyen: s (7ビット) S (8ビット) l (16ビットリトルエンディアン) b (16ビットビッグエンディアン) L/B (バリエーション)。8ビットシーケンスを検索する例:

strings -e S archivo.bin

ファイル内の各文字列のどこにあるかを知りたい場合は、オフセットを追加します。 修飾子 -t スクロール形式を選択できます (10進数、8進数、16進数):

strings -t x archivo.bin

巨大なバイナリの場合、出力が膨大になる可能性があります。 次のようなユーティリティと組み合わせる head, grep, sort o uniq コントロールを取り戻すたとえば、最初の100個の文字列のみを表示するには、次のようにします。

strings archivo_grande.bin | head -n 100

キーワード(例:「トークン」)でフィルタリングするには: チェーン付き grep ノイズを制限します:

strings -n 8 binario | grep -i token

大規模な調査で結果を並べ替えたり重複を排除したりする必要がある場合は、次の操作を試してください。 並べ替えと重複の削除はパターンを見つけるのに役立ちます.

  SLAP と FLOP: 数百万台の Apple デバイスに影響を及ぼす新たな脆弱性

strings binario | sort | uniq -c | sort -nr

出力を保持する場合、最も移植性の高い方法は、シェルを使用してリダイレクトすることです。 リダイレクト > 普遍的であり、実装の依存性を回避します.

strings binario > cadenas.txt

法医学分析における実用化

侵害されたシステムでは、 strings アーティファクトの認識を高速化します。 疑わしい実行ファイルからパス、ドメイン、コマンド、永続性トレー​​スを抽出できますこれらの調査結果を相互参照する ログ あるいはIOCが事件の話を広める。

共有ライブラリでは、 ドライバー またはモジュール、 関数名とエラーメッセージが表示されます 容量や動作部品に関する情報を提供します。ファームウェアなどのブラックボックスでは、メーカーの刻印や内部バージョンを確認するのに役立ちます。

ヒント:複数のピースを扱う場合は、 各文字列にソースフィールドを追加します (例えば、ファイル名の前に xargs または、origin を印刷するツールを使用するなどして、後でコンテキストを失うことなくピボットできるようにします。

テキストにおけるステガノグラフィ:目に見えないものも語る

テキストステガノグラフィーは、多くの場合、「見えない」文字に依存します。 拡大鏡で実際のテキストのサイズを確認し、表示されているものと比較します。 紛れもない手がかりを発見する。 Microsoft Officeで隠し文字を表示する.

古典的な手法としては、各行の末尾のスペースとタブを使用してビットを非表示にすることが挙げられます。 スペース=0、タブ=1とすると、メッセージをエンコードできる。 一見すると見た目を変えずにバイナリを完成します。

別のバリエーションでは、Zero-Width Joiner/Non-Joiner などの非表示の Unicode 文字を使用します。 これらの標識は見た目には魅力的ではありませんが、スペースを占有します。、文字数を数えるとその存在が明らかになります。

ホモグリフも存在します。 同じ文字のように見えますが、異なるコードポイントです。文字をホモグリフに置き換えることで、一見普通のテキストでも類似したメッセージを伝えることができます。

Cyber​​Chefのようなツールは、これらのチェックやテクニックを容易にします。 Word文書内のメッセージを非表示にする: 長さ、行数、印刷できない文字を確認するカウントが表示されているものと一致しない場合は、テキストステゴが疑われます。

オーディオステガノグラフィー:スペクトルの手がかりとメタデータ

オーディオでは、スペクトログラム内の情報を隠すのが一般的です。 周波数密度を表示すると画像やパターンが表示されます、一般のリスナーが気付かないように。

一部のトラックは別のチャンネルでホストされます。 Audacityで各チャンネルを個別に聴いたり分析したりする または同様のエディターを使用すると、ミックス内で気付かれないメッセージが表示されます。

メタデータ(ID3など)を忘れないでください。 アーティスト、アルバム、コメント欄にはキーテキストを含めることができますCyber​​Chef はラベルを素早く検査するのに役立ちます。

古いモデムのような「ノイズの多い」ケースでは、Audiotap や WAV-PRG などのツールを検討してください。 そのきしみ音はエンコードされたデータ ストリームである可能性があります。 レトロな機器や特定のプロトコル用。

オーディオの詳細な視覚的分析には、Sonic Visualiser と SoX が役立ちます。 スペクトログラムを生成すると、耳では区別できない情報を「見る」ことができます。.

画像におけるステガノグラフィ:チャネル、LSB、その他

ラスター イメージでは、各ピクセルには通常 4 つのコンポーネント (R、G、B、A) があります。 チャンネルを個別に閲覧すると、隠しテキストが表示されることがあります。 o シンボル 合成画像には写っていないもの。

広く使用されている手法は、最下位ビット (LSB) を変更することです。 色はほとんど変わりませんが、データの埋め込みが可能です その後、正しいキーまたはアルゴリズムを使用して抽出されます。

steghide と呼ばれるユーティリティがあり、これを使用すると、パスワードを使用して画像 (および音声) 内のデータを隠したり抽出したりできます。 StegsolveとStegonlineはフィルターを適用し、チェックリストを提供する CTF に特化しています。

  電話番号なしでGmailアカウントを作成する方法

手がかりはEXIFメタデータにも隠されている可能性があります。 日付、場所、または関連情報を含むコメント初期段階で必ず確認してください。

Stegseek は、steghide 対応ファイルに対するパスワードの総当たり攻撃を高速化します。 パスワードが弱いと疑われる場合は、これが近道です その仮説を検証するか、破棄するかを決定します。

「その他」ファイル内のステゴとその他:binwalkとその仲間たち

画像や音声以外にも、別のコンテナの末尾にファイルを「貼り付ける」という手法がよく使われます。 Binwalkはシグネチャを識別し、埋め込まれたアーティファクトを抽出します 厳選された旗がいくつか付いています。

もう 1 つの戦術は、ファイルの有用なブロックの間に生のデータを詰め込むことです。 16進数アイとパターン検索(Base64、ヘッダー、フラグ) これらの注入は比較的簡単に検出できます。

誤検出に注意してください。特にPNGや大きなバイナリの場合は、 binwalkは実際にはノイズである偶然を歌うことができる結論を出す前に他の指標と比較してください。

このような状況では、 strings 再び便利になります: 読みやすいテキストを抽出し、それを「糸」として引っ張る 背後に何があるのか​​、さらに詳しくどこを見るべきかを知ることができます。

文字列を他のUnixエコシステムと組み合わせる

真の力は連鎖にあります。例えば、複数のバイナリを解析する際に、各チェーンにその起源を示すラベルを付けるには、次のようにします。 シェルループを使用するか find + xargs 文脈を維持するため。

結果を優先順位付け、グループ化、カウント、順序付けする必要がある場合は、 sort y uniq -c. どの文字列が最も多く繰り返されるかを見ることで、重要な部分を特定できる コードまたは構成の。

簡単なレポートを作成するには、結果をファイルにダンプして共有します。 単純なリダイレクトとそれに続く grep により、チームワークが容易になります。 そしてレビュー。

オフセットを気にするなら、次のことを覚えておいてください とともに -t 変位は16進数または10進数で取得できます逆アセンブルダンプや 16 進ダンプとの交差に便利です。

チェーンを表示したくないとき:開発の観点

多くの企業では、関数名やアルゴリズムの詳細を社内で記録しており、それらを公開したくありません。 これらの文字列がバイナリ内のプレーンテキストである場合、 strings 彼らを裏切るだろう。 何ができるの?

1 つのアイデアは、コンパイル時のハッシュ (テンプレート、UDL リテラル) です。 直接的な露出は減りますが、コンパイル時間が長くなる可能性があります また、古いコンパイラ (C++14 のサポートが制限されている VS2013 など) に依存している場合は、移植性が複雑になります。

もう一つの提案は、データを配列として保存することです。 char または 16 進数のオクテット。 些細な検索を騙すには stringsしかし、それは痕跡を残し続けている コードのメンテナンスが複雑になります。

文字列を暗号化し、実行時に復号化するコンパイル後のパッチ適用もあります。 課題は実行ファイルの整合性と安定性を維持することです すべてのターゲット プラットフォームで。

現実的なアドバイス:サーバーが要求に応じて文字列を提供するのに頼ることができない場合は、 派生キーと軽い難読化による実行時復号化を適用する (例:文字列を分割し、スタック上でデコードしてからメモリを解放する)。完璧なテクニックはありませんが、ハードルは上がります。

どのような戦略であっても、コストを考慮してください。 ビルド時間、複雑さ、クロスプラットフォームの互換性、パフォーマンス多くの製品では、維持が難しい「完璧な」ソリューションよりも、実用的なバランスの方が重要です。

何も壊さずにバイナリを操作する: C++ と Java

バイナリを読み取ったり書き込んだりして解析または変換する必要がある場合は、基本的な落とし穴を避けてください。 C++では、常に次のように始まります。 std::ios::binaryバッファサイズを正しく設定し、読み取り戻り値をチェックします。 Windows 方法を確認する CMDからファイルを操作する.

  Neuralink はカナダでの野心的な試験と認可によりニューロテクノロジーを進歩させます

典型的なセグメンテーション違反は、有効なメモリを持たないポインタを使用することで発生します。 バッファに収まる以上のバイト数を読み取る または、実際とは異なるサイズ/配置で構造を解釈します。

シリアル化する場合 struct そして、それらをクラスにマッピングし、パディングとエンディアンに配慮する必要があります。 安全に読むことができます std::vector<std::byte> そして意識的に解析する盲目的にキャストするのではなく。

Javaでは、テキストの場合、 FileReader + BufferedReader それらはうまく機能します。 try-with-resources はクローズを保証する 例外もありますが、 Files.lines() o Files.newBufferedReader() 正しい文字セットを示します。

テキストを書くには、 FileWriter y PrintWriter 行の形式を簡素化します。 NIOでは、 Files.newBufferedWriter() 文字セットの制御とオプションを提供します として APPEND o WRITE.

バイナリでは、 FileInputStream/FileOutputStream またはそのバッファリングされたバージョン。 実際に読み取られるバイト数を考慮して、チャンク単位で読み取ります。 ゴミや切り捨てを避けるために、その長さだけを記述します。

クラス RandomAccessFile 特定の位置にジャンプできます。 これは、オフセット(例えば、 strings -t) 特定のセグメントを編集または抽出したい場合。

パフォーマンスに関する注意: バッファリングにより I/O が緩和され、処理速度が向上します。 BufferedInputStream/BufferedOutputStream 物理ディスクアクセスを削減大きなファイルの場合、これは非常に重要です。

弦楽器の実用的なヒントとコツ

バイナリにノイズが多い場合は、最小長を増やします。 Un -n 8 o -n 12 情報のない文字列を除外する メッセージの関連性を保つ。

見るとき マルウェア または難読化されたバイナリの場合は、16 ビット エンコードを試してください。 テキストは交互にヌルバイトになる場合があります (UTF-16LE/BE) そのため、純粋な ASCII では気付かれません。

文字列が重要な場合は、そのオフセットを調べてコンテキストを調べます。 xxd o hexdump. バイトの周囲を見ると、構造があるか区切り文字があるかが明らかになる 正確な抽出に役立ちます。

レポートには、オフセット付きの出力サンプルとフィルター処理されたサンプルが含まれます。 他のアナリストが研究を再現し、拡張することが容易になる その道を離れるとき。

再現可能なパイプラインの場合は、ツールのバージョンに注意してください。 実装上の小さな違い(例: -e) チーム間の異なる出力を説明します。

一部のスイートには同様の機能が搭載されています strings Windows の場合 (例: よく知られているサードパーティ製ユーティリティ)。 混合環境で操作する場合は、互換性と構文を確認してください。 驚きを避けるため。

ステガノグラフィーでは、手動による検査と自動化ツールを交互に使用します。 テキスト/メタデータにはCyber​​Chef、オーディオにはSoXまたはSonic Visualiser、画像にはsteghide/stegsolveを使用します。 最も一般的なシナリオをカバーします。

binwalk が PNG の検出数が多すぎる、またはバイナリが巨大であると報告した場合は、確認してください。 帰ります strings もっともらしい署名、名前、またはルートを検索する ブラインドドローイング前。

上記のすべては、単純なアイデアに集約されます。 strings 最初に素早く安価な外観ですそこに何もない場合は、おそらくより詳細なテクニックが必要になりますが、情報がある場合は、すでに開始する場所があります。

オプション、組み合わせ、シナリオ(フォレンジック、CTF、開発、ステゴ)を検討した後、よく理解することは明らかです。 strings 有用性が倍増します。 賢く使用し、エンコードと長さを調整し、エコシステムの他の部分でもサポートしてください。 試行中に終了することなく、ほぼすべてのバイナリから値を抽出できます。

Word 文書を共有する前に、メタデータとコメントを削除します。
関連記事
ドキュメントを共有する前にWordからメタデータとコメントを削除する方法