きっかけ
CTFのハリネズミ本を読んでいると、.pcapの生データに関する記述がありました。
最近はアセンブリ命令しか見ていないので、機械語の方にも目を向けてもいいかなと…
.pcapファイル
libpcap(Packet Capture Library)は、wireshakeなどのlibpcapというライブラリを使用したパケットを保存するためのファイルフォーマットです。
構成
- libpcap header
- packet header
- pakcet data
の3段構造になっている。
libpcap header
libpcap headerはpcapファイルの情報を格納する場所です。
ファイル先頭の4バイトはD4 C3 B2 A1となっており、.pcapファイルと判別することができる。
(リトルエンディアンになっていることに注意)
補足
16進数は1文字に4ビット使用します(0001(1)~1111(F))。
画像からわかるように2文字8ビット(=1バイト)毎に区切られています。
- libpcapファイルフォーマットのバージョン
- majour version:2バイト
- minor version:2バイト
- 最新バージョンは2.4
- タイムゾーン情報
- timezone:4バイト
- 基本値は0x00000000
- タイムスタンプの精度
- sigfigs:4バイト
- 基本値は0x00000000
ここまでが画像の一行目にあたります。
- キャプチャできる最大パケット長
- snaplen:4バイト
- 基本値は0x0000FFFF
- 画像では0x00400000
- データリンク層のヘッダタイプ
- linktype:4バイト
- Ethernetの場合、0x00000001
packet header
- パケットがキャプチャされた時の日付
- 前4バイトはUNIX時刻型式の日付
- 後ろ4バイトはマイクロ秒
- 前4バイトは
46 D8 25 69となっている
UNIX時刻型式
1970年1月1日午前0時からの経過秒数で表します。
今回は、6925D846秒つまり、1747310662秒経過したことになります。
計算すると、2025年5月15日 21:04:22のパケットファイルだという事がわかります。
余談ですが、2038年にシステムのエラーが多発すると言われている原因がこれにあります。
C言語では、UNIX時刻型式が32ビット符号付整数型(最大21億4748万3647)で表現されている。最大値を日付に変換すると2038年1月19日3次14分7秒となります。
- パケットの長さ
- caplen:4バイト(記録されているパケット長)
- len:4バイト(実際のパケット長)
- 基本的に同じ値
- 画像では見切れているが、
4E 00 00 00 4E 00 00 00となっている
まとめ
先頭4ビットによってファイル形式が特定でき、それ以降のデータに意味が生まれます。
他ファイルではどのように定義されているのか気になりました。
