macOS Apps - Inspecting, debugging and Fuzzing
WhiteIntelは、ダークウェブを活用した検索エンジンで、企業やその顧客がスティーラーマルウェアによって侵害されていないかをチェックする無料機能を提供しています。
WhiteIntelの主な目標は、情報窃取マルウェアによるアカウント乗っ取りやランサムウェア攻撃と戦うことです。
彼らのウェブサイトをチェックし、無料でエンジンを試すことができます:
静的解析
otool
objdump
jtool2
このツールは、codesign、otool、objdump の代替として使用でき、いくつかの追加機能を提供します。こちらからダウンロードするか、brew
を使用してインストールしてください。
Codesign / ldid
Codesign
は macOS に、一方 ldid
は iOS に見つけることができます
SuspiciousPackage
SuspiciousPackageは、インストールする前に中身を確認するために**.pkg**ファイル(インストーラー)を検査するのに役立つツールです。
これらのインストーラーには、通常、マルウェア作者が悪用するpreinstall
およびpostinstall
bashスクリプトが含まれており、マルウェアを****持続化するために悪用されます。
hdiutil
このツールは、Appleディスクイメージ(.dmg)ファイルを実行する前に検査するためにマウントすることを可能にします。
Objective-C
メタデータ
Objective-Cで書かれたプログラムは、Mach-Oバイナリにコンパイルされる際に、クラス宣言を保持します。このようなクラス宣言には、以下の情報が含まれます:
クラス
クラスメソッド
クラスのインスタンス変数
class-dumpを使用して、この情報を取得できます。
関数の呼び出し
Objective-Cを使用するバイナリで関数が呼び出されると、コンパイルされたコードはその関数を呼び出す代わりに objc_msgSend
を呼び出します。これにより最終的な関数が呼び出されます:
この関数が期待するパラメータは次のとおりです:
最初のパラメータ (self) は、「メッセージを受け取るクラスのインスタンスを指すポインタ」です。簡単に言うと、メソッドが呼び出されるオブジェクトです。メソッドがクラスメソッドの場合、これはクラスオブジェクトのインスタンス(全体として)になりますが、インスタンスメソッドの場合、selfはクラスのインスタンスとしてインスタンス化されたインスタンスを指します。
2番目のパラメータ (op) は、「メッセージを処理するメソッドのセレクタ」です。単純に言うと、これはメソッドの名前です。
残りのパラメータは、メソッドで必要な値です(op)。
ARM64でlldb
を使用してこの情報を簡単に取得する方法を以下のページで確認してください:
x64:
引数 | レジスタ | (objc_msgSend用) |
1番目の引数 | rdi | self: メソッドが呼び出されるオブジェクト |
2番目の引数 | rsi | op: メソッドの名前 |
3番目の引数 | rdx | メソッドへの第1引数 |
4番目の引数 | rcx | メソッドへの第2引数 |
5番目の引数 | r8 | メソッドへの第3引数 |
6番目の引数 | r9 | メソッドへの第4引数 |
7番目以降の引数 | スタック上の rsp+ | メソッドへの第5引数以降 |
Swift
Swiftバイナリでは、Objective-C互換性があるため、class-dumpを使用して宣言を抽出することができますが、常にではありません。
jtool -l
または otool -l
コマンドラインを使用すると、__swift5
接頭辞で始まる複数のセクションを見つけることができます。
さらなる情報は、このブログ投稿でこのセクションに保存されている情報について見つけることができます。
さらに、Swift バイナリにはシンボルが含まれる可能性があります(たとえば、ライブラリは関数を呼び出すためにシンボルを保存する必要があります)。**シンボルには通常、関数名と属性に関する情報が含まれており、見た目が醜いため、非常に役立ちます。そして、"デマングラー"**が元の名前を取得できます。
パッキングされたバイナリ
高いエントロピーをチェックする
文字列をチェックする(理解できる文字列がほとんどない場合、パッキングされている可能性がある)
MacOS用のUPXパッカーは"__XHDR"というセクションを生成する
ダイナミック解析
バイナリをデバッグするには、SIPを無効にする必要がある(csrutil disable
またはcsrutil enable --without debug
)か、バイナリを一時フォルダにコピーしてcodesign --remove-signature <binary-path>
で署名を削除するか、バイナリのデバッグを許可する(このスクリプトを使用できます)
macOSのシステムバイナリ(例:cloudconfigurationd
など)をインストールするには、SIPを無効にする必要がある(単に署名を削除するだけでは機能しません)。
統合ログ
MacOSは多くのログを生成し、アプリケーションを実行する際に非常に役立ちます。
さらに、一部のログには、ユーザーやコンピューターの識別可能な情報を非表示にするための<private>
タグが含まれています。ただし、この情報を開示するために証明書をインストールすることが可能です。こちらの説明に従ってください。
Hopper
左パネル
Hopperの左パネルでは、バイナリのシンボル(ラベル)、手続きと関数のリスト(Proc)、および文字列(Str)を見ることができます。これらはMac-Oファイルのさまざまな部分で定義された文字列のすべてではありませんが、(例:_cstringまたはobjc_methname
)。
中央パネル
中央パネルでは、逆アセンブルされたコードを見ることができます。そして、生の逆アセンブル、グラフ、逆コンパイル、バイナリを見ることができます。それぞれのアイコンをクリックして:
コードオブジェクトを右クリックすると、そのオブジェクトへの参照/参照元を見ることができます。また、その名前を変更することもできます(逆コンパイルされた擬似コードでは機能しません):
さらに、中央下部にPythonコマンドを記述することができます。
右パネル
右パネルでは、ナビゲーション履歴(現在の状況に到達するまでの経緯を把握するため)、この関数を呼び出すすべての関数とこの関数が呼び出すすべての関数を見ることができるコールグラフ、ローカル変数情報など、興味深い情報を見ることができます。
dtrace
これにより、ユーザーは非常に低レベルでアプリケーションにアクセスでき、プログラムをトレースしたり、実行フローを変更したりする方法が提供されます。 Dtraceは、システムコールの開始と終了などの場所に配置されたプローブを使用します。
DTraceは、各システムコールのエントリポイントと終了ポイントにプローブを作成するために**dtrace_probe_create
**関数を使用します。これらのプローブは、各システムコールのエントリポイントと終了ポイントで発火することができます。DTraceとのやり取りは、ルートユーザー専用の/dev/dtraceを介して行われます。
SIP保護を完全に無効にせずにDtraceを有効にするには、回復モードで次のコマンドを実行できます:csrutil enable --without dtrace
また、コンパイルしたバイナリの**dtrace
またはdtruss
**を実行できます。
dtraceの利用可能なプローブは、次のコマンドで取得できます:
プローブ名は、プロバイダー、モジュール、関数、および名前(fbt:mach_kernel:ptrace:entry
)の4つの部分で構成されています。名前の一部を指定しない場合、Dtraceはその部分をワイルドカードとして適用します。
プローブをアクティブ化し、それらが発生したときに実行するアクションを指定するには、D言語を使用する必要があります。
詳細な説明やさらなる例は、https://illumos.org/books/dtrace/chp-intro.html で見つけることができます。
例
man -k dtrace
を実行して、利用可能なDTraceスクリプトをリストアップします。例: sudo dtruss -n binary
1行で
スクリプト
dtruss
ktrace
これはSIPが有効な状態でも使用できます
ProcessMonitor
ProcessMonitorは、プロセスが実行しているプロセス関連のアクションをチェックするための非常に便利なツールです(たとえば、プロセスが作成している新しいプロセスを監視します)。
SpriteTree
SpriteTreeは、プロセス間の関係を表示するツールです。
sudo eslogger fork exec rename create > cap.json
のようなコマンドでMacを監視する必要があります(このコマンドを実行するためにはFDAが必要です)。その後、このツールでjsonをロードしてすべての関係を表示できます:
FileMonitor
FileMonitorは、ファイルイベント(作成、変更、削除など)を監視し、そのようなイベントに関する詳細情報を提供します。
Crescendo
Crescendoは、WindowsユーザーがMicrosoft Sysinternalの Procmon から知っている外観と感覚を持つGUIツールです。このツールを使用すると、さまざまなイベントタイプの記録を開始および停止でき、これらのイベントをファイル、プロセス、ネットワークなどのカテゴリでフィルタリングでき、記録されたイベントをjson形式で保存する機能が提供されます。
Apple Instruments
Apple Instrumentsは、Xcodeの開発者ツールの一部であり、アプリケーションのパフォーマンスを監視し、メモリリークを特定し、ファイルシステムのアクティビティを追跡するために使用されます。
fs_usage
プロセスによって実行されるアクションを追跡することができます。
TaskExplorer
Taskexplorerは、バイナリが使用しているライブラリ、使用しているファイル、ネットワーク接続を確認するのに役立ちます。 また、バイナリプロセスをvirustotalに対してチェックし、バイナリに関する情報を表示します。
PT_DENY_ATTACH
このブログ投稿では、SIPが無効になっていても**PT_DENY_ATTACH
**を使用してデバッグを防止する実行中のデーモンのデバッグ方法の例が示されています。
lldb
lldbはmacOSバイナリのデバッグにおける事実上のツールです。
次の行を含むファイル**.lldbinit
**をホームフォルダに作成することで、lldbを使用する際にintelフレーバーを設定できます:
lldb内で、process save-core
を使用してプロセスをダンプします。
(lldb) コマンド | 説明 |
run (r) | ブレークポイントがヒットするかプロセスが終了するまで続行される実行を開始します。 |
continue (c) | デバッグ対象プロセスの実行を継続します。 |
nexti (n / ni) | 次の命令を実行します。このコマンドは関数呼び出しをスキップします。 |
stepi (s / si) | 次の命令を実行します。nextiコマンドとは異なり、このコマンドは関数呼び出しに入ります。 |
finish (f) | 現在の関数("frame")内の残りの命令を実行して停止します。 |
control + c | 実行を一時停止します。プロセスが実行されている場合、現在の実行位置でプロセスを停止させます。 |
breakpoint (b) | b main # main関数を呼び出す b `main # バイナリのmain関数 b set -n main --shlib # 指定されたバイナリのmain関数 b -[NSDictionary objectForKey:] b -a 0x0000000100004bd9 br l # ブレークポイントリスト br e/dis # ブレークポイントの有効化/無効化 breakpoint delete |
help | help breakpoint # ブレークポイントコマンドのヘルプを取得 help memory write # メモリへの書き込みに関するヘルプを取得 |
reg | |
x/s | メモリをヌル終端文字列として表示します。 |
x/i | メモリをアセンブリ命令として表示します。 |
x/b | メモリをバイトとして表示します。 |
print object (po) | パラメータで参照されるオブジェクトを出力します po $raw
AppleのObjective-C APIやメソッドのほとんどはオブジェクトを返すため、「print object」(po)コマンドで表示する必要があります。意味のある出力が得られない場合は、 |
memory | memory read 0x000.... memory read $x0+0xf2a memory write 0x100600000 -s 4 0x41414141 # そのアドレスにAAAAを書き込む memory write -f s $rip+0x11f+7 "AAAA" # そのアドレスにAAAAを書き込む |
disassembly | dis # 現在の関数を逆アセンブル dis -n # 関数を逆アセンブル dis -n -b # 関数を逆アセンブル dis -c 6 # 6行を逆アセンブル dis -c 0x100003764 -e 0x100003768 # 1つのアドレスからもう1つのアドレスまで dis -p -c 4 # 現在のアドレスから逆アセンブルを開始 |
parray | parray 3 (char **)$x1 # x1レジスタ内の3つのコンポーネントの配列をチェック |
objc_sendMsg
関数を呼び出す際、rsi レジスタにはヌル終端("C")文字列としてのメソッド名が格納されます。lldbを使用して名前を表示するには以下のようにします:
(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"
(lldb) print (char*)$rsi:
(char *) $1 = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"
(lldb) reg read $rsi: rsi = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"
アンチダイナミック解析
VM 検出
sysctl hw.model
コマンドは、ホストがMacOSの場合に "Mac" を返しますが、VMの場合は異なる値を返します。一部のマルウェアは、
hw.logicalcpu
とhw.physicalcpu
の値を操作して、VMであるかどうかを検出しようとします。一部のマルウェアは、MACアドレス(00:50:56)に基づいてマシンがVMwareであるかどうかを検出することもできます。
単純なコードを使用して、プロセスがデバッグされているかどうかを検出することも可能です:
if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //process being debugged }
ptrace
システムコールをPT_DENY_ATTACH
フラグとともに呼び出すこともできます。これにより、デバッガがアタッチしてトレースするのを防ぎます。sysctl
またはptrace
関数が インポート されているかどうかを確認できます(ただし、マルウェアは動的にインポートする可能性があります)この記事に記載されているように、"アンチデバッグテクニックの克服:macOSのptrace変種": "メッセージ「Process # exited with status = 45 (0x0000002d)」は、デバッグ対象が PT_DENY_ATTACH を使用していることの典型的な兆候です"
ファジング
ReportCrashは、クラッシュしたプロセスを分析し、クラッシュレポートをディスクに保存します。クラッシュレポートには、クラッシュの原因を診断するのに役立つ情報が含まれています。
ユーザーごとのlaunchdコンテキストで実行されるアプリケーションや他のプロセスの場合、ReportCrashはLaunchAgentとして実行され、クラッシュレポートをユーザーの~/Library/Logs/DiagnosticReports/
に保存します。
デーモン、システムlaunchdコンテキストで実行される他のプロセスや他の特権プロセスの場合、ReportCrashはLaunchDaemonとして実行され、クラッシュレポートをシステムの/Library/Logs/DiagnosticReports
に保存します。
クラッシュレポートがAppleに送信されるのを心配している場合は、それらを無効にすることができます。そうでない場合、クラッシュレポートはサーバーがどのようにクラッシュしたかを特定するのに役立つかもしれません。
スリープ
MacOSでのFuzzing中は、Macがスリープモードに入らないようにすることが重要です:
systemsetup -setsleep Never
pmset、システム環境設定
SSHの切断
SSH接続を介してFuzzingを行う場合は、セッションが切断されないようにすることが重要です。そのために、sshd_configファイルを以下のように変更します:
TCPKeepAlive Yes
ClientAliveInterval 0
ClientAliveCountMax 0
インターナルハンドラ
次のページをチェックして、指定されたスキームやプロトコルを処理するアプリを特定する方法を見つけてください:
pagemacOS File Extension & URL scheme app handlersネットワークプロセスの列挙
これは興味深いです。ネットワークデータを管理しているプロセスを見つけるために:
またはnetstat
またはlsof
を使用します
Libgmalloc
ファジャー
CLI ツールに適しています
macOS の GUI ツールと "just works" します。一部の macOS アプリには、ユニークなファイル名、適切な拡張子、サンドボックスからファイルを読み取る必要があるなど、特定の要件があります (~/Library/Containers/com.apple.Safari/Data
)...
いくつかの例:
もっとFuzzing MacOS情報
参考文献
WhiteIntelは、ダークウェブを活用した検索エンジンで、企業やその顧客がスティーラーマルウェアによって侵害されていないかをチェックする無料機能を提供しています。
WhiteIntelの主な目標は、情報窃取マルウェアによるアカウント乗っ取りやランサムウェア攻撃と戦うことです。
彼らのウェブサイトをチェックし、無料でエンジンを試すことができます:
Last updated