3回連続で執筆を担当しているid:TAKESAKOです。
ASCIIと非互換な文字コードとして古くからEBCDICが知られています。
今日は記号プログラミングでわかりにくくしたJavaScriptプログラムをASCII非互換の文字コードEBCDICでさらに難読化してみようと思います。
1964年にIBMによって作られた汎用大型コンピュータ用の文字コードがEBCDICです。
EBCDICは「Extended Binary Coded Decimal Interchange Code」の略で「エビシディック」と発音します。COBOLなどの古代言語で使用された二進化十進数(BCD)を拡張する形で文字コードが定義されています。メインフレームやホストコンピュータなどで現在も使用されている現役バリバリの文字コードです。
EBCDICには、いくつかのコードページがあるのですが、記号プログラムの難読化に一番使えそうなcp500を考えてみます。
これをISO-8859-1のコードページcp819と比較すると以下になります。
cp500で読み込むと、以下の記号は次の表で置き換えられてしまいます。
Hex | ASCII | cp500 |
0x5b | [ | $ |
0x5c | \ | |
0x5e | ^ | ; |
0x60 | ` | - |
0x7e | ~ | = |
0x7d | } | ' |
これを利用して記号のみで書かれたJavaScriptプログラムを難読化してみましょう。
以下のファイルをASCIIで1行書いてみます(ただし改行は除く)。
[~}}^[``^[`~``[\``[`[^
このファイルをcp500のEBCDIC文字コードで読み直すと以下になります。
$='';$--;$-=--$*--$-$;
変数$に-10を代入していることになります。
以下のHTMLを作成し、cp500のEBCDIC文字コードでさきほどのJavaScriptファイルを読み込んで実行してみましょう。
<!DOCTYPE html> <meta charset="cp819"/> <script charset="cp500" src="ebcdic.js"></script> <script> ''[_=((_=''+-~-~'')+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!'') [_/_]+(_+!'')[_]+(''+!'')[_]+(_+{})[-~_*_]+(_+!'')[_/_]+(_+{})[_]+(_+!'') [_]][_](_[_][_]((_=-~-~''+'',(_+!'')[_])+(_+!'')[_*_]+(_+!'')[_/_]+(''+!'') [_]+(_+!'')[_]+(_+{}._)[_]+'\''+['',~_^~_*_+_,_*_+_-~_,_<<_-~_,~_*~_|_,~_* _^~_*_+_,_<<_-~_,_*_+_-~_,-_*~_+_,_<<_-~_|_,~(_*-_+_),(_-~_+_|_)+'("',(_+_) *_,(_-~_+_|_)-~_,_/_|_*_+_,-~(_*_<<_*_),_-~_+_-~_,_*_+_-~_,~_*_^~_*_+_,(_<< _-~_)+'.',_*_+_,(_-~_+_|_)-~_,(_+_)*_,(_-~_|_<<_-~_|_)+'.',~(~_-_+_),~_*_^~ _*_+_,~_*_^~_*_+_,_*_+_-~_,-_*~_+_,_|_<<_,_+_*_,_/_+_-~_,(~-_+_|_)+'=',''+_ %_+_*_,~(_*-_+_),_<<_-~_,(_*_+_-~_)+'()",-$*$*$)'][(_+{})[_*_]+(_+{})[_]+(_ +_/'')[_*_]+(_+{}._)[_]]('\\'+_/_)+'\'')())() </script>
さて、どうなったでしょうか?
Windows上のIEやSafariのブラウザではそのままOSの提供するEBCDICの文字コード変換エンジンが利用できます。驚くべき事に最新のWindowsでもEBCDICのサポートは続けられているのです。
IBMのコードページ500(EBCDIC)を利用したハックはgihyo.jpのエイプリルフール記事として掲載させていただきましたので、もしも興味のある方はご覧になってください。