Exploiting a debuggeable application
デバッグ可能なアプリケーションの悪用
ルートおよびデバッグ可能チェックの回避
この投稿のこのセクションは、https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0からの要約です。
Androidアプリをデバッグ可能にし、チェックを回避する手順
アプリをデバッグ可能にする
内容はhttps://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0に基づいています。
APKをデコンパイルする:
APKをデコンパイルするためにAPK-GUIツールを利用します。
_android-manifest_ファイルに
android:debuggable=true
を挿入してデバッグモードを有効にします。修正したアプリケーションを再コンパイル、署名、zipalignします。
修正したアプリケーションをインストールする:
コマンドを使用します:
adb install <application_name>
。
パッケージ名を取得する:
adb shell pm list packages –3
を実行してサードパーティアプリケーションのリストを表示し、パッケージ名を見つけます。
アプリをデバッガ接続待機状態に設定する:
コマンド:
adb shell am setup-debug-app –w <package_name>
。注意: このコマンドは、アプリケーションを開始する前に毎回実行する必要があります。
永続性を持たせるために、
adb shell am setup-debug-app –w -–persistent <package_name>
を使用します。すべてのフラグを削除するには、
adb shell am clear-debug-app <package_name>
を使用します。
Android Studioでデバッグの準備をする:
Android Studioで_ファイル -> プロファイルまたはAPKを開く_に移動します。
再コンパイルしたAPKを開きます。
重要なJavaファイルにブレークポイントを設定する:
MainActivity.java
(特にonCreate
メソッド)、b.java
、およびContextWrapper.java
にブレークポイントを置きます。
チェックを回避する
アプリケーションは、特定のポイントでデバッグ可能かどうかを確認し、ルートデバイスを示すバイナリもチェックします。デバッガを使用してアプリ情報を変更し、デバッグ可能ビットを解除し、検索されたバイナリの名前を変更してこれらのチェックを回避できます。
デバッグ可能チェックについて:
フラグ設定を変更する:
デバッガコンソールの変数セクションで、
this mLoadedAPK -> mApplicationInfo -> flags = 814267974
に移動します。注意:
flags = 814267974
のバイナリ表現は11000011100111011110
であり、「Flag_debuggable」がアクティブであることを示しています。
これらの手順は、アプリケーションがデバッグ可能であり、特定のセキュリティチェックをデバッガを使用して回避できることを保証し、アプリケーションの動作のより詳細な分析や変更を容易にします。
ステップ2では、フラグ値を814267972に変更することが含まれ、これはバイナリで110000101101000000100010100として表されます。
脆弱性の悪用
ボタンとテキストビューを含む脆弱なアプリケーションを使用したデモが提供されました。最初にアプリケーションは「Crack Me」と表示します。目的は、ソースコードを変更せずに、実行時に「Try Again」から「Hacked」にメッセージを変更することです。
脆弱性の確認
アプリケーションは
apktool
を使用してデコンパイルされ、AndroidManifest.xml
ファイルにアクセスしました。AndroidManifest.xmlに
android_debuggable="true"
が存在することは、アプリケーションがデバッグ可能であり、悪用される可能性があることを示しています。apktool
は、コードを変更せずにデバッグ可能ステータスを確認するためのみに使用されることに注意してください。
セットアップの準備
プロセスにはエミュレーターを起動し、脆弱なアプリケーションをインストールし、
adb jdwp
を使用してリスニングしているDalvik VMポートを特定することが含まれました。JDWP(Java Debug Wire Protocol)は、ユニークなポートを公開することにより、VM内で実行されているアプリケーションのデバッグを可能にします。
リモートデバッグのためにポートフォワーディングが必要で、その後JDBをターゲットアプリケーションにアタッチしました。
実行時にコードを注入する
悪用はブレークポイントを設定し、アプリケーションのフローを制御することによって行われました。
classes
やmethods <class_name>
のようなコマンドを使用してアプリケーションの構造を明らかにしました。onClick
メソッドにブレークポイントを設定し、その実行を制御しました。locals
、next
、およびset
コマンドを使用してローカル変数を検査および変更し、「Try Again」メッセージを「Hacked」に変更しました。修正されたコードは
run
コマンドを使用して実行され、アプリケーションの出力がリアルタイムで変更されました。
この例は、デバッグ可能なアプリケーションの動作がどのように操作できるかを示し、アプリケーションのコンテキスト内でデバイスへのシェルアクセスを取得するなどのより複雑な悪用の可能性を強調しています。
参考文献
Last updated