この記事は,SLP KBIT Advent Calendar 2017 の10日目の記事です。
さて、今回はSECCON 2017 Online CTF 予選に参加してみた感想とちょっとしたWrite-upをお届けします。
完全に初心者ですので、所々間違えてるかもしれないのでコメントで教えてもらえるとありがたいです。
CTFとは?
SECCONについて説明する前に、CTFについて説明します。
CTFとはCapture The Flagの略であり、簡単に言うと与えられた問題から特定の文字列(Flag)を見つけ出すゲーム(?)です。
問題は様々あり、バイナリ解析から暗号の復号化、Webの攻撃まであります。
SECCONとは?
SECCONはセキュリティーコンテストのことであり、コンピューターのハッキング技術を競う全国大会です。
まあ、CTFの大きな大会ですね。あとは、ググって()
参加した経緯
僕はSECCON自体は知っていましたが、参加したことは今までありませんでした。
今回はちょうどアドベントカレンダーを書く日と見事に被っていたのと、サークルで出ようとしている人が居たので一緒に参加することにしました。
チーム名はKBJRで、メンバーはB1が3人、B2が5人という大所帯で参加しました。
結果
全部で9問解いて、合計点数が1200点でした。
ランキングでは1029チーム出ていることになっていて、184位という結果になりました。
初めて出た割にはいい結果だと思います。
ちなみに僕が7問、チームメンバーのヒデホヒ君が2問解きました。
あれ?8人で出場したはずなんだけど…
Write-upみたいなもの
自分が解いた問題だけ軽く説明します。()の数字は点数です。
解いた順番で書いてあります。
点数が100と200しかないってことは簡単な問題しか解けてないってことです。
Run me!(100)
以下のようなPythonのコードが与えられて実行しろって問題でした。
import sys
sys.setrecursionlimit(99999)
def f(n):
return n if n < 2 else f(n-2) + f(n-1)
print "SECCON{" + str(f(11011))[:32] + "}"
プログラムをちょっと書いたことある人なら分かるのではないでしょうか?
完全にフィボナッチ数を求めるプログラムです。
ただ、このまま走らせると再帰が多すぎてプログラムが止まります。
なので、フィボナッチ数を求める処理を変更するのですが、僕は面倒くさがってググりました。
ちなみにSECCONでは答えに繋がるようなことを載っけたりしない限りはネットの使用は自由みたいです。
以下の記事からコードを拝借しました。
フィボナッチ数列の計算の高速化(Python版) – Qiita
定義は、一緒です。
python
# 通常版
def fib1(n):
if n <= 1:
return n
…
f(n)をこちらに載っているコードに差し替えると見事動きました。
SHA-1 is dead(100)
特定のアップロードページに2つのファイルを投げて、条件に当てはまっていればフラグを貰えるという問題でした。
条件は以下の通り
- file1 != file2
- SHA1(file1) == SHA1(file2)
- SHA256(file1) <> SHA256(file2)
- 2017KiB < sizeof(file1) < 2018KiB
- 2017KiB < sizeof(file2) < 2018KiB
これはGoogleがSHA-1の衝突を発見したことを知っていたので、解けました。
まず、ネット上にすでにあるSHA-1が衝突しているPDF2つをダウンロードします。
僕はこちらのGitHubリポジトリからもらいました。
73spica/sha1-collision
ですが、このPDFのままだと4と5のサイズ条件を満たすことが出来ません。
そのために僕は足りないサイズを0埋めするという方法を行いました。
あまり良い方法ではなさそうなのですが、方法としてはddを使って足りないサイズの空ファイルを作成し、copyコマンドでpdfの後ろにくっつけるといった感じです。
で、ここで面白いのが僕はWindowsで作業をしていたので、ddをわざわざ仮想マシンのubuntuで走らせて、そのファイルを共有フォルダーに突っ込んでWindows側でcopyコマンドを実行するという訳の分からない作業をしました。
何回かサイズをミスったのですが、最終的にはきちんと通ってフラグが表示されました。
後から気づいたのですが、WSLが入ってるのだからそれを使えばよかったです。
Log search(100)
ログが表示されるページがあり、そこにある検索ボックスを使ってファイルを探し出すって感じの問題です。
ログには時間、メソッド(GETとかPOSTとか)、リクエスト、レスポンスが表示されます。
これに関しては、実はたまたま発見しました。
ログに/flag-****************.txt(*は適当な文字列)がたまにありまして、それのどれかが正解のファイルっぽい感じになっています。
正解かどうかはレスポンスを確認します。ここが404なら存在しない、200なら存在するってことです。
で、適当にflagって検索を行ってるとたまたまレスポンスが200のファイルが出てきたって感じです。
そのファイルにアクセスするとフラグが表示されました。
putchar music(100)
以下のようなワンライナーC言語コードを投げられて、この映画のタイトルは何かを聞かれる問題でした。
main(t,i,j){unsigned char p[]="###<f_YM\204g_YM\204g_Y_H #<f_YM\204g_YM\204g_Y_H #+-?[WKAMYJ/7 #+-?[WKgH #+-?[WKAMYJ/7hk\206\203tk\\YJAfkkk";for(i=0;t=1;i=(i+1)%(sizeof(p)-1)){double x=pow(1.05946309435931,p[i]/6+13);for(j=1+p[i]%6;t++%(8192/j);)putchar(t>>5|(int)(t*x));}}
これにヘッダーファイルをちゃんと追加して動かすと、ビープ音を使って何か音が鳴ります。
多分、この音を聞いてその音楽に合った映画のタイトルを答えるのでしょうけど、さっぱり分からない。
で、昔SECCONがSTAR WARSっぽい動画でQRコードを作成させる問題を出していたことを思い出しました。
SECCON 2015 Online CTF writeup SECCON WARS 2015 : CTF日本語サイト
「もしかして、もしかするかも?」と思ってSTAR_WARSと入力したところ、見事正解しました。
勘って役に立つんですね()
Thank you for playing!(100)
プレゼント問題です。問題文にフラグが書いてあるので、コピペするだけ。
深夜に出た問題で、出てすぐに解答しました。
このほかにも何問か挑戦しましたが、全く解けなかったので寝ました。
——ここまでが1日目に寝るまで解いた問題——
——ここから2日目(13時に起きたw)から解いた問題——
JPEG file
与えられたJPEGファイルを見て、フラグを求める問題でした。
ただ、JPEGは破損していて修復しなければなりません。ヒントに1ビットだけ弄ればよいと書いてありました。
与えられたJPEGを開くとこんな感じになってます。GIMPとかだとエラーが出て開けません。
とりあえず、バイナリエディタで開いてJPEGの形式とにらめっこしながら見ていきます。
全く分からんねw
ツールを別で用意しました。
http://www.vector.co.jp/soft/win95/art/se257653.html
これで見ると、なんだか怪しいところを発見!
FF DAの位置がSOSというセグメントの開始位置なのですが、その後ろにFF FCがあるのはおかしい。
下の方にFF 00が白くなっていて、これと同じじゃないかと思ってFC->00にしたところ見事にビンゴ!
見えました!これが正解となります。
Ps and QS(200)
公開鍵暗号方式で暗号化されたファイルと公開鍵2つを渡されて、暗号化されたファイルを復号化する問題でした。
1日目に結構取り組んだのですが、秘密鍵の元となるpとqが求まってからどうするか全く分からず…
上のJPEGが終わってから軽く調べたところ、良さげなサイトとスクリプトを発見!
http://seclist.us/rsa-tool-for-ctf-retreive-private-key-from-weak-public-key-andor-uncipher-data.html
Ganapati/RsaCtfTool
このツールに公開鍵2つと暗号化ファイルを投げたらすぐに求めることが出来ました。
それっぽい文字列が見えてますね。これが答えです。
なんか、適当に入力したら正解しそうな感じですけど…
ここで残り10分とかだったので、解くのをやめました。
途中で終わるっていうのはあまり好きじゃないので…
——追記——-
ヒデホヒ君が解いた問題に関しても、記事がありますので載せておきます。
なんか、開始が完全にパクリなんですけど…
SECCONに参加してみたお話 (1/2) – ヒデホヒのおもちゃばこ
SECCONに参加してみたお話 (2/2) – ヒデホヒのおもちゃばこ
感想
なんというかネットに助けられたって感じの解き方でした。
自分の知ってる分野だと結構すぐに解けたりするので、やっぱり知識って大事ですね。
ググって、他人のコードを借りることばっかりやったのでもう少し自分でも書けるようになっておきたいと感じました。
一番辛かったのは、渡される実行ファイルがLinux向けばかりだったということです。
Windowsがメインの僕にはとても厳しいものでした。Windowsの実行ファイルなら結構解析が簡単なのですが、Linuxはさっぱり分かりません。
Linuxの実行ファイル解析もやらないといけないと感じました。
あと、PythonのスクリプトもいくつかあったのですがどれもPython 2でまじかって思いました。
全体的な感想としては、とても楽しかったです。Discordで会話しながらやっていたのも結構よかったです。
時間があれば、次も参加してみたいなーとか思ってたりします。
ちなみにこの記事、問題を解きながらやってます。
月曜日に英語のテストがあるので、終わったらすぐにそっちに取り掛からないと…