FIT-HACK CTF 2017 Writeups
先日2017/4/8から4/14の日程で、g0tiu5aというチームでFIT-HACK CTF 2017に参加しました。これは私が解いた問題のWriteupです。
結果は514チーム中43位で、2750ポイントを獲得しました。その内、私は2200ポイント稼ぎました。
自慢
コンテストページには私が開発・メンテナンスをしているBootstrapテーマのUmiが使われていました。ヤッタネ
[Misc 50] EXE
バイナリをDLして files
を実行すると64bit Linux向けのELFであることがわかる。64bit Linuxで実行するだけ。
FIT{k5wyn73m}
[MISC 50] You got Flags
模様が描かれた何種類かの旗が描かれた画像が得られる。調べると、この旗は国際信号旗であることがわかった。Wikipediaさんの指示に従ってデコードするとFlagが得られる。
FIT{DOUBLECHEESEBURGER}
[MISC 100] Fake
WebページからFlagを得る問題。表示すると旗のアスキーアートが現れるだけなので、JavaScriptを見て見る。JavaScriptは eval
する怪しいコードなので、evalしている内容を console.log
で確認。そのコードにそれっぽい変数があったので、実行してテキストの中身を確認したらFlagだった。
FIT{5ecur1tyf0n7}
[MISC 250] Color
複数の画像が1つのファイルにまとまったpngがからFlagを得る問題。各画像は単色の画像となっている。バイナリエディタで見て見ると、色情報がASCIIコードで表せる値になっている。そこで、pngのsRGB値を画像が格納されている順番にASCII化したものがFlagとなる。
FIT{Animat3d_P0rtabl3_N3tw0rk_Graphic5_i5_w0nd3rful}
[Web 50] Get
パケットデータが得られる。眺めるとBasic認証をしているので、それをbase64でデコードしたらFlagが得られた。
FIT{332dref3a5g7h}
[Web 50] Wait
WebページからFlagを探す問題。ページに飛ぶと、ボタンを押して1分待てと言われる。しかし、30秒経つと別のページに飛ばされてしまう。JavaScriptのコードを読んで見ると、60秒待つと特定のURLに飛ばすようになっている。URL直打ちでそこに飛ぶとBase64でデコードされた文字列があるので、デコードする。
FIT{c3RvcHN0b3BzdG9w}
[Web 50] Look quickly
Cookieがセットされるが、有効期間が短すぎてブラウザ上では確認できない。curlを使ってヘッダを直接覗く
FIT{I7_i5_n07_4_c00ki3_t0_3a7}
[Web 50] 100 Count
WebページからFlagを得る問題。表示される単純な足し算の結果をformで送信し、それを100回繰り返せという。cookieに計算回数が格納されているので、99にして1回だけとくとFlagが得られる。
FIT{fsaewiwe}
[Web 100] Capture!
パケットのキャプチャからFlagを得る問題。binwalkしたところelfがあった。これを抽出して実行するだけ。
FIT{ddscklhgbfsdj}
[Crypto 50] flag
パスワード付きzipを解凍する問題。Lhaplusをつかって全探索した。zipパスワードは 1864
だった。
FIT{f1s4a3DS2faQ1}
[Crypto 100] It’s_solvable
これはチームメイトとコンビネーションを発揮した問題。
得られるZipからは下記のようなファイル群が得られる。それぞれのファイルには対応する公開鍵と暗号文がある。公開鍵自体は小さい桁数なので、 msieve
を使って簡単に素数を求められる。
書く暗号文を復号すると、下記のような平文が得られる。
—– ここからチームメイトの貢献 —–
ディレクトリ名は v1
~ v2
のSHA1になっているので、その順に平文を並べて、平文間の重複文字を1文字除去する。
FIT{__dOSAi85Zyapohvwvc7tJ1RuW}
[Binary 50] FITRPG
Windowsのバイナリ。通常通り実行すると絶対にFlagが表示されるコードまでたどり着けない。IDAを使って強制的にFlagを表示するプログラムにジャンプする。
FIT{1sdf3a9f}
[Binary 100] Execution
ARMのバイナリ。qemuの環境を用意して実行するだけ。
FIT{3xecuti0n_c0mp1ete}
[Binary 200] Omikuji
jarからFlagを得る問題。jarの実態はzipなので、まず解凍する。解凍後、classファイルをInteliJで覗く。InteliJにclassファイルを与えると、変数名は潰れるが元のコードを見ることができる。 flag
という関数でFlagを生成していたので、新しいソースコードにコピペしてコンパイル&実行。
[Forensic 50] Repair
binwalkしたとろzipファイルっぽいが、マジックナンバーが欠けているのでそこを補完して解凍する。
FIT{r3p4ir_c0mpl3t3d_zip_d3_kur3}
[Forensic 100] Input
パケットのキャプチャデータが得られる。USBの通信をキャプチャしたもので、タイトルからも予想されるようにKeybourdで入力した値がFlagとなっている。似たような問題のWriteupsを参考にした。
しかし、キー配列の対応は仕様と違うようで、実際の日本語配列の対応表を参考にしたところ、フォーマット通りのFlagが得られた。
FIT{I_w4nt_4_k3ybo4rd}
[Forensic 150] Connect
複数のpngがバイナリレベルで連結したファイルが得られる。各pngは非常に横長な画像になっている。pngを分割し、縦に並べて表示するとflagが書かれた画像が得られる。
FIT{6xgwxloxq79ew}
[Forensic 200] Unknown password
zipからFlagを得る問題。zipはパスワードによって暗号化されている。binwalkして見ると、 flag.txt
と Fkkokudai.jpg
がある。 Fukkoudai.jpg
で検索するとWikipediaに画像が見つかったので、既知平文攻撃を使ってクラックする。 pkcrack
を使うと簡単にできる。
FIT{feqDnwJ9YtMrhh0}
[Steganography 50] Dissonance
sound.wav
というファイルからFlagを得る問題。files
してみるとwavではなくMIDIファイルであることがわかる。MIDIエディタで開くと、譜面が文字の形をしていて、Flagになっている。
Flagはメモし忘れました。
[Steganography 100] MP3Stego
mp3がDLできる。音を聞くとダイアルアップ接続みたいなピーガガガが流れる。問題タイトルの MP3Stego
を検索すると、名前そのままで平文をmp3に変換するアプリケーションがあった。このデコードも可能だが、パスワードが必要。mp3をstringsしたところ、The pass is dialup
とあったので、dialup
をパスワードにして復号。Flagが得られた。
FIT{PeePeeHyoroRorro}
[Steganography 100] Hide Flag
pngからFlagを得る問題。ディスプレイを横から見たりしてpngをよく見るとわずかながら色の濃淡があることがわかる。何らかの二次元コードのように見える。
二次元コードで検索して辿ると、Semacodeっぽいことがわかる。画像の濃淡を調整して、Web上にあるSemacodeのデコーダーに食わせればFlagを得られる
FIT{rtuw8Enj8f2D}
[Recon 50] Be a stalker
@FitHack_CTFからパスワードを探せという問題。Flagのフォーマットは FIT{[パスワード]}
となる。
ツイートを眺めていると下記の文章が得られた。
ドクターペッパー好きすぎるんだが
— ふぃっと君 (@FitHack_CTF) 2017年2月22日
どれくらい好きかってもうパスワードに設定しちゃうぐらい好き
よってFlagは FIT{DrPepper}
[Recon 100] Specific
DLできるjpegフォーマットの写真がなんという名前の橋から取られたものか探す問題。緯度経度情報があるので、Google Mapsでまず見る。しかし橋の名前が地図に書かれていなかったのでストリートビューを使ってなんとか探す。橋には大体漢字表記とひらがな表記の両方が書かれているので、根気よく探す。結果として天大橋(てんたいばし)だった。
FIT{tentaibashi}
[Trivia 10] trivia1, 2, 3, 4, 5
調べればわかるのでFlagだけ書きます。
FIT{SHELLSHOCK}
, FIT{POODLE}
, FIT[HYDROGEN}
, FIT{AAC}
, FIT{SHATTERED}
Writeupは以上です。