16進数ダンプコマンドの違い

前回のエントリで、hexdump コマンドを使ったら想定した順序でバイナリがダンプされず苦い思いをした。
得点にも繋がった可能性もあると思うと悔やまれたため、整理(今更…)。
なお、今回はリトルエンディアンの環境で試している。

hexdump

バイナリをダンプしたいときは hexdump をよく使う。
いつもは -C オプションを付けてASCIIと一緒に見るが、オプションをつけないときと挙動が違う。
オプションなしでhexdumpを呼び、"ABCD" を16進数で表す。

[root@kali] # echo "ABCD" | hexdump
0000000 4241 4443 000a
0000005

2byteずつ読み込み、それを逆転させて出力しているため、想定した並び順となっていない。
紛らわしすぎる。
-C オプションを付けると1byte単位で読むようになり、想定した順序で出力された。

[root@kali] # echo "ABCD"|hexdump -C
00000000  41 42 43 44 0a                                    |ABCD.|
00000005

hexdumpまとめ

hexdump使うときはとりあえず -C をつけることにするといい。
(ときと場合にもよるけど)

xxd

これもよく使っている。特に逆変換するとき。
オプションなしで出力すると、2byteずつの区切りで表示されるが、順序はCharacterごとになって表示されている。想定どおり。

[root@kali] # echo "ABCD"|xxd
0000000: 4142 4344 0a                             ABCD.

-g オプションで groupsize を指定できるようなのでやってみたが、順序は変わらない。

[root@kali] # echo "ABCD"|xxd -g 1
0000000: 41 42 43 44 0a                                   ABCD.
[root@kali] # echo "ABCD"|xxd -g 2
0000000: 4142 4344 0a                             ABCD.

全角文字を試してみても同じ。

[root@kali] # echo "競駆魂"|xxd -g 1
0000000: e7 ab b6 e9 a7 86 e9 ad 82 0a                    ..........
[root@kali] # echo "競駆魂"|xxd -g 2
0000000: e7ab b6e9 a786 e9ad 820a                 ..........

xxdまとめ

xxdによるダンプは、1byte単位で出力され、逆転もされない。

od

これはそんなに使わないけどメモ。
16進数で出すには、 -h や -x オプションを使う。

[root@kali] # echo "ABCD"|od -h
0000000 4241 4443 000a
0000005
[root@kali] # echo "ABCD"|od -x
0000000 4241 4443 000a
0000005

2byteずつ読んでいる。hexdumpをオプションなしで呼んだときと同じ。
読み込むbyte単位を指定したいときは、 -t オプションでTYPEを指定し、"x" で16進数指定する。

[root@kali] # echo "ABCD"|od -t x
0000000 44434241 0000000a
0000005
[root@kali] # echo "ABCD"|od -t x1
0000000 41 42 43 44 0a
0000005
[root@kali] # echo "ABCD"|od -t x2
0000000 4241 4443 000a
0000005
[root@kali] # echo "ABCD"|od -t x8
0000000 0000000a44434241
0000005

Wikipedia(ぇ によると、odはエンディアン依存の実行結果を表示するようだ。
区切って読んだあとに逆転させて表示されている。数字を指定しないと4byte単位。

odまとめ

オプションしっかり指定してやらないとハマりそう。

結論

これからはデフォルトでは xxd 使うことにしよう。
ただエンディアンに依存して表示したいときはodコマンドを使うことにしよう。