ねぎろぐ

ちくわ大明神

SECCON2016のVigenere暗号をGoogleスプレッドシートのHLOOKUPとMODで解く

タイトルまんまです。

今回のSECCONは3問しか解けず、うち2問(VoIP/Memory Analysis)はツールを正しく使うだけで解けてしまいました。
f:id:greenshallot:20161211225719p:plain

そのあたりのWriteupは他の人と大差ないと思うので、手を動かしたVigenereのWriteupだけ書いておきます。

解き方

問題文にヒントとしてWikipediaへのリンクがあり、そのとおりに解きました。
ヴィジュネル暗号 - Wikipedia

  • こんな表を作って先頭からi番目のiを求めます。
    f:id:greenshallot:20161211224953p:plain

  • ざっくりとCiをHLOOKUPで算出しておきます。
    f:id:greenshallot:20161211231902p:plain

  • 分かっているpの一部からPiを求めます。
    f:id:greenshallot:20161211232229p:plain

  • MOD関数でKiを求め、HLOOKUPで文字に直すことにより、kの一部が"VIGENER?????"であるとわかります。 f:id:greenshallot:20161211230921p:plain

  • おまけでEもつくので"VIGENERE????"と判明し、これで12文字のうち8文字が判明します。
    f:id:greenshallot:20161211233010p:plain

  • 判明した分のFlagをMOD関数で計算します。Pi=MOD(Ci-Ki+28,28)
    あとはHLOOKUPで文字に戻します。

  • これでFlagが SECCON{A????BCDEDEFG????KLMNOPQR????VWXYYZ} までわかります。

  • Flagの文字からA-Zのアルファベットが全て含まれているものと類推し、不明な4文字中2文字の"CO"まで推測した時点で"CODE"と確定し、"VIGENERECODE"でPを求めFlagゲットとなりました。
    f:id:greenshallot:20161211234216p:plain

  • Flag = SECCON{ABABABCDEDEFGHIJJKLMNOPQRSTTUVWXYYZ}

  • 実際に使ったスプレッドシートはこんな感じです。
    SECCON2016_Vigenere解 - Google スプレッドシート