MMA CTF 1st 2015に出た話
MMA主催のMMA CTF 1st 2015にscryptosとして参加しました.
チームとしては終了時点で2300pts,全体で10位,日本勢の中では1位という結果になりました.
チームメンバーのwriteup:
- MMA CTF 1st 2015 writeup - しゃろの日記 http://charo-it.hatenablog.jp/entry/2015/09/08/005012
- eshiho’s Blog - MMACTF 1st 2015 Writeup http://shiho-elliptic.tumblr.com/post/128549535889/mmactf-1st-2015-writeup
僕はチームのやるだけ担当なので100点以下のflagを9つ通しただけですが,Smart Cipher Systemの4とMoney Gameは面白かったのでwriteupを書いておきます.
write-ups?
Smart Cipher System (4)
システム自体は1~3と同じ.
いちいちWeb経由で投げるのは面倒なので適当にシェルスクリプトを書いて動かしていた:
|
|
しばらく実験しながら適当に考察していた.
長さに応じて順番が定まっているらしく,45文字の適当な文字列を突っ込んでポチポチ対応表を作って対応させた.
順番さえ戻せれば何も考えずに連続する2文字のテーブルを作って暗号文と対応させるだけでflagが出る.
table.py:
|
|
table:
|
|
solve.py:
|
|
MMA{f9cf7a3ddd5710e85116814fef01c907f4df35ce}
配点低すぎない…?
Money Game
Reverse, PPC, Pwnということで,不穏なジャンルだなあと思いながら解析していた.しゃろプロがゲームクリア後の名前を入力する部分でのfsbの脆弱性を見つけてくれた.
ゲーム部分をPPCとして処理する必要があるらしく,また乱数のseed(srand)はtime(NULL)から引いていたのでこれも利用して競プロのプロであるところのとさかプロにお願いしてソルバを書いてもらった.
入出力(通信)部分などは僕が書いて,そこからソルバを呼び出して返すようにした.
|
|
特にローカルとの時差はないようなのでそのままローカルの時間で動かすだけで済んだが,精度が良くないようで20回ぐらい実行しないとクリアできなかった.
flag2のfsbのpayloadはしゃろプロが事前に書いてくれていたのでそれを入れるだけで取れた.(filenameの”flag1”を”flag2”に書き換えるだけ)
flag1: MMA{YouAreRichPerson}
flag2: MMA{FLAG_F0rmatStringAttack!}
flag2はボーナス問題でした
解けなかった問題
regrettable ecc
やるだけ,終わってから問題見たらすぐ解けたので本当につらい
login as admin!(2)
memcachedを使っているのはわかっていたがinjectionできるのを知らなかった…
perfect matching
PPC部分はとさかプロにソルバをお願いしていて,最初の方のケースではいい感じに動いていたが,問題の生成法則だとgenerator2あたりから解がないケースが出てきてしまう.ずっと回していたがcase 21がまでが限界だった.
負数のindexを突っ込むことで同じノードが2回使えるということに気付けず終了(本当にすいません)
alicegame
ElGamal暗号.m=1,r=1みたいなクエリを投げることで公開鍵のパラメータ(p, g, h)は特定できる(ここまではCTF中に書いていた).
p-1の素因数がある程度小さいとPohlig-Hellman algorithmなどで離散対数(h=g^x mod p
なるx = 秘密鍵)が高速に求まる.
pは途中から公開されたコードを読むとCrypto.Util.number.getPrime(201)で生成していることがわかる.何回か試行すれば上の条件を満たすpが引けるのでそのまま秘密鍵xを出して終了.
書くだけ(まだ解けてない) 時間さえ掛ければ解けていた気がするので悔しい…. 学校休めばよかった…
最後に
問題の質もとても良く,本当に楽しいCTFでした.精進します