スマートフォン解析 top

TOP > タイガーチームセキュリティレポート > SECCON 2015 CTF予選 Writeup

タイガーチームセキュリティレポート

SECCON 2015 CTF予選 Writeup

先日開催されたSECCON 2015のCTF予選に社員有志で参戦しました。私もいくつか問題を解くことができましたので、私が解いた問題を解説します。

Reverse-Engineering Android APK 1

いつか出るぞと思い、ずっと待っていたAndroidのReverse Engineering 問題です。やっと来ました。Androidの実行ファイルはとても簡単にReverse Engineeringできるので、もしかしたら問題になりにくいのかもしれません。

問題文には「じゃんけんで1000回連続で勝ち続けよ」と書いてありましたが、じゃんけんする気は毛頭ありません。早速apkファイルをバラしていきます。

$ unzip rps.apk
Archive:  rps.apk
  inflating: AndroidManifest.xml
  inflating: res/anim/abc_fade_in.xml
...
 extracting: res/mipmap-xxxhdpi-v4/ic_launcher.png
 extracting: resources.arsc
  inflating: classes.dex
  inflating: lib/armeabi/libcalc.so
  inflating: lib/armeabi-v7a/libcalc.so
  inflating: lib/mips/libcalc.so
  inflating: lib/x86/libcalc.so
  inflating: META-INF/MANIFEST.MF
  inflating: META-INF/CERT.SF
  inflating: META-INF/CERT.RSA
$ 

見るべきファイルは classes.dex です。dex2jarでjarに変換します。

$ d2j-dex2jar.sh classes.dex
dex2jar classes.dex -> ./classes-dex2jar.jar
$ 

jarファイルができたらJava Decompilerで眺めます。

MainActivityに以下のコードが含まれていました。

if (1000 == MainActivity.this.cnt) {
  localTextView.setText("SECCON{" + String.valueOf((MainActivity.this.cnt + MainActivity.this.calc()) * 107) + "}");
}

ここでフラグを生成しているようです。MainActivity.this.cntの値は直前に 1000 であることが確認されているので、MainActivity.this.calc() を探します。すると、すぐ下にありました。

static
{
  System.loadLibrary("calc");
}

public native int calc();

calcは外部ライブラリにあるようです。lib/x86/libcalc.so を、どこのご家庭にもあるごく一般的なIDAProに放り込み、コードを探します。

あまりにもそのまま書いてあるので何かの罠ではないかと思いました。calcという名前に反して全く計算していません。ともあれ、前出のJavaコードは下記のように解釈することができます。

if (1000 == MainActivity.this.cnt) {
  localTextView.setText("SECCON{" + String.valueOf((1000 + 7) * 107) + "}");
}

ということで、フラグはこちらでした。

SECCON{107749}

Connect the server

接続すると非常に遅い速度でメッセージを送信するサーバでした。あまりに遅いのでパケットキャプチャします。

すると、不自然に大きいパケットが一つだけ混じっているのが見えます。

見えましたか? フラグはこちら。

SECCON{Sometimes_what_you_see_is_NOT_what_you_get}

Command-Line Quiz

ターゲットにtelnetで接続するとflag.txtというファイルはすぐに見つかったのですが、権限がないために開けません。そこで、「stage1.txt」といういかにも怪しげなファイルを開きます。

$ telnet caitsith.pwn.seccon.jp
Trying 153.120.171.19...
Connected to caitsith.pwn.seccon.jp.
Escape character is '^]'.

CaitSith login: root
Password:
$ ls
bin         etc         init        linuxrc     sbin        stage2.txt  stage4.txt  tmp
dev         flags.txt   lib         proc        stage1.txt  stage3.txt  stage5.txt  usr
$ cat stage1.txt
What command do you use when you want to read only top lines of a text file?

Set your answer to environment variable named stage1 and execute a shell.

  $ stage1=$your_answer_here sh

If your answer is what I meant, you will be able to access stage2.txt file.
$

なるほどクイズです。テキストファイルの頭の方だけを読むためのコマンドといえばheadです。そのように答えて次のファイルを開きます。

$ stage1=head sh
$ cat stage2.txt
What command do you use when you want to read only bottom lines of a text file?

Set your answer to environment variable named stage2 and execute a shell.

  $ stage2=$your_answer_here sh

If your answer is what I meant, you will be able to access stage3.txt file.
$

答えはtailコマンドですね。

$ stage2=tail sh
$ cat stage3.txt
What command do you use when you want to pick up lines that match specific patterns?

Set your answer to environment variable named stage3 and execute a shell.

  $ stage3=$your_answer_here sh

If your answer is what I meant, you will be able to access stage4.txt file.
$

特定パターンと一致した行を表示するコマンド。みんな大好きgrepです。

$ stage3=grep sh
$ cat stage4.txt
What command do you use when you want to process a text file?

Set your answer to environment variable named stage4 and execute a shell.

  $ stage4=$your_answer_here sh

If your answer is what I meant, you will be able to access stage5.txt file.
$

これは迷いました。sed/ed/trなど色々試して当たったのはawkでした。

$ stage4=awk sh
$ cat stage5.txt
OK. You reached the final stage. The flag word is in flags.txt file.

flags.txt can be read by only one specific program which is available
in this server. The program for reading flags.txt is one of commands
you can use for processing a text file. Please find it. Good luck. ;-)
$

なるほど。最後はコマンドを探すのですね。きちんとヒントも書かれていて、テキストファイルを処理するコマンドだとおっしゃる。でもこれはきっと罠に違いないと勝手に思い込み、いろいろなことを試したあげく、sedが当たりでした。stage4で真っ先に試したコマンドなのに...

$ sed '' /flags.txt
OK. You have read all .txt files. The flag word is shown below.

SECCON{CaitSith@AQUA}

QR puzzle (Windows)

ソルバー作った方が早いのは分かってはおりますが、Windowsアプリを作るのは苦手ですし、時間制限もなさそうでしたので、人力で頑張りました。

目標を

センターに入れて

スイッチ (Q太郎で)

これを300回繰り返すだけです。簡単ですね(白目)。


300回答えたところで、このような画面が表示されました。

ということで、フラグはこちら。

SECCON{402B00F89DC8}


このゲームのコツは、Answerを入力する際にプログレスバーを凝視することです。

こちらが入力前の状態です。

こちらが入力後です。1ピクセル伸びました。悦びも1ピクセル分得られます。

これを繰り返し眺めることで涅槃に近づくことができるのではないかと考えられます。

QR puzzle (Nonogram)

お絵かきロジックとかピクロスなどの名称で知られるパズル Nonogramで表現されたQRコードをデコードする問題です。迂闊にもWebアプリの画面ショットを撮り忘れてしまいましたので、画像少なめでお送りいたします。

30問くらいならソルバー作るより叩いた方が早かろうということで、

ロジック・アーティスト

LogiNeko

Q太郎

このようなツール類でレベル上げて物理で殴りまくりました(ソルバー作ればよかったと後で後悔)。


出題ページでWebブラウザのコンソールを開き、下記のコードを叩き込むと、ロジック・アーティストに渡せる「縦データ」を切り出せます。

$('.cols').each(function(index, element){arr = $.makeArray($(element).find('span')).map( function(e){return $(e).text()}); console.log(arr.join(" ")) });

横データはブラウザ上でまとめてコピーして貼り付けできますので、これらを使ってロジック・アーティストに解いてもらいます。

ただし、Nonogramの問題によっては複数の解が発生しうるものがあります。残念ながらロジック・アーティストでは解析結果の未決部分をいじることができなかったので、その場合はLogiNekoを使って未決部分を手動で解いていきます。ある程度埋まったらQ太郎でQRコードを解析。多少未決が残っていてもQRコードの強力な誤り訂正機能を信用して読ませます。この解き方はエンジニアとは思えないような泥臭さですね。

このようにして解いて得られた文字列をWebアプリに入力すると次の問題が表示されます。最後の問題の解がフラグでした。

SECCON{YES_WE_REALLY_LOVE_QR_CODE_BECAUSE_OF_ITS_CLEVER_DESIGN}

QRコードをアピールしたい気持ちはビンビンに伝わったのですが、SAN値の低下やヘイト値の増加を招くような問題でアピールするのは逆効果なのではないかと他人事ながら心配しています。

Writeupは以上です。

恐ろしいことに、GSXという会社はCTFに参加する社員に特別手当と深夜休日割増の残業手当を支払い、しかも代休も取れるという、ちょっとアレな会社です(競技中、出社していることが条件ですが)。この会社はタイガーチームサービス事業部の誰かに騙されているに違いありません。

私の場合は、自宅より会社の方がハードもツールも充実しているし、集中できる(し手当も出る)ので、CTFやるときは会社で参戦するのが常です。


タイガーチームサービス事業部 R&D部 柏崎