Monthly Archives: 9月 2015

TrendMicro CTFのオンライン予選をちょっとだけ解いた

実はこの土日にはISUCON5と同時にTrendMicro CTFのオンライン予選もやっていました。

こちらにもチーム竹田氏の以下の四人でメンバー登録して参加していました。

が、きひろちゃん以外はISUCONの方で体力をもっていかれていてあまり参加できなかったのが申し訳なかったです…きひろちゃんごめん…

わたしは、3問着手して、2問だけ答え出しました。

Click on the Different Color

ブラウザでアクセスすると、箱が幾つが含まれる画像が表示される。一箇所だけ違う色のがあるのでクリックすると次に進む。というページでした。最近SNSでも見かけたやつですね。

手でやっていては埒があかないので、Pythonで自動化していくと、最後にフラグが返ってきました。

下の動画を見るとおもしろいですが、最後の方は小さくて到底人間にはクリックできません笑

なので、答えは TMCTF{U must have R0807 3Y3s!} (You must have robot eyes!) でした!

Captcha

こちらはログインするとCaptchaが出てきて、連続で500回正解すると良い感じ。こちらも手でやっていては埒があかないので、Pythonで自動化しました。

画像からノイズを除去して、二値化。それからtesseract-ocrで文字列にして、簡単なチェックに通った場合のみ送信することで自動化できました。

captcha

ところが、大文字小文字や、数字の0とアルファベットのOを誤認識するなど、一部の文字を含む場合にはスキップするようにすると全然すすまなくて、学習させないとだめかなぁと思った時に、これはもしや、と、画像ファイルにアクセスしないようにして同じ答えを投げ続けるとどんどん点数が上がるじゃないですか!

ということで、脆弱性のあるCaptchaでした。というオチです。TMCTF{217dae3fd34cee799658d4552e37827f}

つまり、今年のSECCON決勝戦のこれといっしょですね!
OCRじゃなくて人間が学習するべきでした…

CAPTCHA ノイズ除去

CAPTCHA ノイズ除去

Calculate it

TCPで接続すると、次から次に四則演算の問題が出題される感じ。Pythonから接続してevalしたらOK。

だと思ってたのですが、途中からローマ数字や、英語表記とか出てきて眠気に負けて断念。
ローマ数字はネットで変換プログラムを見つけてきて対応したのですが、英語表記は次のようなのもでてきてパースが大変そうだったのであきらめました。

7 * 10 – 30 1 THOUSAND 2 HUNDRED 30 4 + 50 – 3 * 7 HUNDRED 20 5

これは後できひろちゃんが解きました。

まとめ

本当は9月に行われる予定だったのですが、問題サーバから問題が漏れた?ようで、一ヶ月延期になっちゃって…
ISUCONとかぶったので本腰を入れて解くことができなかったのが残念です。

SECCON運営メンバが作問してるだけあって、面白い問題がおおかったので本当はちゃんとときたかったです。
このチームでちゃんと解いてたら本戦いけたかな…来年に期待。

ISUCON5オンライン予選に参加してきた

「お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル、それがISUCONです。過去の実績も所属している会社も全く関係ない、結果が全てのガチンコバトルです。」(公式説明)であるISUCON5のオンライン予選に参加してきました。

メンバーは、CTFの時のメンバーと同じく、チーム竹田氏の、

で参加しました。3人参加が上限なので、いつものメンバのきひろちゃん (@aki33524) も含めた4人のうちから3人で出場しました。

ISUCONは Iikanjini Speed Up Contest の略で、Webアプリケーションがデプロイされたイメージを渡されて、その上で何をしてもいいからとにかくパフォーマンスを上げることが競技内容です。

オンライン予選

今回はイメージと競技マニュアルをもらった時点で次のことがわかっていました。

  • Ubuntu 15.04
  • フロントはNginx
  • アプリケーションは次の言語で実装されてる (どれか好きに選んでもいいし、書き直してもいい)
    • Ruby
    • Perl
    • Python
    • PHP
    • Java (正常に動作しない)
    • GoLang (正常に動作しない)
    • Scala (正常に動作しない)
  • DBはMySQL
  • インスタンスはGoogle Cloud Platformのn1-highcpu-4 (vCPU x 4、メモリ 3.6 GB)

今回パフォーマンスを上げるアプリケーションはこちら!

ISUxi

その名も ISUxi!足跡機能もあって、どこかでみたことあるアプリケーションです。
これが超絶重い…特にトップページなんかかなり待たされます…これを最適化してくわけですね。

大まかにやったことは以下のような感じです。

  • 設定関係
    • gunicornをUNIXソケットに
    • MySQLへの接続をUNIXソケットに
    • 静的ファイルはNginxで提供
    • ファイルディスクリプタ数の上限変更
    • 各種プロセス数の調整
    • MySQLの一時ディレクトリをRAMディスクに移動
    • MySQLの各種パラメータ調整
  • アプリケーション関係
    • ユーザーテーブルを全てオンメモリで持つ (変更が無く、5000レコードしかなかったため)
    • 各種SQLの最適化
      • ロジックで判定しているところをSQLで判定させるとか
      • 1レコードずつ取得するようなことが無いように
      • あしあとテーブルのスキーマ変更
      • etc…

ISUCON4は結構設定まわりのチューニングだけで本戦出場できる感じだったのに対し、今回はアプリケーションの規模も大きく、実装の方にも手を出さないと本戦出場できなさそうな感じになってました。

途中はMySQLのクエリログを全て取得して、スコアのために測定される1分間でどこのクエリが時間を占めているのかを調査してそこから潰していきました。

特にトップページがLIMIT 1000とかのSQLを3回も吐いてるのでかなり重く、トップページを改善するだけで1万点以上上がったのではないかと思います。

あとはあしあとテーブル。記事にアクセスがあるたびにレコードが追加されるのですが、これを日付、アクセスユーザー毎にGROUP BYしてSELECTするのでとっても重いのです…
こちらは (ユーザーIDアクセスユーザーID日付、最終アクセス日時) の形にスキーマを変更し、あしあとは INSERT…ON DUPLICATE KEY UPDATEにすることで、 SELECT時のパフォーマンスをかなり改善することに成功しました。

こんな感じで進めていくことで、最初はもたついていたISUxiもとっても快適に動作するようになり、スコアも16000点以上出すことができました。

最後に再起動テストをしたのですが、なぜかスコアが下がってしまって、最終スコアは14795点になってしまったのですが、無事263チーム中12位で予選通過することができました!

たぶんPython+MySQLのデフォルト構成のままではこれぐらいのスコアが上限なきがしますので、かなり健闘した方だと自負しています。

ほんとはRedisにデータを載せ替えたり、もっとオンメモリで処理したかったのですが、それは本戦で頑張ることにします♪

コードはGitで管理していて、ブランチ切って作業して、テストケース通ったらmasterにマージってしていたのですが、最後のほうはもう直接masterにマージしちゃってますね笑 (コミットユーザは合ってません)

network

おまけ (準備編)

去年の傾向から、MySQLを使うのだろうなとは思っていたので、事前に別のインスタンスでPHPMyAdminを用意してました。
これがデータ構造を把握したり、ちょっとSQLを試したりするのに超便利で、準備しておいてよかったものNo.1かもと思ってます。