SECCON 2017 オンラインCTFに参加しました。
去年のCTFと同様一人チームでのんびり取り組みましたが、今回はなんと300点問題が解けました!
解いた問題は5つで、合計で700点獲得できました。
- Run me! (Programming) 100点 826人が回答
- putchar music (Programming) 100点 429人が回答
- SHA-1 is dead (Crypto) 100点 453人が回答
- z80 (Binary) 300点 18人が回答
- Thank you for playing! (Thank you!) 100点 830人が回答
忘れないうちにWrite-upを書いておきました。
Run me!(Programming) 100点
問題のpythonプログラムをみると、かなり深い再帰を行うプログラムのようです。このまま実行しても終わりません。
まずはプログラムの動きを確認するために最初の呼び出し元であるf(11010)の引数を変えて実行してみたところ、以下のような値になりました。
| |
これを関数に置き換えてみると、以下のような展開になります。
| |
ということは、ループにしてf(n)の値を配列に保存して、その値を順次使って計算すれば良さそうです。
pythonで作成したプログラムは以下のようになりました。
| |
putchar music(Programming) 100点
まずは問題のプログラムをコンパイルしました。標準出力にデータがでてくるようなので、ファイルに出力しましたがかなり巨大だったので途中で中断しました。生成されたファイルは単なるデータのようです。
| |
これをバイナリダンプしてみたところ、各データの数値の前後の値がそれほど変化しておらず、なにやら連続的なアナログな数値に見えました。
| |
もしやと思い、このデータをaplayに流し込んでみたら・・・・。
| |
有名な映画音楽が流れてきました。
この問題は5分もかからなかったかもしれません。
SHA-1 is dead(Crypto) 100点
これは以下の条件のファイルを作れという問題です。
| |
SHA-1が破られたということで話題になりました。まずはその記事を確認です。
ここに載っている2つのPDFがSHA-1が同じだけど、中身が違うサンプルファイルです。
でもこのファイルは大きさが小さいです。どうしようかなと思っていたところで、次のスライドを見つけました。
https://www.slideshare.net/herumi/googlesha1
なんと、違っているのは前半の一部分ということなので、先ほどのPDFファイルに適当なデータをくっつけてサイズを合わせれば良いことになります。
| |
できたファイルをアップロードしてフラグが取れました。
z80(Binary) 300点
これはz80ファンとしては解かねばいうことで時間をかけて取り組みました。
JPEGの写真がたくさん入っていて、Z-80 CPUとArduino Megaが接続されたハードウェアが360度の方向から写っていました。Z-80の周辺デバイスとしてArduino Megaを使うもののようです。
この問題のハードウェアの写真をまとめてビデオにしてみました。
https://www.youtube.com/watch?v=an2iK-qTb2M
※SECCON様から掲載許可をいただきました。ありがとうございます。
Arduinoのソースをみると、実行コードらしい16進数が組み込まれていましたが、どうもZ80ぽくない数値です。
| |
多分、データバスもしくはアドレスバスの接続がわざと変えてあるのだろうと推測し、たくさんある写真を見比べたところ、データバスのD0とD1が逆に接続されているように見えました。そこで、Arduinoのソースにある16進数の下位2ビットを入れ替えてみると、見慣れたZ80の機械語がでてきました。21 xx xxとか 3E xx は一番多く使うものだと思います。
変換プログラムを作ってもよかったのですが、コードが短いので手で置き換えてZ80アセンブラのソースコードを作りました。
| |
ソースコードの最初を見てみると、フラグの頭文字の"SECCON{“をメモリに書き込んでいることがわかります。書き込むときも下位2ビットを入れ替えることになります。肝心なフラグの部分は条件判断やループを使っていたので、その部分だけ簡単なプログラムを作りフラグを求めました。
| |
これでフラグがとれました。ちなみに下位ビットの入れ替えはmacOSの標準アプリの「計算機」で確認しながら行いました。
この問題はデータバスの2本だけが入れ替わっていたのが救いでした。アドレスバスも入れ替わっていたら追いきれませんので。
Thank you for playing!(Thank you!) 100点
z80が終わって一息ついて次は何をやろうかなと思っていたら一番最後にこのボーナス問題がありました。フラグをそのまま入力して100点取りました。
総評
今回は初めて100点以外の問題が解けました。Z80+Arduinoという楽しい問題をありがとうございました。また終盤に公開されたボーナス問題もありがたかったです。また来年もできる範囲で参加したいと思います。運営の皆様ありがとうございました。
