Theories of Pleiades

技術の話とかイベントに行った話とか思ったこととか

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カーネルを読まされたりはしますが普通に面白いし,何もわからなくても手を動かすことで学べることはたくさんあるので良い本だと思います。おすすめです。


部活のチームで出たのに一人で解いてしまいました。

まあメンバーみんなガチ初心者だったので仕方ないかなと思っています。チーム全体としてもぼく個人としてももっと勉強しないとな〜