こんにちは。

今回はFridaを使ってAndroid用のCTFを解いてみます。

これが今回のapkです。Objectiveのところにあるように、secret stringを見つけて、root検出の回避が目標です。

とりあえず起動してみるとこんな感じ。(エミュレータを使用しています。実機ほしい、、、、)

おー、root detectedですね。これは端末がroot化されているものを検出したということです。たとえばiPhoneのJailbreakも同じようなものです。なぜroot化かするのか?ですがたとえばゲームがいい例です。ゲームでチートってあるじゃないですかあれとかができるようになります。他にもiPhoneの場合だとTweakというアプリが作れたりします。ただ、よくないので行わないでください。

Source Code

Javaのコードをデコンパイルして覗いてみましょう。やり方は前回の記事にあります。こうすることでroot detectedの実装が確認できます。

root判定の部分がありました。

ふむふむ、Successとなるように分岐されるところのソースコードをみてみます。

Base64の文字列5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=ともう一つ気になるHex?があります、8d127684cbc37c17616d806cf50473ccこれはなんだろう、、?その後にAESもありますね、ということは逆算してパスフレーズがわかりそうです。ぐぐるとJavaにはCipherというAES/ECB/PKCS7Padding暗号があるようです。

どうやらkeyと平文を引数とする関数のようです。さらにHexの方がKeyであることがソースコードよりわかります。

なのでPythonでちゃちゃっとやります。

パスフレーズがわかりました。イエーい。まあそれはおいておいて、今回はFridaがメインみたいなところありますからね、、

Frida

Fridaとはモバイルアプリケーションの動的解析ツールです。静的解析と違ってソースコードを書き換えてリビルドしてアプリを起動する、といった一連の流れをスキップして動的に解析が可能です。

使い方は少々面倒ですが公式のドキュメントを頑張って読みましょう。

まずはfridaとfrida-serverのインストールです。frida-serverはアンドロイドに埋め込んでfridaを実行できる環境にするためのものです。

では、fridaのドキュメントを参考にしながらbypassのためのコードを書きます。exploit.jsと命名しました。アプリの挙動から考えて起動後最速でHookしたいですね。あ、Hookとはアプリケーション外に定義されたスクリプトを実行する行為のことを言います。

ここではアプリ起動時のroot detectedのスクリプトをHookingにより無効にします。そして入力可能な状況を確立し、先ほどのパスフレーズを入力して目標を達成します。他にもいろいろやり方はあるのでいろんなwrite-upを参考にしてくださいね。

exploit.js

ではHooking用のスクリプトを書きます。このjsのコードをpythonのファイルに埋め込んでpythonのAPIより実行します。

最終的にはこんな感じ

あとはターミナルを開いてfrida-serverを立てたのちにpyを実行するだけです。

起動時

rootをbypassできました。先ほどのパスフレーズを入力してみると

簡単ですね。ちなみに、Pythonでなくてもjsでfrida CLIから実行する場合は

Root Detection

iOSのJailbreak検出の実際の手法をいくつか紹介だけしておきます。

  • System Files Check
  • Symbolic Links Detection
  • Calling Cydia’s URL Scheme
  • Loaded Libraries

おそらくわかりやすいのは一つ目ではないかと思います。これはTweak含め、特定のファイルがあるかないかで検出します。たとえばWinterBoard.appiCleaner.appなどですね。今回の例題だとc.cにあたります。ソースコードを見てみてください。

とはいえ、level1なだけあって簡単ですね。マルウェア解析もやっていきたいです。

References