ICFP2007 (17) help-palindromesの修復の続きです。
crackKeyAndPrintという関数にpurchase codeを渡してやると暗号解読して鍵を表示してくれます。purchase codeはint24の0(III・・・IIP)を暗号化したものなので、端から順に試していけば鍵が分かるという仕組みです。purchase codeは3つ分かっています。
一つ目はhelp-error-correcting-codes_purchase_codeを解読したものです。
やたら時間がかかります。たった2桁を解読するのに56122457回(5612万2457回)の繰り返しで157.562秒かかりました。
2つ目はvmu-code_purchase_codeです。これの鍵はICFP2007 (10) gene tableの修復で見つけたOPEです。答えは分かっていますが実行してみます。
これは恐ろしく時間がかかりました。繰り返しが1965822242回(19億6582万2242回)で実行時間は5379.296秒です。ほぼ1時間半です。
最後のhelp-beautiful-numbers_purchase_codeはICFP2007 (9) mainの逆アセンブルの結果からすると8桁なので調べるのは無謀っぽいのでやっていません。暗号アルゴリズムがRC4と分かっているのでgoodVibrationsを00-ffと変える方が速そうです。
ところで、crackKeyAndPrint関数の最初では背景と同じ黒い文字で「Harry Potter and the Orion Slave Girls. Out *now* on Arcturus III.」というメッセージを出力しています。これもまた新たな謎です。どこかに使う鍵なのかもしれません。ハリーポッターシリーズの最新作のタイトルでしょうか。Orion Slave Girlsというのはエンタープライズのオリオンシンジゲートと何か関係があったりするのでしょうか?
crackKeyAndPrintを動かすためのprefixです。
スタックにパラメータを積んでからinitをcallしています。initの戻り番地としてcrackKeyAndPrint、crackKeyAndPrintの戻り番地としてterminateを積んでいます。戻り番地をどんどん積んでおくことでサブルーチンの連続callを一回のcallで済ませることができます。
crackKeyAndPrintという関数にpurchase codeを渡してやると暗号解読して鍵を表示してくれます。purchase codeはint24の0(III・・・IIP)を暗号化したものなので、端から順に試していけば鍵が分かるという仕組みです。purchase codeは3つ分かっています。
一つ目はhelp-error-correcting-codes_purchase_codeを解読したものです。
やたら時間がかかります。たった2桁を解読するのに56122457回(5612万2457回)の繰り返しで157.562秒かかりました。
2つ目はvmu-code_purchase_codeです。これの鍵はICFP2007 (10) gene tableの修復で見つけたOPEです。答えは分かっていますが実行してみます。
これは恐ろしく時間がかかりました。繰り返しが1965822242回(19億6582万2242回)で実行時間は5379.296秒です。ほぼ1時間半です。
最後のhelp-beautiful-numbers_purchase_codeはICFP2007 (9) mainの逆アセンブルの結果からすると8桁なので調べるのは無謀っぽいのでやっていません。暗号アルゴリズムがRC4と分かっているのでgoodVibrationsを00-ffと変える方が速そうです。
ところで、crackKeyAndPrint関数の最初では背景と同じ黒い文字で「Harry Potter and the Orion Slave Girls. Out *now* on Arcturus III.」というメッセージを出力しています。これもまた新たな謎です。どこかに使う鍵なのかもしれません。ハリーポッターシリーズの最新作のタイトルでしょうか。Orion Slave Girlsというのはエンタープライズのオリオンシンジゲートと何か関係があったりするのでしょうか?
crackKeyAndPrintを動かすためのprefixです。
// パラメータをスタックに積む // (!36f1c(!18)!6f5c6e) IIPIPIICCCIIICCCCICCICCIIIIIPIIPIPIIICCPIICIPICCCICCIIICCCICICCCCICCPIICIIC // #1#0 IPPCPIPPPIIC // サブルーチンコール(init) // !352f(!23ca0e(!a0e)!4ec185) IPCCCCICIICICICCPIIPIPICCCIIIIICICIICCCCIIICPIIPIPICCCIIIIICICPIIC IPCICIIIICCIIIIICCICCCIICPIICIIC // #0#1 IPPPIPPCP // CIICICCIIICICIICIICCICCP crackKeyAndPrint番地 // ICCICIIIICCICIIIIIIIIIIP 同サイズ // CCCCIIIIICCCIICIICIIICIP terminate番地 // ICICIIICCIIIIIIIIIIIIIIP 同サイズ FCCFCFFCCCFCFCCFCCFFCFFIC CFFCFCCCCFFCFCCCCCCCCCCIC FFFFCCCCCFFFCCFCCFCCCFCIC CFCFCCCFFCCCCCCCCCCCCCCIC IIC
スタックにパラメータを積んでからinitをcallしています。initの戻り番地としてcrackKeyAndPrint、crackKeyAndPrintの戻り番地としてterminateを積んでいます。戻り番地をどんどん積んでおくことでサブルーチンの連続callを一回のcallで済ませることができます。