Puzzle:[HackThisSite! 攻略 Permanent Programing編]

プログラムを組んで、制限時間内に与えられた問題を解く。 言語は何を使ってもよい。

Challenge 1

並べ替えられた文字列を辞書から探す問題。一文字ずつ対応を取って比較すればいい。

与えられた文字列を、そのままscramble.txtにコピー&ペーストし、Rubyで解いた。

Challenge 2

次は画像処理の問題。白い点の位置がASCII-codeをあらわしていて、さらに、 スペースで区切られたモールス信号に符号化されている。

"a test" => ".- / - . ... -"

RubyでPNG画像を扱うのは面倒なので、C#で解いた。

画像を(0,0)から調べる。白点が見つかったら、最後に見つかった位置から進んだ距離を計算し、文字に直す。 そして、最後に白点が見つかった位置を更新する。

モールス信号からの変換は、ハッシュテーブルに対応を書いただけ。

Challenge 3

PHPで実装された暗号化アルゴリズムを参考に、与えられた数列を復号化する問題。

基本方針は総当り。ただ、何について総当りを試すのか、どこで枝刈りするかを考える。

まず、与えられたアルゴリズムから復号化を考える。

  1. totalをpasswordのMD5から計算する
  2. 暗号の始めから最後まで
    1. 復号文字を計算する
    2. totalを更新する
  3. 復号文字列を表示する

つまり、第i番目の文字を復号化するには、

が必要。

intMD5Totalの初期値はPasswordのハッシュで決まり、残りも順次決まっていくのでPasswordのMD5ハッシュが決まれば復号化できる。

けれども、32文字総当りでは15の32乗で、43143988327398919500410556793212890625通り。多いよ(´・ω・`)

crosstotalは、与えられたMD5ハッシュの各文字を16進数として評価して全て足したもの だから、0から480(0x0F*32=480)の値をとる。intMD5Totalの初期値はPasswordのMD5ハッ シュ値の和だから、この初期値を決めれば絞り込むことができる。

次に、平文について調べてみる。平文には、既に文字が決まっている位置がいくつかある。

決まっていない位置を * であらわす
***-***-OEM-***-1.1\n

という20文字が繰り返されている。

決まっていない部分は、サンプルに記号も小文字も含まれていないから、おそらく大文字と数字だけなのだろう。暗号文と平文の文字数と位置は対応があるから、復号化した文字をチェックすればさらに絞り込むことができる。

また、とりあえず始めの32文字分でPasswordのMD5を決め、復号化した結果を表示させる。 そうして表示させた結果を人が見て判断したほうが、おそらく早いだろう。

ということで、intMD5Totalの値を変化させて、順次PasswordのMD5ハッシュを決めていくことにする。

さらに、$intMD5Totalの初期値は、暗号文の一文字目の値で範囲を絞れる。暗号文の一文字目がE、PasswordのMD5の一文字目をP、もとの文字をCとすると、

$intMD5Total = C + P - E

'0' = 48 <= C <= 'Z' = 90
0 <= P <= 15

だから、
48 - E <= $intMD5Total <= 105 - E

きっと他にも条件があるのだろうな。

今回は一度Rubyで組んで、速度の問題からC&C++に移した。

Challenge 4

XMLファイルを解析して、絵を描く問題。

XMLの解析はRubyのREXMLで行い、絵はRubyからPostScriptを書き出した。

XMLには、線と円弧の情報が含まれている。線なら、色、始点のXY座標と終点のXY座標。 円弧なら、色、中心のXY座標、半径、描き始める角度と描く角度。単位はラジアンではなく、"度"。

Challenge 5

壊れたbzip2ファイルを修復する問題。(未回答)

WindowsのFTPを使って、ASCII-modeでダウンロードしたために、LFがCRLFへ置き換わってしまったのだろう。

bz2ファイルに含まれるCRLFを総当りでLFに変換して、それぞれ正しいかどうか試せばよいはず。

Challenge 6

パターン認識の問題。(未回答)

文字を表す座標の列と、それをjavascriptで描いたページが表示される。 これを処理して、書いてある文字を読み取れということらしい。

戻る

2007-04-08 公開 2007-08-31 更新 Copyright(C) 2007 tar0t All rights reserved.