ホーム » 「リバースエンジニアリング」タグがついた投稿

タグアーカイブ: リバースエンジニアリング

Frida 入門

こんにちは。kzです。

今回は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


Android リバースエンジニアリング 入門

こんにちは。kzです。

前どこかの記事で書いたかもしれませんが、僕はリバエンが大好きです。好きすぎてやばいです。めちゃめちゃ楽しいので皆さんにも紹介します。

UnCrackable App for Android Level 1

リバエンしていきたいと思います。この.apkはCTF的なやつでroot detectedをbypassするのが最終目的になります。しかし今回の記事では.apkからJaveのコードをデコンパイルするまでの内容になります。

apkってなに?という方もいるかと思うので用語などについて説明します。

Introduction to .apk file

アンドロイドのアプリケーションは.apkという拡張子を持ちます。実はこれは.zipと同じでリネームして展開すると開ます。今回の.apkを例にとって開いてみましょう。
見ての通り.pngなどいろいろありますね。これはあくまで一例ですが、いくつか紹介します。
  • AndroidManifest.xml
    • permissionとかpackageとかapiとか
  • META-INF
    • MF アプリのハッシュ値
    • RSA アプリの証明書
    • SF: list of resources and the SHA-1 digest of the corresponding lines in the MANIFEST.MF file
  • classes.dex
    • コンパイルされたJava(Kotlin)のDalvik bytecode(プログラムの部分)
  • res
    • 画像とかのリソース
  • assets
    • マルウェア系が組み込まれやすいところ
  • lib
    • nativeライブラリ
  • .smali
    • .dexのアセンブリ
僕もまだよくわかってないところが多いですがとりあえず、.xmlとclasses.dexくらいだけまず気にかけておけばいいです。ちなみに.smaliはこんな感じ

From .apk To .dex

上では.apkを.zipにリネームしてから開く方法を紹介しましたが実はこれよくないです。なぜならば一部がバイナリ エンコードされています。そこで専用のツールを使って.apkをdecompileして.dexを取得する方法を紹介します。
apktoolというものを使います。これを使えば.apkを展開できます。結果的に上で紹介したAndroidManifest.xmlなどが見れます。
上のどちらかのコマンドで.apkを展開できます。

これで展開したので.smaliを直接書き換えてから.apkを新しくリビルドする作戦でもいいですが、初心者には少しきついのでとりあえずここではJavaのソースコードまでコンパイルする作戦でいきます。ソースコードが見れれば振る舞いが理解しやすいですしね。

そこで.dexをJavaに変換するツールが必要になります。

From .dex To Java (decompiled)

dex2jarというものをつかいます。 どちらも一応同じものですが
  • d2j_invoke.sh
  • d2j-dex2jar.sh
をchmod +xで実行可能にします。そしてdex2jar-2.0/d2j-dex2jar.shを実行するだけです。一連の流れをまとめますと
出力される.jarファイルはclasses-dex2jar.jarです。ちなみに.apkから.jarまで一気にやるパターンは試してません。

See Decompiled Java Code

あとはJD-GUIを使えばソースコードが見れます。
僕はmacなのでmac版をインストールして上で作ったclasses-dex2jar.jarを開けば
いい感じです。

Resign signature

デコンパイルした.apkをEmulatorでも実機でもどちらでもインストールしようとすると
Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]

とエラーが出る場合が多いです。そんな時はsignature(certification)が潰れてるので再発行します。その前にリビルド
からの
これでインストールできます。adb系のコマンドはいろいろありますね。
とりあえず今回はここまでにします。リバエンかfridaかどっちが好きですか?

References