dogコマンドを作った
背景
Burp SuiteのDecoder機能では、下図のように適当な文字列に対して複数回のエンコード、デコード、ハッシュ計算を簡単に行うことができる。 便利なので、コマンドラインとパイプでもやりたい。
また、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にシンボリンクを張った後、以下の操作を行っている。
- catとして使う
- ROT13変換
- C言語形式の16進エスケープ
- Base64変換
- SHA-1計算
- 自動判定された文字コードからShift_JISへの変換
- 自動判定された文字コードからUTF-8への変換
文字コードの自動判定には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