16進数のNULLバイト(00)
NULLバイト(hex 00)のプログラミング、C文字列、セキュリティ、バイナリデータ分析における重要性について学びます。NULLターミネータとパディングを理解します。
Hex
00
ASCII
NUL (non-printable)
詳細な説明
NULLバイトは、16進数で00と表され、コンピューティングにおいて最も重要な値の1つです。バイト値ゼロ — 8ビットすべてが0(バイナリで00000000)です。「何もない」ように見えますが、NULLバイトは文字列処理、メモリ管理、ファイル形式、セキュリティにおいて重要な役割を果たします。
C文字列におけるNULLバイト:
C言語およびCとインターフェースするすべての言語(事実上すべての言語)では、文字列はNULLバイトで終端されます。文字列"Hello"はメモリ内に6バイトとして格納されます: 48 65 6C 6C 6F 00。末尾の00は、strlen()、printf()、strcpy()などの関数に文字列の終わりを伝えます。このターミネータがなければ、これらの関数はゼロバイトに偶然遭遇するまでメモリを読み続け、バッファオーバーリードやクラッシュの原因となります。
hexダンプでのNULLバイト:
hexエディタでバイナリデータを調べる際、NULLバイトはhexカラムに00として、ASCIIカラムには通常.または空白として表示されます(ASCII 0は非印字制御文字のため)。NULLバイトの長い連続は、通常以下を示します:
- パディング — 多くのファイル形式はアラインメント境界にゼロで構造をパディング
- 未初期化データ — ゼロクリアされたメモリまたはディスク領域
- スパースファイル — 意味のあるデータを含まないファイルのセクション
- ワイド文字列 — UTF-16エンコードされたASCIIテキストでは、各文字の間に
00バイトが入る(例: UTF-16LEの"Hi"は48 00 69 00)
セキュリティへの影響 — NULLバイトインジェクション:
NULLバイトは歴史的に深刻なセキュリティ脆弱性の基盤となってきました。NULLバイトインジェクション攻撃では、攻撃者が%00や\x00を入力に挿入して、Cレベルで文字列を切り詰めます。一方、高レベル言語は完全な文字列を処理し続けます。例えば、malware.php%00.jpgというファイル名は、ファイル拡張子チェック(".jpg"を認識)を通過するかもしれませんが、Cライブラリ経由でファイルシステムに渡される際にmalware.phpに切り詰められます。
ネットワークプロトコルでのNULLバイト:
DNSクエリ、SMBプロトコル、その他多くのネットワーク形式はNULLバイトをデリミタとして使用します。DNSでは、ドメイン名ラベルは長さプレフィックス付きで、シーケンスはNULLバイト(00)で終了します。
NULLバイトと空データの区別:
NULLバイトは1バイトのストレージを占める特定の値(0x00)です。「空」や「何もない」とは異なります — 空の文字列は長さゼロバイトですが、NULL終端の空文字列は正確に1バイト(ターミネータ00自体)を含みます。
ユースケース
NULLバイトの理解は、C文字列の問題のデバッグ、hexエディタでのバイナリファイル形式の分析、NULLバイトインジェクション脆弱性のセキュリティ監査、ネットワークプロトコルデータの解析に不可欠です。