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コマンドを使うことにしよう。