web-dev-qa-db-ja.com

SetProcessDEPException(false)を呼び出そうとしたときにDEP例外を取得する

古いアプリのエクスプロイトを示しています。

Windows XP SP3 32bit (EN)では、SetProcessDEPPolicy()のアドレスは通常_0x7C8622A4_です。私はそのバージョンのWindows(英語でも)を持っており、シェルコードへのリターンアドレスと_0_引数をきちんと正しく配置して、メモリ内のその場所に正確に移動するROPチェーンを正常に構築しました。スタック。

しかし、その時点で実行しようとすると、debbugerで_debugged program was unable to process exception_を取得するか、デバッガーの外部でエクスプロイトをトリガーすると_DEP exception_を取得します。

パッチレベルが原因なのかどうか疑問に思っています(最新のパッチがあります)。 SetProcessDEPPolicy()のアドレスは変更されましたか?

そのAPI関数のアドレスを自分で手動で見つけるにはどうすればよいですか?

SetProcessDEPPolicy()のアドレスが変更されていないのに、なぜ例外が発生するのですか?

以下のスクリーンショットは、例外が発生する状況を示しています。これは、エラーが発生する代わりにDEPを無効にできるはずの場所にすべてが揃っていることがわかる限りです。スクリーンショットにコメントがあり、右クリック->画像を表示することでより良い解像度を得ることができます。

enter image description here

1
Juicy

検索機能には2つの種類があります。

  1. エクスポート-超簡単。

Windowsでの使用

HANDLE kernel32 = GetModuleHandle(L"kernel32");
FARPROC funcAddr = (FARPROC *) GetProcAddress(kernel32, "SetProcessDEPPolicy");

モジュールによってエクスポートされた場合、これは関数のアドレスを返します。この場合、モジュールはkernel32です。

  1. 輸出されていない-迷惑

最初のステップは、ある種のリバースエンジニアリングを通じて最初に手動でそれを見つけることです。これは大雑把です。特定の定数エラータイプが返される可能性がある場合は、検索をいくつかの手順に絞り込むことができます。 Windowsは定数の使用が大好きで、MSDNでその使用法を文書化しています。エクスポートされていない関数が他の研究者によって文書化されている場合もあります。または、幸運にもオープンソースプロジェクトでこれを実行できる場合は、そこで定数を探すことができます。しかし、本当にあなたは古き良きファッションREを通して機能を見つけなければなりません。

あなたはそれをさらに一歩進めて、将来あなた自身でこれをより簡単にすることができます。関数への一意のバイトストリームを見つけます。次に、特定の画像でその一意のシーケンスを検索できる独自の関数を作成し、関数の先頭までのオフセットを計算します。ブームあなたは住所を持っています。

もちろん、この動的検索の使用は、バージョンごとに保証されるわけではありません。たぶん、コンパイラはSP1でSP2とは異なる最適化を行いましたか?その後、一意のストリームは無効になります。しかし、それはエクスポートされていない関数に対してあなたが持っている本当に最良のオプションです。

1
RoraΖ