SECCON 2017 Online CTF writeup

SECCON2017のオンライン予選に参加したのでそのwriteupです。結果は700ptで321位。頑張らねば・・・。

Vigenere3d (crypto 100)

$ python Vigenere3d.py SECCON{**************************} **************
POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9

出力結果が上の暗号文になるような平文を探せという問題。まずタイトルからヴィジュネル暗号を使っていると分かります。 平文の一部が分かっているので、それと暗号文の情報から鍵を計算するスクリプトを書きました。

実行すると、鍵の一部が分かります。

$ ./search_key.py 
plain:  SECCON{**************************}
key:    _KP2Za_**************************a
crypt:  POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9

鍵長は14ですが、ここで与えられた暗号化スクリプトの15行目をみると、鍵の8~14文字目は1~7文字目を反転したものであると分かるので、鍵は以下のようになります。

key: _KP2Za__aZ2PK_

鍵が割り出せたので、暗号文と鍵の情報から平文を計算するスクリプトを書きます。

実行すればflagが出ます。

$ ./decrypt.py 
POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9
_KP2Za__aZ2PK__KP2Za__aZ2PK__KP2Za
SECCON{Welc0me_to_SECCON_CTF_2017}

flag:

SECCON{Welc0me_to_SECCON_CTF_2017}

Run Me! (programming 100)

単純に実行すればflagが出そうですが、実際は再帰が深すぎてうまくいきません。みるからにフィボナッチ数列のプログラムなので、再帰を使わない方法で実装します。

実行すればflagが出ます。

$ ./Run_Me2.py 
SECCON{65076140832331717667772761541872}

flag:

SECCON{65076140832331717667772761541872}

putchar music (programming 100)

見やすく整形し、コンパイルが通るように書き直します。

$ gcc ./putchar_music2.c -lm
$ ./a.out > output.wav
$ aplay output.wav

あの有名な曲が流れてきます。

flag:

SECCON{STAR_WARS}

SHA-1 is dead (crypto 100)

SHA-1が衝突する2つのファイルを探す問題。条件として2つのファイルは2017KiB以上2018KiB以下である必要があります。SHA-1は既にGoogleなどによって衝突が発見されており、同じハッシュ値を持った内容の異なるファイルが公開されています。SHA-1の仕組み上、この2つのファイルの末尾に同じデータを追加してもこれらのハッシュ値は変わらないので、それを使っていい感じにファイルサイズを調整します。

$ ./sha-1_is_dead.py 
SHA-1 hash
file1: 108fa3cd125fbf1b14f05fef51fca3a0a12f1c97
file2: 108fa3cd125fbf1b14f05fef51fca3a0a12f1c97
$ ls
file1           sha-1_is_dead.py    shattered-2.pdf
file2           shattered-1.pdf
$

出来たファイルをsubmitしてflagを得ます。

flag:

SECCON{SHA-1_1995-2017?}

Log Search (web 100)

WebサーバのアクセスログをElastic searchで検索できるサービスが与えられます。検索窓にSQLインジェクションXSSなど試してもSomething wrong... X(というメッセージが出てくるだけで対策されているっぽいので、適当にflagで検索してステータスが200になっているログを探してアクセスしたらflagが出てきました。

http://logsearch.pwn.seccon.jp//flag-b5SFKDJicSJdf6R5Dvaf2Tx5r4jWzJTX.txt

flag:

SECCON{N0SQL_1njection_for_Elasticsearch!}

おそらくもっとちゃんとした解き方があると思いますが想定解が分かりません。

JPEG file (binary 100)

壊れたjpegファイルが与えられます。ファイル中のどこか1bit修正すれば表示できるようになるらしいです。試しにGIMPで開こうとすると以下のメッセージが出ました。

Corrupt JPEG data: premature end of data segment Unsupported marker type 0xfc

よって画像ファイル中から0xfcとなっている箇所を探して修正すれば良いと分かります。JPEGでは、0xffの後にマーカータイプが来るので、0xfffcを探します。

$ hexdump -C problem.jpeg | grep 'ff fc'
$

ところが上のコマンドを実行しても何も出てきませんでした。調べたところ、hexdumpの出力がちょうど0xffと0xfcの間で改行が入っていることが原因でした。次のスクリプトを実行してファイルを修正します。

ちゃんと画像が表示されてflagをゲット出来ました。

f:id:tuz358:20171211225607p:plain

flag:

SECCON{jp3g_study}

Thank you for playing!

flag:

SECCON{We have done all the challenges. Enjoy last 12 hours. Thank you!}

pwn解いていない&100点問題しか解いてないので来年までに強くなってもっと高い点数を取れるようにしたいです。