全部入り記号Polyglotでメリークリスマス!

tag sym x86 Perl Ruby JavaScript

今日でいよいよ最終日になりました。id:TAKESAKOです。

ネタで始まった記号トラックですが、執筆いただいたみなさんのおかげで全日程達成することができました。ありがとうございます。

感謝の意を込めて、今までの記号プログラミングの成果をすべて一つにまとめてみましょう。

polyglot.com

このファイルをpolyglot.comという名前で保存しておきます。

C:\> more polyglot.com
;"#{",$/*";}";'%@@%!!`[_][_]_[-"[-[;-!:-$,`________-;^-?_-_^-%}`]]]]]]]])--{--=^-~}-=?`^_^]^_^-+{--}-;`-:}`^_^]^_^-|--!#-!!-!"`^_^]^_^-#]-@"-{.-:=`^_^]^_^-^#-[^-{;-{[`^_^]^_^-+:-){-~}-~]`^_^]^_^-;;-{=-{]-[@`^_^]^_^-.!-.--}/-|``^_^]^_^-@{-$|-:|-^]`^_^]^_^-(+-@{-!.-|+`^_^]^_^-_%-$;-/}-@``^_^]^_^-,}-!(-}!-:!`^_^]^_^-[_-:.-(=-==`^_^]^_^-.:-/~-[(-_/`^_^]^_^-//-:.-,#-+,`^_^]^_^-=#-(^-($-```^_^]^_^-;{-|;-)"-+!`^_^]^_^-.(-)}-|,-./`^_^]^_^-",-{,-}{-.[`^_^]^_^-[;-{.-}"-[=`^_^]^_^-~.-,"-$:-?|`^_^]^_^-~!-){-@--~[`^_^]^_^-({-:"-[^-[/`^_^]^_^-](-$`-~`-[``^_^]^_^-#|-};-=/-%)`^_^]^_^??';%#;$^_='/[@./^-_[_&@|(_)^]-?,}[{`!,{|`.:-,]".|`',$^_^='_))@[|`:)-_`?@-@-)@^_]}[(`|+%@~__@|~@^[',$^_=~('(?{$^_=~'.('_^""'^'+,|/'."-".('$%'^';{'.'(-:^;'.('[)]@'^'>_<,').'$^_})')))#;_=[*'`'..%.~.]*%;;;$_=%+%++(??%?===???_[(_=~/\{/).-@+(_=~/~/)]:%%%<<(?!*(?+-?()));_=([*%/!/..%!/!]+[*%]:]..%)@)]+[*%.[...%.`.]+[*%.{...%.}.])*%(=~_~='_');$><<$_%(/\)=~_~='_'\*=/=~_)+$_%(/_',/=~_)+$_%(/~='_'\./=~_)+$_%(/~='_'\./=~_)+$_%(/~='_'\//=~_)+$_%(/'&/=~_)+$_%(/='_'%/=~_)+$_%(/=~_~='_'\+/=~_)+$_%(/\.=~_~='_'\//=~_)+$_%(/',/=~_)+$_%(/~='_'\//=~_)+$_%(/'_'%/=~_)+%))#*/=''[_=((_=''+-~-~'')+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!'')[_/_]+(_+!'')[_]+(''+!'')[_]+(_+{})[-~_*_]+(_+!'')[_/_]+(_+{})[_]+(_+!'')[_]][_](_[_][_]((_=-~-~''+'',(_+!'')[_])+(_+!'')[_*_]+(_+!'')[_/_]+(''+!'')[_]+(_+!'')[_]+(_+{}._)[_]+'\''+[''+'_="',_|_<<_,''+_%_+_/_,_+_%_,_+_%_,~(~_+_)+'\\'+_*_+_%_,~_+_^-_,_+-~_,(_+-~_)+'!";',_<<_-~_,-_*~_+_,(_-~_|_<<_-~_|_)+'{',~(_*-_+_),_-~_+_|_,_*_+_-~_,-_*~_+_,(_<<_-~_)+'(_)}',_/_|_*_+_,~(_*-_+_),_<<_-~_,_/_|_*_+_,(_-~_+_-_)+'($){',_*_+_^_+_,-_*~_+_,~(~_-_+_),~_*_^~_*_+_,(_<<_-~_)+'(_)}'][(_+{})[_*_]+(_+{})[_]+(_+_/'')[_*_]+(_+{}._)[_]]('\\'+_/_)+'\'')())()

Rubyで実行

まずはRubyで実行してみましょう。

C:\> ruby polyglot.com
Happy, Ruby!

Ruby1.8,1.9どちらのバージョンでも実行できました。

Perlで実行

次にPerlで実行してみましょう。

C:\> perl polyglot.com
Merry Christmas & HAPPY Perl!

おお。違うメッセージが表示されましたね。

JavaScriptとして実行

これもSpiderMonkeyのjsコマンドで実行してみましょう。

C:\>js -v
JavaScript-C 1.6 2006-11-19
usage: js [-PswWxC] [-b branchlimit] [-c stackchunksize] [-v version] [-f scriptfile] [-e script] [-S maxstacksize] [scriptfile] [scriptarg...]

C:\> js polyglot.com
HAPPY XSS!

ブラウザのJavaScriptコンソールで実行してもalertが表示されました。面白いですね。

MS-DOSで実行

Windowsのコマンドプロンプトで.comファイル(16bit MS-DOS)を直接実行してみます。

C:\> polyglot.com
Merry Christmas! 80286 (^-^)/~

無事、コンソール上にメッセージが表示されました。

polyglot.com解説

動作原理の説明ですが、各プログラミング言語のパーサの解釈の違いによって実行される処理を分岐しています。

基本的には以下の形となります。

;"#{",$/*";}";'86';%#;'Perl'#;'Ruby'#*/='JS';

余分にセミコロン(;)が入っていますが、これは8086としても実行できるようにするためです。

3B22    ;"     cmp sp,[bp+si]
237B22  #{"    and di,[bp+di+0x22]
2C24    ,$     sub al,0x24
2F      /      das
2A22    *"     sub ah,[bp+si]
3B7D22  ;}"    cmp di,[di+0x22]
3B27    ;'     cmp sp,[bx]
ここに本来実行したい 8086 のコードを書く
27      '      daa

逆アセンブルするとわかりますね。

最終問題

さて、読者のみなさんに向けて最後に問題です。

以下のファイルはどの言語で書かれているプログラムでしょうか?

final.code

ファイル名をfinal.codeとして保存して、いろいろ中身を確認してみてください。

^L

正解

まず、$><<が最初に出てきていますのでRubyで実行できそうということがわかります。実行してみましょう。

C:\> ruby final.code
$><<'$^_=\'_)@@[`/{#{{}]|~|*:!^?|+{||"`[=>;~`~@|._"]|!`|<<_}!}#%|@~"_~<_=:_,@<}|!`_%=_"+;?]##~{>(!.]&/`#~-&|+^@;`(&~{?/};|}&&;~,~!?$~?_~~}`}}$`?*`&>(#-_!"}<"_!`"!>/~}|<!_.~}!|"`_,&|{-+"+_@-}.]$#!`,#~>]""|`}|,~!:"~>!{-_&*~?~<)!<~`~^!<|"&"|=%~#,~;}!%!`)#|}.>:_"<^!}^,"!_~~}?+#=]`}_`~^!%`=%-"">_"`_!}|#%|"|#;)}=]`<_`<|&;~(|!=+}"_"<_:_!~^`}|/%{#/.$,|"<}!`_"~~#,({,&#(?!}"=>|}}<``}[`<[*}<<|~<|+[$]}}|"<^"`>!~}~}~_~<)_<`~`^:``)#@>$|}}$$#}/^}"[>]#,|_-"}_%?{=#&!=&|!/-~|/~()_@:$]="?}=#!`)$^//=/,$?=#_|||&{{}.[_.`<~~,!<{;)|$>>`{{%}%([]:<_/?#>~!;^=#`#|}#{;.!}^,}})[&,"`{};#{`~}~")[*);|>@~;*]_#!`|{~|/:&>}|-<<._=_`{|~|"|-^|-^<?}?)<%=%!"&"~`/]`(_~`{)|@?&:;}?%##"";:""~??`(<^?[!;"?"&#|}->;<+}}_</{<`_>%">~|!{.{#,`";"=;+?`"}__`}>`#`")<`{&>"!<!!~<;`/`]_`$#!`#}."`=/?%==%^-~}"{={{}=`{>)*^.];([%?@{;|?}~>$}>|#:/_=`<{<}~;^<<[;{||!>`#:}~/_]?<$(?`>}#%|%||;_$-[):`!,~<[__"~}~{?|<!_/}~><(<"<!]_`$}&{}#/.$:*!:,(,(.={|>!"#>;:-=;#(+~![=@:[|$}|}{}<?])^/,{$.@]]>#>`}#|/`">^?%"-!<}=<>]_#$}{"$>)>!}})%<>~`_;/|<>{$"`"#}/^/-]%>!`{/=}_?}`}#|$}_`"}^`[>$@@}/>#:-{-@|,"*&?,[$^"|@?=#~"##:|@|,%%#*-$/"*/"(]".~^}.~)~<#=!#+;!+@"*{;#!||$.@"!=|.$+@[/}({^~#}=!>@%#"?">~+-|@@#-_#;":!"?"#-#=!!?!`,#<}#=[%"<{*]|.~,!,`#}>}<:#$#`+|.!"]$;{??*:!|."`>##`*`+)`@@$.]`-+[#",#|#%+$*^#(%?+{!>!?=]#!&||:)#*~/}~_!!}&~#&##:&},$&)|"&"&&"[}<~!!~`~~`[,"("&.[}}!!""[""[+$*(+$_>{|`@_%[.`;{>?@#|:#[?"|^[{[,+<;[,^:|/,|{[|%[`&|.[,)##[[;/[%,#~|}|^#@+[/,[{"`&/|#%+]\',$^_^=\'/[)./@^[[_%"`[#"$).%_[:_"#|]|//{>>!~[?{|`^}<^``}&~@.(#}"~}"`}-(!>>`!^}<}+-$_%`-#|,!&.%~>&[!;|#=+#;%=(?&}!&/""+]&{(`!#!|/)!/~""_<!_*;`>?{.%|=~}~_`~}/;}|.""!^`}}>_!}^~<}"}#&=&};$=#&<#{,~=<.!.|~~^<!^"%~.}#.,$=$[$%`#,$~,_<"|}`^,}}!`~!~!!`"|~~=$.#@<@(!~`|}!|<~}}""_.&|-|<!}<"|/~?`+=/}.~~<}}!^-~#-#~+$"-|<`}<`^(`!<#|-&!~}~`}*~}"|<!^!~$~?#{<]~`_}<},%!~<%$<]^;`/&}`.[!!`<<!|<`|:&``^"`^;|{`!!^~`{~<~}"="![~_.$`.["<{(];;<}^{#""{{|"="!~~,~->_~?~!{+_&`~{|`{!/=?%]=_;;#<(_!]|`#`}~>;;#==@=={-"_?"#"{%$#<`"<=`">>}`_`;__^`?%&{"{:%|(.|=--,"}{#]}?}!#|%)?}!{>^@;`}>~<^&[}$>##!|;%;;+],;_);|?}~>!%!"=%},&_?@#<$`?>$"#"}"?>!?>--&/;#+]{~|{|!>=|_:`"<^;]}-].[#`{~}}|)(~~>--_:.}-%|[|`|{}##?^`.&!!{.?%._?^{}`#"~%<@}><~{=/(;-;~!{?>"`=}?|;`<_+,~}|}}[.`_=[&?>{}|>|#<~<}?-~]/~>?_!~_]%$#`>$`;$%<|@:`^-{@["`##`{#,]_(?`/<`^`![)"``~[%#"|`?}(^!=`|-@;:-_^#|{!{#")|_?%$([>>"`~|?|!##%`".|`=!"~#:.=._&?>{#{%"}=>;(:>(<:>:#]%#`|||`)+=/$_:%"}~/>%;"{#!#$#./#;>;>&;<=`=`|`=#|"=<~~}-{}?}`=,.!!?}{#&|{`;@}!=;~@,"<{[=!-^%{|=||#=>>?~~,}<_"/&?_#?#~"{#`_~!|[|/{||"=@|+?$">#<};+`>%{"}@|`/]!^|-*[;[=[(|%?{?}$>}:#}>!""?!&!,|/_|:)~$>}:$*.~@@{<>}/-[#{%=|>"<$"!,"-~/>(|--}.!%<#|||?!|*}.~^`-|=|,,~-_?<|."--|(~`_$&[?!#~<?}"."-(|+]?;#?_/#{)$/`$+_#!}>@|,?:?:$?||{<#?#;|.}"^[~~&{:%^&~`$$|.,`-&^/}#!*$|:!;!"}}}_(%|)|~*+"<_[:#,}}{{/|!`"}}"<""<|<}<}(>|!!}}~~|~~|%)$&&*}/_"?}!(|#_@_``}][).|`|^||%|<:@/|?|(^<![_~[{|[][=|!;<}`|("|~"~>[#[`||:|!?|_|?[![-+%%\',$^_=~(\'(?{$^_=~\'.(\'_^""\'^\'+,|/\'."-".(\'$%\'^\';{\'.\'(-:^;\'.(\'[)]@\'^\'>_<,\').\'$^_})\')))'

むむ。もう一回Rubyで実行してみましょう。

C:\> ruby final.code | ruby
$^_='_)@@[`/{#{{}]|~|*:!^?|+{||"`[=>;~`~@|._"]|!`|<<_}!}#%|@~"_~<_=:_,@<}|!`_%=_"+;?]##~{>(!.]&/`#~-&|+^@;`(&~{?/};|}&&;~,~!?$~?_~~}`}}$`?*`&>(#-_!"}<"_!`"!>/~}|<!_.~}!|"`_,&|{-+"+_@-}.]$#!`,#~>]""|`}|,~!:"~>!{-_&*~?~<)!<~`~^!<|"&"|=%~#,~;}!%!`)#|}.>:_"<^!}^,"!_~~}?+#=]`}_`~^!%`=%-"">_"`_!}|#%|"|#;)}=]`<_`<|&;~(|!=+}"_"<_:_!~^`}|/%{#/.$,|"<}!`_"~~#,({,&#(?!}"=>|}}<``}[`<[*}<<|~<|+[$]}}|"<^"`>!~}~}~_~<)_<`~`^:``)#@>$|}}$$#}/^}"[>]#,|_-"}_%?{=#&!=&|!/-~|/~()_@:$]="?}=#!`)$^//=/,$?=#_|||&{{}.[_.`<~~,!<{;)|$>>`{{%}%([]:<_/?#>~!;^=#`#|}#{;.!}^,}})[&,"`{};#{`~}~")[*);|>@~;*]_#!`|{~|/:&>}|-<<._=_`{|~|"|-^|-^<?}?)<%=%!"&"~`/]`(_~`{)|@?&:;}?%##"";:""~??`(<^?[!;"?"&#|}->;<+}}_</{<`_>%">~|!{.{#,`";"=;+?`"}__`}>`#`")<`{&>"!<!!~<;`/`]_`$#!`#}."`=/?%==%^-~}"{={{}=`{>)*^.];([%?@{;|?}~>$}>|#:/_=`<{<}~;^<<[;{||!>`#:}~/_]?<$(?`>}#%|%||;_$-[):`!,~<[__"~}~{?|<!_/}~><(<"<!]_`$}&{}#/.$:*!:,(,(.={|>!"#>;:-=;#(+~![=@:[|$}|}{}<?])^/,{$.@]]>#>`}#|/`">^?%"-!<}=<>]_#$}{"$>)>!}})%<>~`_;/|<>{$"`"#}/^/-]%>!`{/=}_?}`}#|$}_`"}^`[>$@@}/>#:-{-@|,"*&?,[$^"|@?=#~"##:|@|,%%#*-$/"*/"(]".~^}.~)~<#=!#+;!+@"*{;#!||$.@"!=|.$+@[/}({^~#}=!>@%#"?">~+-|@@#-_#;":!"?"#-#=!!?!`,#<}#=[%"<{*]|.~,!,`#}>}<:#$#`+|.!"]$;{??*:!|."`>##`*`+)`@@$.]`-+[#",#|#%+$*^#(%?+{!>!?=]#!&||:)#*~/}~_!!}&~#&##:&},$&)|"&"&&"[}<~!!~`~~`[,"("&.[}}!!""[""[+$*(+$_>{|`@_%[.`;{>?@#|:#[?"|^[{[,+<;[,^:|/,|{[|%[`&|.[,)##[[;/[%,#~|}|^#@+[/,[{"`&/|#%+]',$^_^='/[)./@^[[_%"`[#"$).%_[:_"#|]|//{>>!~[?{|`^}<^``}&~@.(#}"~}"`}-(!>>`!^}<}+-$_%`-#|,!&.%~>&[!;|#=+#;%=(?&}!&/""+]&{(`!#!|/)!/~""_<!_*;`>?{.%|=~}~_`~}/;}|.""!^`}}>_!}^~<}"}#&=&};$=#&<#{,~=<.!.|~~^<!^"%~.}#.,$=$[$%`#,$~,_<"|}`^,}}!`~!~!!`"|~~=$.#@<@(!~`|}!|<~}}""_.&|-|<!}<"|/~?`+=/}.~~<}}!^-~#-#~+$"-|<`}<`^(`!<#|-&!~}~`}*~}"|<!^!~$~?#{<]~`_}<},%!~<%$<]^;`/&}`.[!!`<<!|<`|:&``^"`^;|{`!!^~`{~<~}"="![~_.$`.["<{(];;<}^{#""{{|"="!~~,~->_~?~!{+_&`~{|`{!/=?%]=_;;#<(_!]|`#`}~>;;#==@=={-"_?"#"{%$#<`"<=`">>}`_`;__^`?%&{"{:%|(.|=--,"}{#]}?}!#|%)?}!{>^@;`}>~<^&[}$>##!|;%;;+],;_);|?}~>!%!"=%},&_?@#<$`?>$"#"}"?>!?>--&/;#+]{~|{|!>=|_:`"<^;]}-].[#`{~}}|)(~~>--_:.}-%|[|`|{}##?^`.&!!{.?%._?^{}`#"~%<@}><~{=/(;-;~!{?>"`=}?|;`<_+,~}|}}[.`_=[&?>{}|>|#<~<}?-~]/~>?_!~_]%$#`>$`;$%<|@:`^-{@["`##`{#,]_(?`/<`^`![)"``~[%#"|`?}(^!=`|-@;:-_^#|{!{#")|_?%$([>>"`~|?|!##%`".|`=!"~#:.=._&?>{#{%"}=>;(:>(<:>:#]%#`|||`)+=/$_:%"}~/>%;"{#!#$#./#;>;>&;<=`=`|`=#|"=<~~}-{}?}`=,.!!?}{#&|{`;@}!=;~@,"<{[=!-^%{|=||#=>>?~~,}<_"/&?_#?#~"{#`_~!|[|/{||"=@|+?$">#<};+`>%{"}@|`/]!^|-*[;[=[(|%?{?}$>}:#}>!""?!&!,|/_|:)~$>}:$*.~@@{<>}/-[#{%=|>"<$"!,"-~/>(|--}.!%<#|||?!|*}.~^`-|=|,,~-_?<|."--|(~`_$&[?!#~<?}"."-(|+]?;#?_/#{)$/`$+_#!}>@|,?:?:$?||{<#?#;|.}"^[~~&{:%^&~`$$|.,`-&^/}#!*$|:!;!"}}}_(%|)|~*+"<_[:#,}}{{/|!`"}}"<""<|<}<}(>|!!}}~~|~~|%)$&&*}/_"?}!(|#_@_``}][).|`|^||%|<:@/|?|(^<![_~[{|[][=|!;<}`|("|~"~>[#[`||:|!?|_|?[![-+%%',$^_=~('(?{$^_=~'.('_^""'^'+,|/'."-".('$%'^';{'.'(-:^;'.('[)]@'^'>_<,').'$^_})')))

なんかPerlっぽいプログラムが出力されましたので、Perlで実行してみましょう。

C:\> ruby final.code | ruby | perl
$^_=']^).*{`',$^_^='-,@@^_>',$^="\"\"[_=((_=\"\"+-~-~\"\")+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!\"\")[_/_]+(_+!\"\")[_]+(\"\"+!\"\")[_]+(_+{})[-~_*_]+(_+!\"\")[_/_]+(_+{})[_]+(_+!\"\")[_]][_](_[_][_]((_=-~-~\"\"+\"\",(_+!\"\")[_])+(_+!\"\")[_*_]+(_+!\"\")[_/_]+(\"\"+!\"\")[_]+(_+!\"\")[_]+(_+{}._)[_]+'\\\'\'+[\"\"+'_=\"\%\@\@\%!!-(?-;\%-=[-:=`________-|\%-#)-#!-\$)`]]]]]]]])--[!-!.-||-{|`^_^]^_^-:}--}-,_-:|`^_^]^_^-;}-]\@-\$[-#{`^_^]^_^-~!--#--)-\@}`^_^]^_^-,\%-#=-;[-\%[`^_^]^_^-~,-+!-{!-,!`^_^]^_^-:[-[#-|:-{]`^_^]^_^-`]-`,-[+-:)`^_^]^_^-!?-?\%-!=-{/`^_^]^_^--\@--?--#-~]`^_^]^_^-`[-(\$-+^-?``^_^]^_^-;^-\@:-.+-[\$`^_^]^_^-\$(-\@\%-[?-;{`^_^]^_^-\@+-[`-[`-!\$`^_^]^_^-){-!{-;{-;;`^_^]^_^-!|-+?-\%\%-|\%`^_^]^_^-#_-?!-|:--?`^_^]^_^-#{-~(-;:-\%#`^_^]^_^-]?-\@:--:-~{`^_^]^_^-+:-+:-+---(`^_^]^_^-,+-:|-)\%-~:`^_^]^_^-+~-`/-]:-}=`^_^]^_^-\@#-^_-\@,-:|`^_^]^_^-~\@-[|-\$`-],`^_^]^_^-`,-#[-\$(-[``^_^]^_^??\";',_<<_-~_,-_*~_+_,(_-~_|_<<_-~_|_)+'{',~(_*-_+_),_-~_+_|_,_*_+_-~_,-_*~_+_,(_<<_-~_)+'(_)}',_/_|_*_+_,~(_*-_+_),_<<_-~_,_/_|_*_+_,(_-~_+_-_)+'(\$){',_*_+_^_+_,-_*~_+_,~(~_-_+_),~_*_^~_*_+_,(_<<_-~_)+'(_)}'][(_+{})[_*_]+(_+{})[_]+(_+_/\"\")[_*_]+(_+{}._)[_]]('\\\\\'+_/_)+'\\\'\')())()",$^_=~('(?{$^_=~'.('_^""'^'+,|/'."-".('$%'^';{'.'(-:^;'.('[)]@'^'>_<,').'$^_})')))

どうやら、もう一度Perlで実行する必要があるみたいです。

C:\> ruby final.code | ruby | perl | perl
""[_=((_=""+-~-~"")+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!"")[_/_]+(_+!"")[_]+(""+!"")[_]+(_+{})[-~_*_]+(_+!"")[_/_]+(_+{})[_]+(_+!"")[_]][_](_[_][_]((_=-~-~""+"",(_+!"")[_])+(_+!"")[_*_]+(_+!"")[_/_]+(""+!"")[_]+(_+!"")[_]+(_+{}._)[_]+'\''+[""+'_="%@@%!!-(?-;%-=[-:=`________-|%-#)-#!-$)`]]]]]]]])--[!-!.-||-{|`^_^]^_^-:}--}-,_-:|`^_^]^_^-;}-]@-$[-#{`^_^]^_^-~!--#--)-@}`^_^]^_^-,%-#=-;[-%[`^_^]^_^-~,-+!-{!-,!`^_^]^_^-:[-[#-|:-{]`^_^]^_^-`]-`,-[+-:)`^_^]^_^-!?-?%-!=-{/`^_^]^_^--@--?--#-~]`^_^]^_^-`[-($-+^-?``^_^]^_^-;^-@:-.+-[$`^_^]^_^-$(-@%-[?-;{`^_^]^_^-@+-[`-[`-!$`^_^]^_^-){-!{-;{-;;`^_^]^_^-!|-+?-%%-|%`^_^]^_^-#_-?!-|:--?`^_^]^_^-#{-~(-;:-%#`^_^]^_^-]?-@:--:-~{`^_^]^_^-+:-+:-+---(`^_^]^_^-,+-:|-)%-~:`^_^]^_^-+~-`/-]:-}=`^_^]^_^-@#-^_-@,-:|`^_^]^_^-~@-[|-$`-],`^_^]^_^-`,-#[-$(-[``^_^]^_^??";',_<<_-~_,-_*~_+_,(_-~_|_<<_-~_|_)+'{',~(_*-_+_),_-~_+_|_,_*_+_-~_,-_*~_+_,(_<<_-~_)+'(_)}',_/_|_*_+_,~(_*-_+_),_<<_-~_,_/_|_*_+_,(_-~_+_-_)+'($){',_*_+_^_+_,-_*~_+_,~(~_-_+_),~_*_^~_*_+_,(_<<_-~_)+'(_)}'][(_+{})[_*_]+(_+{})[_]+(_+_/"")[_*_]+(_+{}._)[_]]('\\'+_/_)+'\'')())()

やっと、見慣れたJavaScriptのファイルが出力されました。jsコマンドで実行してみます。

C:\> ruby final.code | ruby | perl | perl | js
%@@%!!-(?-;%-=[-:=`________-|%-#)-#!-$)`]]]]]]]])--[!-!.-||-{|`^_^]^_^-:}--}-,_-:|`^_^]^_^-;}-]@-$[-#{`^_^]^_^-~!--#--)-@}`^_^]^_^-,%-#=-;[-%[`^_^]^_^-~,-+!-{!-,!`^_^]^_^-:[-[#-|:-{]`^_^]^_^-`]-`,-[+-:)`^_^]^_^-!?-?%-!=-{/`^_^]^_^--@--?--#-~]`^_^]^_^-`[-($-+^-?``^_^]^_^-;^-@:-.+-[$`^_^]^_^-$(-@%-[?-;{`^_^]^_^-@+-[`-[`-!$`^_^]^_^-){-!{-;{-;;`^_^]^_^-!|-+?-%%-|%`^_^]^_^-#_-?!-|:--?`^_^]^_^-#{-~(-;:-%#`^_^]^_^-]?-@:--:-~{`^_^]^_^-+:-+:-+---(`^_^]^_^-,+-:|-)%-~:`^_^]^_^-+~-`/-]:-}=`^_^]^_^-@#-^_-@,-:|`^_^]^_^-~@-[|-$`-],`^_^]^_^-`,-#[-$(-[``^_^]^_^??

怪しいファイルが出力されましたが、final.comというファイル名で保存してディスアセンブルして中身を確認してみましょう。

C:\> ruby final.code | ruby | perl | perl | js > final.com
C:\> ndisasm final.com | more
00000000  254040            and ax,0x4040
00000003  252121            and ax,0x2121
00000006  2D283F            sub ax,0x3f28
00000009  2D3B25            sub ax,0x253b
0000000C  2D3D5B            sub ax,0x5b3d
0000000F  2D3A3D            sub ax,0x3d3a
00000012  60                pushaw
00000013  5F                pop di
00000014  5F                pop di
00000015  5F                pop di
00000016  5F                pop di
00000017  5F                pop di
00000018  5F                pop di
00000019  5F                pop di
0000001A  5F                pop di
0000001B  2D7C25            sub ax,0x257c
0000001E  2D2329            sub ax,0x2923
00000021  2D2321            sub ax,0x2123
00000024  2D2429            sub ax,0x2924
00000027  60                pushaw
00000028  5D                pop bp
00000029  5D                pop bp
 :
 :

お。これはMS-DOSエミュレータ上で実行できそうですね。

C:\> ruby final.code | ruby | perl | perl | js > final.com
C:\> final.com
Merry Christmas! 80286 (^-^)/~

実行できました!

ぜひみなさんも記号プログラミングをマスターしてHappy Hackingしましょう!

メリークリスマス!