PNGファイルシグネチャ — マジックバイト
8バイトのPNGファイルシグネチャ(マジックバイト)と各バイトの意味を理解します。バイナリ解析でhexヘッダーからPNGファイルを識別する方法を学びましょう。
Hex
89 50 4E 47 0D 0A 1A 0A
ASCII
.PNG....
詳細な説明
PNG(Portable Network Graphics)ファイルシグネチャは、すべての有効なPNGファイルの先頭にある8バイトのシーケンス: 89 50 4E 47 0D 0A 1A 0A です。このシグネチャは、さまざまな種類のファイル破損や転送エラーを検出するために慎重に設計されており、現在使用されている中で最も洗練されたマジックバイトシーケンスの1つです。
バイトごとの内訳:
| オフセット | Hex | 10進数 | 目的 |
|---|---|---|---|
| 0 | 89 |
137 | 高ビットセット — ビット7を除去するシステムを検出 |
| 1 | 50 |
80 | ASCII "P" |
| 2 | 4E |
78 | ASCII "N" |
| 3 | 47 |
71 | ASCII "G" |
| 4 | 0D |
13 | CR(キャリッジリターン) |
| 5 | 0A |
10 | LF(ラインフィード) |
| 6 | 1A |
26 | Ctrl+Z — DOSのtypeコマンドがバイナリデータを表示するのを停止 |
| 7 | 0A |
10 | LF — CR-LFからLFへの変換を検出 |
各バイトが重要な理由:
最初のバイト(89)は意図的に高ビットがセットされています。ファイル転送システムが第8ビットを誤って除去した場合(古いシステムでは起こりえた)、このバイトは09に変わり、即座に破損が明らかになります。
バイト1-3はASCIIで"PNG"を綴り、テキストエディタやhexダンプでファイルを表示する際に人間が読める識別子を提供します。
バイト4-5のCR-LFシーケンス(0D 0A)は、システムがLF改行をCR-LF(またはその逆)に変換する一般的な破損形式を検出します。
バイト6(1A)はCtrl+Z文字で、MS-DOSでのファイル終端マーカーとして機能します。ユーザーが誤ってPNGをテキストとして表示しようとした場合に、バイナリのゴミがコンソールにダンプされるのを防ぎます。
バイト7の最後のLF(0A)は2番目の改行チェックを提供します。バイト4-5のCR-LFとともに、CR-LFペアがスタンドアロンのLFやCRに変換されていないか検出できます。
シグネチャの後:
8バイトのシグネチャの直後に、PNGファイルは一連のチャンクを含みます。各チャンクは4バイトの長さ、4バイトのタイプコード(例: IHDR、IDAT、IEND)、チャンクデータ、4バイトのCRC32チェックサムで構成されます。最初のチャンクは常にIHDRでなければならず、画像の寸法とカラータイプが含まれています。
ユースケース
セキュリティアナリストやフォレンジック調査員は、PNGマジックバイトを使用して拡張子に関係なく画像ファイルを識別し、破損したアップロードを検出し、コンテンツ管理システムでファイルの整合性を検証します。