これは、次のコマンドを使用してキャプチャしたIPv6 TCPパケットの16進出力ですtcpdump
。
6000 0000 0018 0620 0000 0000
0000 0000 0000 0000 0000 0001 0000 0000
0000 0000 0000 0000 0000 0002 *0026 0026
0000 0001 0000 0002 {5}412 0065 0034 0000*
6162 6364
パケット自体は*
上記のsの間にあります。パケット長を32ビットワードで表します{5}
(したがって5ワード長 - 20バイト)。この情報からtcpヘッダーを抽出するにはbash / awkスクリプトを使用する必要があるため、スクリプトは長さバイトを見つけて、それを使用してどれだけ読み取るべきかを知る必要があります。 Bashやawkでどうすればいいですか?
答え1
これはPerlやPythonで行うことに近いですが、純粋なbashでも行うことができます。警告:テストされていません。
ipv6_packet='6000 … 6364'
ipv6_packet=${ipv6_packet,,?} # normalize hexadecimal digits to lowercase, just in case
ipv6_packet=${ipv6_packet//[!0-9a-f]/} # remove whitespace and everything else that isn't a hex digit
tcp_packet=${ipv6_packet:80} # all but the first 40 bytes (IPv6 header)
((tcp_data_offset=0x${tcp_packet:24:1}*4)) # data offset (25th nybble), converted from words to bytes
tcp_header=${tcp_packet:0:$tcp_data_offset} # that's the TCP header (still in hexdump form)
または減らして:
ipv6_packet=${ipv6_packet,,?}; ipv6_packet=${ipv6_packet//[!0-9a-f]/}
tcp_header=${ipv6_packet:80:$((0x${ipv6_packet:104:1}*4))}