dogコマンドを作った

背景

Burp SuiteのDecoder機能では、下図のように適当な文字列に対して複数回エンコード、デコード、ハッシュ計算を簡単に行うことができる。 便利なので、コマンドラインとパイプでもやりたい。

f:id:inaz2:20150313024015p:plain

また、Ubuntu 8.04ではcat(1)に対しdog(1)というコマンドが存在していた。 これはcatに主にcurl的な機能を加えたものであり、同名の他の実装においてもネットワークプロトコル対応を加えたものとなっている。 しかし、改行コード変換、Base64などのバイナリ・テキスト変換、ハッシュ値計算、文字コード変換などを柔軟に行えるcat(1)というアプローチもありだと思ったので、作ることにした。

使い方

dog(1)はcat(1)の上位互換として、-c/-e/-d/-h/-iオプションが追加で使えるようになっている。 なお、Pythonで実装されているためPython 2系がインストールされている必要がある。

$ git clone https://github.com/inaz2/dog.git

$ cd dog/

$ sudo ln -s "$PWD/dog" /usr/local/bin/dog

$ echo hello | dog -n
     1  hello

$ echo hello | dog -c rot13
uryyb

$ echo -n hello | dog -e hex
\x68\x65\x6c\x6c\x6f

$ echo -n '\x68\x65\x6c\x6c\x6f' | dog -d hex
hello

$ echo -n hello | dog -e base64
aGVsbG8=

$ echo -n aGVsbG8= | dog -d base64
hello

$ echo -n hello | dog -h sha1
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d

$ echo 日本語 | dog -i :sjis | dog -e hex
\x93\xfa\x96\x7b\x8c\xea\x0a

$ echo -n '\x93\xfa\x96\x7b\x8c\xea\x0a' | dog -d hex | dog -i :utf8
日本語

上の例では、gitからcloneして/usr/local/bin/dogにシンボリンクを張った後、以下の操作を行っている。

文字コードの自動判定にはchardetモジュールを利用している。

まとめ

各種変換操作をある程度まとめることができて便利。

2015-03-28追記

-lでfileコマンドを実行し、先頭のhexdumpを表示するようにした。 また、アーカイブの場合はその中身、ELFオブジェクトの場合はシンボル情報を代わりに表示するようにした。

$ dog -l /usr/share/misc/magic.mgc
magic binary file for file(1) cmd (version 10) (little endian)
000000 1c 04 1e f1 0a 00 00 00 cd 26 00 00 62 02 00 00  >.........&..b...<
000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  >................<
*
0000f0 00 00 00 00 00 00 00 00 00 00 20 00 3d 1f 05 00  >.......... .=...<
000100

$ dog -l dog.tar.gz
gzip compressed data, from Unix, last modified: Sat Mar 28 13:42:08 2015
drwxr-xr-x user/user         0 2015-03-28 13:41 dog/
-rwxr-xr-x user/user      6748 2015-03-28 13:41 dog/dog
-rw-r--r-- user/user       825 2015-03-28 13:41 dog/README.md
-rwxr-xr-x user/user      7430 2015-03-28 13:41 dog/test.sh

$ dog -l /bin/sh
ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0f7ff287cf26eba9a6643b1226089eea57cb7e44, stripped
                 U abort
                 U chdir
                 U close
                 U closedir
(snip)
000000000021fdd8 B funcstringsize
000000000021fddc B funcblocksize
000000000021fde0 B funcstring
000000000021fde8 B _end