先日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 を使って簡単に素数を求められる。

├── 39BCC1930B969051426F5864F24B478CEAFBA7D8
│   ├── mfit
│   └── publicfit.pem
├── 59E859397B1AB522AAF698D9D42D5F064FD11381
│   ├── mfit
│   └── publicfit.pem
├── 5A6DF720540C20D95D530D3FD6885511223D5D20
│   ├── mfit
│   └── publicfit.pem
├── 8090FD368C8382FD4B216C5BAA04C99769DFCC49
│   ├── mfit
│   └── publicfit.pem
├── A1047EAB1035D58682A53557E0B2A75EDBFD15FD
│   ├── mfit
│   └── publicfit.pem
├── C5E31D5915661DE4393E3F1489B00EBC4497DD48
│   ├── mfit
│   └── publicfit.pem
└── C9CF2EF3AD15705851D02C005B381171AF921BD7
    ├── fit
    └── fitkey.pem

書く暗号文を復号すると、下記のような平文が得られる。

5A6DF720540C20D95D530D3FD6885511223D5D20 // Directory name
FIT{                                     // Plain

39BCC1930B969051426F5864F24B478CEAFBA7D8
vc7tJ

59E859397B1AB522AAF698D9D42D5F064FD11381
ohvwv

8090FD368C8382FD4B216C5BAA04C99769DFCC49
Zyapo

A1047EAB1035D58682A53557E0B2A75EDBFD15FD
__dOSA

C5E31D5915661DE4393E3F1489B00EBC4497DD48
Ai85Z

C9CF2EF3AD15705851D02C005B381171AF921BD7
J1RuW}

—– ここからチームメイトの貢献 —–

ディレクトリ名は 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を生成していたので、新しいソースコードにコピペしてコンパイル&実行。

FIT{78b4c64c4477e3705c221401639fdfaa0286f46658d4d81502b4c7eacbf0d708}
3 Billion Devices Run Java

[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.txtFkkokudai.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{[パスワード]} となる。

ツイートを眺めていると下記の文章が得られた。

よって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は以上です。