12月5日の15時から24時間、SECCON 2015というCTFあって、それに参加したのでWriteupを書いてみた。
ついでに、IGGG Advent Calender 2015のための記事というコトにした。
なので、少し丁寧に書きます。
- 日本主催で最大規模のCTFのオンライン予選
- 1000チームぐらいが参加する
- 詳しくはコチラ
今回、自分たちが解いたのは以下の12問
- Start SECCON CTF
- SECCON WARS 2015
- Unzip the file
- Reverse-Engineering Android APK 1
- Connect the server
- Command-Line Quiz
- Exec dmesg
- Decrypt it
- QR puzzle (Windows)
- Steganography 1
- Steganography 3
- Last Challenge (Thank you for playing)
このうち、自力で解いた問題を紹介(手伝ってもらったけど)
ちなみに、全体の成績は1600ptで108位でした。
ちと低いです。
問題
ex1
Cipher:PXFR}QIVTMSZCNDKUWAGJB{LHYEO
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
ex2
Cipher:EV}ZZD{DWZRA}FFDNFGQO
Plain: {HELLOWORLDSECCONCTF}
quiz
Cipher:A}FFDNEVPFSGV}KZPN}GO
Plain: ?????????????????????
ex1,ex2を参考にしてA}FFDNEVPFSGV}KZPN}GO
をDecryptoする問題です。
例を見る限り、単一換字式の暗号であるコトがわかります。
ex1がまんま対応表になっているので、これをもとにDecryptoするプログラムを書きました。
solve :: String -> String
solve s = map f s
where
f x
| Just i <- elemIndex x c = p !! i
| otherwise = '?'
c = "PXFR}QIVTMSZCNDKUWAGJB{LHYEO"
p = "ABCDEFGHIJKLMNOPQRSTUVWXYZ{}"
(無駄に冗長だ)
あとは実行するだけ
*Main> let a = "A}FFDNEVPFSGV}KZPN}GO"
*Main> solve a
SECCON{HACKTHEPLANET}
問題
Please win 1000 times in rock-paper-scissors
rps.apk
apkファイルは逆コンパイルが可能なので、WEBサービスを利用して行いました。
MainActivity.javaを読むと
if (1000 == cnt)
{
textview.setText((new StringBuilder()).append("SECCON{").append(String.valueOf((cnt + calc()) * 107)).append("}").toString());
}
とあるので、ココでFLAGを作ってると分かります。
勝利数を数える変数cnt
は1000だと分かっているので、あとはcalc()
が分かれば良いです。
さらにMainActivity.javaを読むと
public native int calc();
という部分がありました。
native
とは、Java以外で書いてコンパイルしたモノを利用するという意味らしいです。
つまり、実行ファイルの中にあります。
apkファイルを解凍して中を見るとlibcalc.so
というファイルがありました(各アーキテクチャごとにありました)。
これをobjdump
して読んでみると...なんか7
を返してるだけみたいです。
(1000+7)*107 = 107749
よって、FLAGはSECCON{107749}
(ちなみに、この数字、なんか意味あるんですかね?)
問題
login.pwn.seccon.jp:10000
とりあえず、netcap
してみます。
~$ nc login.pwn.seccon.jp 10000
CONNECT 300
Welcome to SECCON server.
The server is connected via slow dial-up connection.
Please be patient, and do not brute-force.
login: aaa
Sorry, the account is unavailable.
Good bye.
なんか、放置していたらヒントが出てきました。
~$ nc login.pwn.seccon.jp 10000
CONNECT 300
Welcome to SECCON server.
The server is connected via slow dial-up connection.
Please be patient, and do not brute-force.
login:
Login timer timed out.
Thank you for your cooperation.
HINT: It is already in your hands.
Good bye.
既に持ってる?(超意訳)
もしかしたら、パケットをキャプチャーしてみたらわかるかも、と思いWireSharkでとってみました。
(WireSharkの使い方は割愛)
TCP fllow stream してみると
すでに送られてた。
よってFLAGはSECCON{Sometimes_what_you_see_is_NOT_what_you_get}
です。
問題
$ ./cryptooo SECCON{*************************}
Encrypted(44): waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=
what's the key?
cryptooo.zip
cryptooo.zipを解凍すると実行ファイルがありました。
file
コマンドをしてみると、ELF形式だったのでUNIX環境に渡して実行してみました.
(今回、手元はwindowsでUNIX環境はSegeMathCloudを使ってみた、けっこう便利)
~$ ./cryptooo SECCON{}
Encrypted(12): waUqjjDGnbI=
問題の暗号化結果と先頭が同じだったので、地道にやれば会がわかるんじゃないかと思い、やってみました。
そのために、以下のPythonコードを実行して地道に探した。
(ふつうにDecryptoを書いてもよかったね)
>>> a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_'
>>> print '\n'.join(map(lambda c:c + commands.getoutput("./cryptooo SECCON{" + c),a))
SECCON{
の後を結果より1文字ずつ加えていきました。
なんとなく、規則性もわかってきたし、ある程度意味のあるFLAGだったので、対して時間もかからず解けた。
~$ ./cryptooo SECCON{Cry_Pto_Oo_Oo1Oo_oo_Oo_O}
Encrypted(44): waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=
問題
Please solve a puzzle 300 times
QRpuzzle.zip
QRpuzzle.zipを解凍すると、Windowsの実行ファイルがありました。
実行してみると 3*3 に分割されたQRコードのパズルを解いて、読み込んで、単語をタイプする問題でした。
これを300回...
時間制限はあったが、ためしにやり始めたら絶望的な時間ではない様子でした(約1時間半)
だから、やってみた!
(手伝ってもらいながら)
1時間半(超ギリギリ)の格闘の末、FLAGをゲット!
FLAGはSECCON{402B00F89DC8}
問題
We can get desktop capture!
Read the secret message.
desktop_capture.png
画像を見ると、ELFファイルのバイナリが表示されてます。
これを手打ちして、実行すればいいのかな?
と最初は思ったのですが、明らかに右半分が怪しい。
This problem can be solved by pre-children...
って分を検索してみたら、昔流行った問題らしい
コレ
右下のペイントより、塗りつぶせば....
よってFLAGはSECCON{the_hidden_message_ever}
でした。
問題
ex1
Cipher:PXFR}QIVTMSZCNDKUWAGJB{LHYEO
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
ex2
Cipher:EV}ZZD{DWZRA}FFDNFGQO
Plain: {HELLOWORLDSECCONCTF}
quiz
Cipher:A}FFDNEA}}HDJN}LGH}PWO
Plain: ??????????????????????
一番最初のやつと同じですね。
なので、同じように復号してみました。
*Main> let a = "A}FFDNEA}}HDJN}LGH}PWO"
*Main> solve a
"SECCON{SEEYOUNEXTYEAR}"
今回紹介したのが、一応自分が解いた問題です。
他は、擬音とか消火器が解きました。
協力してと他のもあります。
結果はイマイチでしたが、いっぱい解けたので楽しかったです。
ちなみに、言い訳すると、今回フルでやったのは僕1人でした。
前回は擬音、消火器、すぱさんがフルでやったんですけど、都合合わなくて...
またみんなでやりたいです。
書いた https://gist.github.com/gion-xy/dd468f240d959f03f18e