SECCON Beginners CTF 2019 Write-up
tl; dr
- チームconbuで部活のCTF班の後輩たちと出ました
- チーム順位180位,得点数510pt
- 個人順位190位,得点数510pt
- Web解けないのマジでWeb屋やめろ
Web - [warmup] Ramen
提示されたWebサイトの下の方にGETリクエストを送ってるフォームがある。
SQLを発行しているっぽいのでa' 1 = 1 --
とか入れると全部出てくるのでSQLiが効くっぽい。
これ以上何もわからんかった。Web屋やめま〜す
Web - katsudon
店舗一覧に
BAhJIhByZWl3YWhhbnRlbgY6BkVU--bc5614afcef948624ebc137432c2dcdc624111b6 BAhJIhNoZWlzZWlzaG9rdWRvdQY6BkVU--f9aa81191fb073fb87bfa71b20c02bf3a30d1b10 BAhJIhRyZXN0YXVyYW50c2hvd2EGOgZFVA==--a78497e11151cffc45af945a1a243138b6084140
の3つのシリアルコードがある。
問題文で提示されていたコードにRails.application.message_verifier
とあり,Railsの標準機能っぽいので調べてみると,文字列をbase64でエンコードしたものとsha1でハッシュしたものを--
でつないで出力したりするらしい。
実際に--
の前をbase64でデコードしてみるとreiwahanten
とかheiseishokudou
とかが出てきます。
フラグはBAhJIiVjdGY0YntLMzNQX1kwVVJfNTNDUjM3X0szWV9CNDUzfQY6BkVU--0def7fcd357f759fe8da819edd081a3a73b6052a
として与えられていたので,これも同じようにbase64でデコードすると
ctf4b{K33P_Y0UR_53CR37_K3Y_B453}
Reversing - [warmup] Seccompare
圧縮ファイルが与えられるので解凍する。
2つファイルが出てくるが片方はMacOSの何かっぽいので無視して実行ファイルをltrace
してみる。
ctf4b{5tr1ngs_1s_n0t_en0ugh}
Reversing - leakage
圧縮ファイルを解凍して実行ファイルを動かしてみる。
何もわからんのでgdbで動かしながらいろいろ探ってみると,まずstrlen
の結果が34であるかどうかみたいなところを見ているので,フラグは34文字っぽい。
適当な34文字の文字列を与えて実行してみると,どうもis_correct
という関数内でループさせながら1文字ずつASCIIコードと比較してるっぽい。
convert
関数がASCIIコードを吐いてるっぽいができれば読みたくないのでとりあえずブレークポイントを貼って,レジスタの中身を見てみると,この後のcmp %al,-0x5(%rbp)
でn文字目とASCIIコードを照合していることがわかる。
あとは根気よく1文字ずつ照合しながらgdbで処理を追ってみると答えが出てくる。
ctf4b{le4k1ng_th3_f1ag_0ne_by_0ne}
Crypto - [warmup] So Tired
圧縮ファイルを解凍するとencrypted.txtが出てくる。やたら長いなと思いながら末尾を見てみると==
とか付いてるのでどうもbase64っぽい。
$ base64 -d encrypted.txt > decoded $ file decoded
としてみるとzlib compressed fileと言われたので,pythonで以下のようにファイルを解凍するコードを書いた。
import zlib import_data = open("decoded", "rb").read() decompress_data = zlib.decompress(import_data) output = open("output", "wb") output.write(decompress_data)
これを実行すると,出てきたoutput
ファイルはまたbase64でエンコードされているっぽい。
一瞬脳味噌がバグったけど冷静にdiff encrypted.txt output
してみると出力があるので,違うものになってるっぽい。多分何度も何度も圧縮してはエンコードしてを繰り返してる。
#!/bin/sh while [ TRUE ] do python ../zlibdec.py base64 -d output > decoded done
とか書いてエラーが出たら手動で止める脳筋プレイをしました。output
を見てみると,
ctf4b{very_l0ng_l0ng_BASE64_3nc0ding}
終わり。
Misc - [warmup] Welcome
言われた通りにやるだけ。フラグは忘れました。
Misc - containers
与えられたファイルはfile
コマンドでは判別不可能。hexdump
で中を見てみると,PNG
とかFILE X
とかが続いているので,複数のPNGファイルが一つのファイルとしてまとめられているっぽい。
圧縮とかされてたら完全にわからん終わりと思ったけど一番下にはpythonのスクリプトがべたーと貼ってあるのでそういう感じではなさそう。
脳味噌ゼロなのでvimを使ってひとつひとつファイルを取り出してみると,37個のpngファイルに1文字ずつアルファベットが書かれている。順番にctf4b{
と始まっていたがその後は全部謎の16進数っぽい。
Pythonのスクリプトに入れて動かしてみてもwrongとか言われちゃうし何もわからん。
総評
今まで出たCTFの大会では一番たくさん解けた(今までが解けなさすぎたので)。
pwnとか何百回やっても解ける気しないし勉強不足です。
余談ですが,この前日・前々日に「ハロー、『Hello, world』」という本を読んでgdbの使い方に慣れたり知らないアセンブリの記法を勉強したりしてました。
唐突にLinuxカーネルを読まされたりはしますが普通に面白いし,何もわからなくても手を動かすことで学べることはたくさんあるので良い本だと思います。おすすめです。
部活のチームで出たのに一人で解いてしまいました。
まあメンバーみんなガチ初心者だったので仕方ないかなと思っています。チーム全体としてもぼく個人としてももっと勉強しないとな〜