CTFするぞ

CTFを勉強してて学んだことをまとめていきたい

SECCON 2018 国内決勝に参加しました

本日12月23日(日)に10:00から16:00までSECCONの国内決勝がありました. 高専セキュリティコンテストの優勝で決勝に参加できたので,insecureとして参加しました. 高専セキュリティコンテストはとても簡単だったので,予選やCEDECを突破してきたチームの中で戦うのは緊張しました. 結果としては15チーム中5位で,2年前に参加したときよりは良かったと思っています.

問題は「松島」,「天橋立」,「宮島」の3つのサーバーで,私は基本的に宮島に粘着しましたが,途中で松島も1つ解きました. Defense Flagを取ってくるスクリプトをふるつき殿が書いてくれて,かなり便利でした.

宮島

問題で指定された関数をIntel x64の機械語で書いて送るとフラグが貰えます. 30分ごとに問題が変わるので全部解ければ12個のAttack Flagがゲットできるおいしい問題です. 次のような関数が出題されました.(この順番だったかは確かではありません.)

  • 引数に1を足して返す
  • 引数が奇数なら1を返し,偶数なら0を返す
  • 引数2つを加算する
  • 引数2つを乗算する
  • 引数2つを除算して商を返す
  • 引数2つを除算して剰余を返す
  • 引数5つの値を加算する
  • 引数2つのポインタの中身を入れ替える
  • 引数の累乗(指数は引数で指定)を求める
  • 引数として渡される配列の平均を求める
  • 引数のバッファに"hello world"を格納する
  • 引数として渡される文字列を鍵でXORする

機械語の長さには制限がありますが,十分に大きいので全く問題にはなりません. また,一番短い機械語を書いたチームが防御点を貰えます. 何個かの問題は最短を書いたのですが,他のチームが先に同じ長さのコードを上げていたので防御点は得られませんでした. 処理自体は難しくないのでコードを短くする頭の体操のような問題でした.

最初の方はpwn問だと思っていたので,Reverse Shellの要領でlsした結果を自分のマシンに送るようなコードを制限字数内に詰め込んで投げましたが,残念ながら繋がりませんでした.たぶんdockerか何かで動かしていたんだと思います.

あと最短コード書いた最初の1チームが得点全部持っていくのがつらかったです. 最後の方に自動でコード投げるようにしたのですが他のチームに先に取られました. 問題自体は楽しかったですが,せっかく書いたexploitが動かなかったのが残念です.

供養: gist.github.com

松島

ポーカーでフルハウスなら100ptのフラグが,フォーカード以上なら300ptのフラグが貰えます. フルハウスはyoshiking殿がすぐに手動で出してくれました.その才能をラスベガスで活かしなさい. フォーカードが出ないとのことなので,私は宮島の30分ごとの問題の合間を縫って乱数生成するプログラムを解析しました. カードをシャッフルするプログラムは実行するとデッキに10枚カードを用意してくれます. Web上で表示されているのはデッキの最初の5枚で,カードを交換すると残りの5枚から順に選ばれます. シャッフルプログラムを解析したところ,カードを並べた後スワップしたり面倒な処理をしていました. randでスワップするインデックスを決めていたのですが,srandにtime()-定数を渡しているので予想が可能です. ふるつき殿がtime関数をLD_PRELOADとかfaketimeなるライブラリで上書きする案を出してくれたのですが,「案外フォーカード出せるのでは?」と思ったのでシャッフルプログラムを呼び出して結果からフォーカードが可能かをpythonに判断させました. pythonがOKを出した時間でthrust殿がゲーム画面をロードし,いらないカードを交換したらフォーカードが出ました. フォーカードが出るとページ遷移し,Attack Flagが表示されました. 防御点はそのページに用意されたフォームにDefense Flag書き込むだけでした. そのためフォーカードを早く出した人が防御点をたくさん貰える形でした. 作問者の方に話を聞くと,本当はフォーカード出る確率がもっと低いつもりだったようで,乱数生成をちゃんと解析したチームは少なかったみたいです. シャッフルアルゴリズムもカジノ界隈では知られている有名なものだそうです.

最後に

今年はDefense Pointも取れたし3つしか問題なかったし簡単だった気がします. (2年前に出た国際と合同の決勝が難しすぎたのかもしれないですが.) 予選を勝ち抜いた強豪の中,思ったよりまともに戦えたのが嬉しかったです. 来年から東工大で1人なのでCTFできるチームとかあるか分からないですが,参加できたらまた参加したいです. ところでセキュリティっぽい問題無かったんですが......セキュリティはいづこへ?