Twitterでそういうのを試みてる人がいて、できるみたいだったので備忘。 bash/zshだと、『$'AsciiCode'』で記述してやるとアスキーコードをその場で直接展開してくれるらしい(知らなかった…)。

[root@BS-PUB-CENT7-01 ~]# echo $'\x6c\x6f\x67\x67\x65\x72\x20\x27\x48\x65\x6c\x6c\x6f\x27'
logger 'Hello'

で、これをそのまま実行するとコマンドが実行できるのかというと、どうもそうではないらしい。

教えていただいた内容によると、アスキーコードから展開させた場合だと、その結果はシングルクォートで括られた状態で扱われるらしく、アスキーコードでスペースを指定しててもあまり意味がないらしい。 なので、実行するにはevalを利用するか、もしくはスペースだけはアスキーコードから展開させず、そのまま記述してやるといいみたいだ。 アスキーコードの中でシングルクォートを指定してる場合、エスケープされたことと同じになってしまうので、evalとは結果が少し違う。

eval $'\x6c\x6f\x67\x67\x65\x72\x20\x27\x48\x65\x6c\x6c\x6f\x27'
$'\x6c\x6f\x67\x67\x65\x72' $'\x27\x48\x65\x6c\x6c\x6f\x27'

blacknon@BS-PUB-UBUNTU-01:~$ echo $'\x6c\x6f\x67\x67\x65\x72\x20\x27\x48\x65\x6c\x6c\x6f\x27'
logger 'Hello'
blacknon@BS-PUB-UBUNTU-01:~$ $'\x6c\x6f\x67\x67\x65\x72\x20\x27\x48\x65\x6c\x6c\x6f\x27'
logger 'Hello': コマンドが見つかりません
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ eval $'\x6c\x6f\x67\x67\x65\x72\x20\x27\x48\x65\x6c\x6c\x6f\x27'
blacknon@BS-PUB-UBUNTU-01:~$ $'\x6c\x6f\x67\x67\x65\x72' $'\x27\x48\x65\x6c\x6c\x6f\x27'
blacknon@BS-PUB-UBUNTU-01:~$ tail -2 /var/log/syslog
Feb 28 07:42:18 BS-PUB-UBUNTU-01 blacknon: Hello
Feb 28 07:42:27 BS-PUB-UBUNTU-01 blacknon: 'Hello'

手動でこのアスキーコード出すのは面倒(スペースをそのまま使うのであればなお)なので、文字列からアスキーコードを生成する場合は以下のようにコマンドを実行してやればよいだろう。

echo -n 'echo abc' | od -An -tx1 | sed 's/ /\\x/g;s/[^ ][^ ]*/eval \$'\''&'\''/g' # eval方式で出力
echo -n 'echo abc' | od -An -tx1 | sed 's/ /\\x/g;s/\\x20/ /g;s/[^ ][^ ]*/\$'\''&'\''/g' # そのまま実行可能な形式で出力
blacknon@BS-PUB-UBUNTU-01:~$ echo -n 'echo abc' | od -An -tx1 | sed 's/ /\\x/g;s/[^ ][^ ]*/eval \$'\''&'\''/g'
eval $'\x65\x63\x68\x6f\x20\x61\x62\x63'
blacknon@BS-PUB-UBUNTU-01:~$ echo -n 'echo abc' | od -An -tx1 | sed 's/ /\\x/g;s/[^ ][^ ]*/eval \$'\''&'\''/g' | bash
abc
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ echo -n 'echo abc' | od -An -tx1 | sed 's/ /\\x/g;s/\\x20/ /g;s/[^ ][^ ]*/\$'\''&'\''/g'
$'\x65\x63\x68\x6f' $'\x61\x62\x63'
blacknon@BS-PUB-UBUNTU-01:~$ echo -n 'echo abc' | od -An -tx1 | sed 's/ /\\x/g;s/\\x20/ /g;s/[^ ][^ ]*/\$'\''&'\''/g' | bash
abc

はー…。

そもそも、こういったことをするという発想がなかったので、「できるんだなぁ…」という感想。 難読化という意味では確かに有用かもしれない…。読めない。