Skip to content

Instantly share code, notes, and snippets.

@matsubara0507
Last active June 19, 2023 01:57
Show Gist options
  • Save matsubara0507/73cbb414b470c2df476b to your computer and use it in GitHub Desktop.
Save matsubara0507/73cbb414b470c2df476b to your computer and use it in GitHub Desktop.
SECCON 2015 Online 予選 Writeup

Writeup for SECCON 2015 Online CTF

What is This ?

12月5日の15時から24時間、SECCON 2015というCTFあって、それに参加したのでWriteupを書いてみた。
ついでに、IGGG Advent Calender 2015のための記事というコトにした。
なので、少し丁寧に書きます。

SECCON 2015 Online CTF

  • 日本主催で最大規模のCTFのオンライン予選
  • 1000チームぐらいが参加する
  • 詳しくはコチラ

Writeup

今回、自分たちが解いたのは以下の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位でした。
ちと低いです。

Start SECCON CTF

問題

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}

Reverse-Engineering Android APK 1

問題

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}
(ちなみに、この数字、なんか意味あるんですかね?)

Connect the server

問題

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}です。

Decrypt it

問題

$ ./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=

QR puzzle (Windows)

問題

Please solve a puzzle 300 times
QRpuzzle.zip

QRpuzzle.zipを解凍すると、Windowsの実行ファイルがありました。
実行してみると 3*3 に分割されたQRコードのパズルを解いて、読み込んで、単語をタイプする問題でした。
これを300回...
時間制限はあったが、ためしにやり始めたら絶望的な時間ではない様子でした(約1時間半)

だから、やってみた!
(手伝ってもらいながら)

1時間半(超ギリギリ)の格闘の末、FLAGをゲット!

FLAGはSECCON{402B00F89DC8}

Steganography 3

問題

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}でした。

Last Challenge (Thank you for playing)

問題

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人でした。
前回は擬音、消火器、すぱさんがフルでやったんですけど、都合合わなくて...
またみんなでやりたいです。

おしまい

@gion-pop
Copy link

gion-pop commented Dec 7, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment