
これは https://github.com/AlmondOffSec/LibTPLoadLib を一般化したもので、任意の数(実際には最大11個だが、十分)の引数を持つAPIをプロキシするためのものです。Crystal Palace 共有ライブラリとして提供されます。APIは @rasta-mouse の LibTP と互換性を持たせ、specファイルを使った簡単な切り替えを可能にしています。フックは 最新のCrystal Palace機能 を紹介するために用意されています。
警告 ⚠️ : このプロジェクトはそのままでは使用できません。call ガジェットを見つけるためのモジュールは提供していません。自分で見つける必要があります。詳細はブログ記事をお読みください。
注意 : 11個の引数を渡せること(そのうち7個はスタックに置かれます)により、call ガジェットは十分に大きなスタックフレームを持つ関数内に存在する必要があります。少なくとも 0x68 の add rsp を探してください。
警告 ⚠️ : この手法の内部動作により、プロキシされた関数の戻り値を取得することはできません。NTAPIのプロキシは、その戻り値が「単なる」NTSTATUS であるため、一般的により実用的です。ただし、関数が実際に成功したかどうかを知ることは難しくなります🙃。
ターゲット上で利用可能なモジュールから動作するガジェットを見つけます。src/tp_gadget.c で、LoadLibraryA 呼び出しにガジェットの名前をパッチし、GetCallGadgetAddress 関数がそのアドレスを取得するようにパッチします。必要に応じてアセンブリスタブをパッチします(sub rsp の値、ガジェットが呼び出すレジスタ)。
プロジェクトをコンパイルします: make。出力は Crystal Palace 共有ライブラリ libtp_gadget.x64.zip です。
サンプルCOFFをコンパイルします(wininet.dll をロードして、ローカルに割り当てたシェルコードを実行するだけのものです): make -C example_print。出力は COFF ファイル example_print.x64.o になります。
リンカーにDFR上で私たちのフックを使用するよう指示するCrystal Palace specファイルを作成します。Tradecraft Garden の Simple PIC spec ファイルを使用し、以下の行を mergelib "../libtcg.x64.zip" と export の間に追加します:
mergelib "../libtp_gadget.x64.zip"
attach "KERNEL32$LoadLibraryA" "H_LoadLibraryA"
optout "ProxyNtApi" "H_LoadLibraryA"
attach "NTDLL$NtOpenProcess" "H_NtOpenProcess"
attach "NTDLL$NtAllocateVirtualMemory" "H_NtAllocateVirtualMemory"
attach "NTDLL$NtWriteVirtualMemory" "H_NtWriteVirtualMemory"
attach "NTDLL$NtProtectVirtualMemory" "H_NtProtectVirtualMemory"
attach "NTDLL$NtFreeVirtualMemory" "H_NtFreeVirtualMemory"
attach "NTDLL$NtClose" "H_NtClose"
attach "NTDLL$NtCreateThreadEx" "H_NtCreateThreadEx"
attach "NTDLL$NtOpenThread" "H_NtOpenThread"
attach "NTDLL$NtSuspendThread" "H_NtSuspendThread"
attach "NTDLL$NtResumeThread" "H_NtResumeThread"
attach "NTDLL$NtGetContextThread" "H_NtGetContextThread"
attach "NTDLL$NtSetContextThread" "H_NtSetContextThread"
attach "NTDLL$NtWaitForSingleObject" "H_NtWaitForSingleObject"
Crystal Palace を使って全体をリンクし、PICシェルコードを作成します: path/to/crystalpalace/link simplepic_modified/loader.spec example_print/example_print.x64.o out.bin。
任意のローダーを使ってシェルコードを実行します。