先月まで「DODAからの挑戦状」という企画でハッキング問題を掲載しておりました。(現在、企画は終了しており、こちらに解答を掲載しています。)

DODAChallengeFromWired

初級、中級、上級と全部で3部構成の問題となっており、最後の上級問題の正答率を1%にしてほしいという要望をいただいておりました。過去のCTF参戦の経験から考えても難易度の調整は難しいものでして、「DODAからの挑戦状」の裏で、個人的に「1%への挑戦」がありました。

最終的には、初級問題の正答者数(アクセス数)が8232でした。これはユニークを取っていない数字なのですが、ユニークを取ると半分くらいの4000名くらいになるでしょうか。
4000名の1%だと40名になりますが、実際に上級問題を正解した方は32名でしたので、難易度の設定はうまくいったと思います。

さて、この挑戦状は普段からデコンパイルに慣れ親しんでいる方には退屈に思われるかもしれないので、上級問題の後に超上級問題として追加で一問隠しておきました。

ここではその解法を紹介します。
ヒントにも記載しましたが、注目すべきはjarファイルを解凍した際のタイムスタンプです。array2〜array6は同じタイムスタンプなのに対して、arrayだけがタイムスタンプが遅い時刻になっています。この段階でarrayに着目して考えていきます。
ファイルを隠す、という話になったときにまず出てくるのはステガノグラフィー(電子透かし)でしょう。さらにステガノグラフィーの説明でたいてい一番最初に出てくるのがLSB(Least Significant Bit)に情報を隠す方法です。図で説明するとこんな感じになります。

LSB

Pythonを使ってデータを取り出すのはこんな感じでできます。
import Image

im = Image.open('hollywood')

width,height = im.size
secretdata = ''
for y in range(height):
  for x in range(width):
    (r,g,b) = im.getpixel((x,y))
    secretdata += str(r&1) + str(g&1) + str(b&1)

print "".join([chr(int(secretdata[i:i+8],2)) for i in range(0,len(secretdata),8)])


一般的なステガノグラフィーですので、一般のツール(画像はStegSolveの例)を使ってデータを取り出すこともできます。
StegSolve

隠し問題まで解けていたという方は、ぜひ私までご連絡ください。