全部入り記号Polyglotでメリークリスマス!
今日でいよいよ最終日になりました。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
逆アセンブルするとわかりますね。
最終問題
さて、読者のみなさんに向けて最後に問題です。
以下のファイルはどの言語で書かれているプログラムでしょうか?
正解
まず、$><<が最初に出てきていますので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しましょう!
メリークリスマス!