Shammer's Philosophy

My private adversaria

パケットをバイトで解析する・その1

Lisp Packet Generator を作る・その1 - Shammerismの手始めに、LispMACアドレスを取得してそれをそのままパケットファイルに書き出そうと思ったが、ちょっと現実的でもなさそうだ。過去にC言語でそれをやっているが(この記事)、これをそのままLispで実行できなそうだ。なので、パケットをバイナリで見てみることにする。使うパケットは手元にあった適当なもの。とりあえず、TCPのSYNだけを取り出してみた。

$ tshark -r SYN.pcap 
  1   0.000000 192.168.10.254 00:1f:a0:10:05:86 192.168.10.146 00:0c:29:35:c9:82 74 35029 → 80 [SYN] Seq=0 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSval=414999262 TSecr=2633257476 WS=64 TCP
$ 

これを-xで見てみる。

$ tshark -x -r SYN.pcap 
0000  00 0c 29 35 c9 82 00 1f a0 10 05 86 08 00 45 00   ..)5..........E.
0010  00 3c cc 40 40 00 40 06 d7 9a c0 a8 0a fe c0 a8   .<.@@.@.........
0020  0a 92 88 d5 00 50 49 48 ae 9e 00 00 00 00 a0 02   .....PIH........
0030  16 a0 ae e0 00 00 02 04 05 b4 04 02 08 0a 18 bc   ................
0040  62 de 9c f4 52 04 01 03 03 06                     b...R.....

$ 

パケットの冒頭はL2ヘッダで、DestMACが先頭にあるはず。上記のDestMACは、0000c.2935.c982。-xで見ても先頭が00 0c 29 35 c9 82になっている。これに続いてSrcMACがあるはず。上記のSrcMACは001f.a010.0586。-xの方の、c9 82 の続きは、00 1f a0 10 05 86となっていて、とりあえず順番通りに見える。
とりあえずここまではよさそうだ。
念の為、このSYNをodでも見てみる。

$ od -t x1 SYN.pcap 
0000000    0a  0d  0d  0a  60  00  00  00  4d  3c  2b  1a  01  00  00  00
0000020    ff  ff  ff  ff  ff  ff  ff  ff  04  00  3c  00  54  53  68  61
0000040    72  6b  20  28  57  69  72  65  73  68  61  72  6b  29  20  32
0000060    2e  30  2e  32  20  28  76  32  2e  30  2e  32  2d  30  2d  67
0000100    61  31  36  65  32  32  65  20  66  72  6f  6d  20  6d  61  73
0000120    74  65  72  2d  32  2e  30  29  00  00  00  00  60  00  00  00
0000140    01  00  00  00  20  00  00  00  01  00  00  00  ff  ff  ff  ff
0000160    09  00  01  00  06  00  00  00  00  00  00  00  20  00  00  00
0000200    06  00  00  00  6c  00  00  00  00  00  00  00  ed  e5  04  00
0000220    5b  53  6a  4a  4a  00  00  00  4a  00  00  00  00  0c  29  35
0000240    c9  82  00  1f  a0  10  05  86  08  00  45  00  00  3c  cc  40
0000260    40  00  40  06  d7  9a  c0  a8  0a  fe  c0  a8  0a  92  88  d5
0000300    00  50  49  48  ae  9e  00  00  00  00  a0  02  16  a0  ae  e0
0000320    00  00  02  04  05  b4  04  02  08  0a  18  bc  62  de  9c  f4
0000340    52  04  01  03  03  06  00  00  6c  00  00  00                
0000354
$ 

000c.2935.c982を探すと、半分より下のところにある。そもそも、tsharkで見た場合と表示される数字の羅列の数も異なる。tsharkでは1行16個が4行と12個の数字で合計76個、一方、odでは1行16個が14行と12個の数字で合計236個。差は160個、つまり、10行分。この10行分は何なのだろうか。