まず、原則
DEP -データ実行防止略語、データ実行防止。彼は、システム上で実行されている悪質なコードを防ぐために、メモリ上の追加チェックを実行するハードウェアとソフトウェアの技術です。首尾オーバーフローシェルコードへのプログラムは、プログラムがデータ・ページ上でコマンドを実行しようとしたときのデータは、非実行可能なメモリページとして識別され、CPUが悪意のあるコマンドを実行するのではなく、例外をスローする場所の基本的な原理はあります。図に示すように。
DEP -データ実行防止略語、データ実行防止。彼は、システム上で実行されている悪質なコードを防ぐために、メモリ上の追加チェックを実行するハードウェアとソフトウェアの技術です。首尾オーバーフローシェルコードへのプログラムは、プログラムがデータ・ページ上でコマンドを実行しようとしたときのデータは、非実行可能なメモリページとして識別され、CPUが悪意のあるコマンドを実行するのではなく、例外をスローする場所の基本的な原理はあります。図に示すように。
DEP主な役割は、コードを実行する(例えば、デフォルトヒープページ、さまざまなスタックページ、メモリプールページなど)のデータ・ページを防止するためです。ソフトウェアDEP(ソフトウェアDEP)とハードウェアDEP(ハードウェアDEP):マイクロソフトはに分けることができ、実装の異なるメカニズムによると、このような技術的サポートからのWindows XP SP2の提供を開始しました。
第二に、分類
ソフトウェアDEPは、実際にSafeSEHをされ、その目的は、SEHの攻撃の使用を防止するためである、このメカニズムは、CPUのハードウェアとは何の関係もない、DEPを達成するためのソフトウェア・シミュレーションを使用してWindowsには、オペレーティングシステムのためのいくつかの保護を提供します。SafeSEHを非実行可能なページ上に配置されている例外ハンドラに検証中にチェックします。
ハードウェアDEPは、DEPの本当の意味で、DEPは、CPUのハードウェアサポート、AMDとIntelが設計を行っている必要があり、AMDは無実行ページ-保護(NXと呼ばれる )、インテルは(XD)ディスエーブル・ビットを実行すると呼ばれます両方の機能と作業の原則は、本質的に同じです。
メモリは、コードから実行できないことを示すために、オペレーティングシステムのメモリページNX / XDプロパティタグによって提供されます。これを達成するためには、内のページテーブル(ページテーブル)内のメモリページ上の命令の実行を許可するかどうかを識別するために、特別なフラグ(NX / XD)を追加する必要があります。識別ビットは、命令実行中に0に設定されている場合、ページは、ページが命令1を示すように設定されることを可能にすることはできません。
ここでの唯一のハードウェアDEPの議論と分析。
それは、CPUがハードウェアDEPをサポートしているかどうか、以下の方法によって確認された「マイコンピュータ」アイコンを右クリックし、デスクトップ上の「プロパティ」を選択することができ、「システムのプロパティ」ウィンドウで「詳細設定」タブをクリックします。「詳細」タブのページで、「パフォーマンス」の「パフォーマンスオプション」ページを開き、「設定」をクリックしてください。このページでは、我々は、コンピュータ自身のCPUは、DEPをサポートしていることを確認することができ、「データ実行防止」タブをクリックします。CPUは、ページのハードウェアDEP底をサポートしていない場合は、次のプロンプトに類似があるでしょう:「お使いのコンピュータのプロセッサがハードウェアベースのDEPをサポートしていない、Windowsは、あるタイプの攻撃に対して保護するためにDEPソフトウェアを使用することができます。」。図に示すように。
第二に、分類
ソフトウェアDEPは、実際にSafeSEHをされ、その目的は、SEHの攻撃の使用を防止するためである、このメカニズムは、CPUのハードウェアとは何の関係もない、DEPを達成するためのソフトウェア・シミュレーションを使用してWindowsには、オペレーティングシステムのためのいくつかの保護を提供します。SafeSEHを非実行可能なページ上に配置されている例外ハンドラに検証中にチェックします。
ハードウェアDEPは、DEPの本当の意味で、DEPは、CPUのハードウェアサポート、AMDとIntelが設計を行っている必要があり、AMDは無実行ページ-保護(NXと呼ばれる )、インテルは(XD)ディスエーブル・ビットを実行すると呼ばれます両方の機能と作業の原則は、本質的に同じです。
メモリは、コードから実行できないことを示すために、オペレーティングシステムのメモリページNX / XDプロパティタグによって提供されます。これを達成するためには、内のページテーブル(ページテーブル)内のメモリページ上の命令の実行を許可するかどうかを識別するために、特別なフラグ(NX / XD)を追加する必要があります。識別ビットは、命令実行中に0に設定されている場合、ページは、ページが命令1を示すように設定されることを可能にすることはできません。
ここでの唯一のハードウェアDEPの議論と分析。
それは、CPUがハードウェアDEPをサポートしているかどうか、以下の方法によって確認された「マイコンピュータ」アイコンを右クリックし、デスクトップ上の「プロパティ」を選択することができ、「システムのプロパティ」ウィンドウで「詳細設定」タブをクリックします。「詳細」タブのページで、「パフォーマンス」の「パフォーマンスオプション」ページを開き、「設定」をクリックしてください。このページでは、我々は、コンピュータ自身のCPUは、DEPをサポートしていることを確認することができ、「データ実行防止」タブをクリックします。CPUは、ページのハードウェアDEP底をサポートしていない場合は、次のプロンプトに類似があるでしょう:「お使いのコンピュータのプロセッサがハードウェアベースのDEPをサポートしていない、Windowsは、あるタイプの攻撃に対して保護するためにDEPソフトウェアを使用することができます。」。図に示すように。
起動パラメータに応じて、DEPは4つの作業状態に分けることができます。
(1)がOptIn:DEPの保護だけで、デフォルトのWindowsシステムコンポーネントとサービスに他のプログラムのための保護を適用しませんが、ユーザーはで、アプリケーション互換性ツールキット(ACT、アプリケーション互換性ツールキット)上で選択したプログラムに対してDEPを有効にすることができます以下/ NXCOMPATオプションコンパイルされたプログラムを通じてVistaが自動的にDEPを適用します。このモデルは、動的にアプリケーションを閉じることができ、それは、Windows XP、Windows Vistaでは、のWindows7などのオペレーティング・システムの消費者向けバージョン、のためのより多くのです。
(2)OPTOUTは:除外リスト外のすべてのプログラムおよびサービスについてDEPをオンにし、ユーザーが手動で除外リストにDEP保護プログラムおよびサービスを有効にしないで指定することができます。このモデルは、動的には、このようなWindows 2003では、Windows 2008のように、サーバーのオペレーティング・システムに使用され、アプリケーションを閉じることができます。
(3)AlwaysOnの:DEP保護は、このモードでは、DEPは、現在唯一の64ビットオペレーティングシステム上のAlwaysOnモードで作業し、オフにすることができない、存在しないリストをソートし、すべてのプロセスに対して有効になっています。
(4)AlwaysOff:このモードでは、DEPは、動的にオンすることができない。このモードは、一般的に、プログラムの正常な動作を妨害するだけようなDEPのような特定の状況で使用され、すべてのプロセスのDEPを無効にします。
私たちは、上の画像を切り替えることがOptInとOPTOUTチェックボックスでモードを切り替えることができます。また、Cを変更することができます。DEP値boot.iniファイル/ NOEXECUTEブートエントリの動作モードを制御します。OPTOUT用のオペレーティングシステム上で動作示さ、DEPモードとして。
三、VSの環境設定
動作原理と状態DEP後はじめ、DEPと我々は密接に関連したプログラムのリンクのオプションを見て:/ NXCOMPAT。/ NXCOMPATは、Visual Studio 2005の下にあり、後にデフォルトで有効になっているリンクオプションを導入しました。Visual Studio 2008(VS 9.0)で、この本の中で使用され、メニューのプロジェクトを通じて→できる→プロジェクトのプロパティ→構成プロパティのリンカ →上級→データ実行
防止(DEP)のオプションでは、次のような、/ NXCOMPATコンパイラを使用しないことです図に示すように。
/ NXCOMPATには0x0100に設定されている場合、構造IMAGE_OPTIONAL_HEADERは、DllCharacteristics変数で実施することがPEヘッダIMAGE_DLLCHARACTERISTICS_ NX_COMPAT識別子に設けられたコンパイルされたプログラムファイルを使用DllCharacteristicsプログラムは、コンパイル/ NXCOMPATを使用して示しています。構造のIMAGE_OPTIONAL_HEADER詳細な説明について、あなたはここで、我々はあまり説明しません、MSDNの関連情報にアクセスすることができます。
/ NXCOMPAT後、一般がOptIn状態DEPで働くことはありますか?私たちは、オペレーティングシステムの以前の導入のユーザーバージョンによって知っている、DEPは、システムのコアプロセスのみ、この時間を保護何が良い、と一般的な手順については、コンパイルされたプログラムは、保護されていません。ユーザーは、ツールを通じて、自分を追加しますが、Microsoftは/ NXCOMPATコンパイラオプションを開始しましたので、潜在的に、安全上のしきい値を増やすことができますが。/ NXCOMPATコンパイルされたプログラムの後自動的にWindows Vistaおよびそれ以降のバージョンのオペレーティングシステム上でDEP保護を有効にします。
第四に、分析
オーバーフロー攻撃の起源についてDEPは、メモリ管理メカニズムを改善しました。状態への非実行可能なメモリページでは、実行スタックのシェルコードを防ぐために、バッファオーバーフローの抜本的なそのようなメカニズムは、前例のない課題をもたらしています。この本は、これまで私たちが遭遇した最も強力な保護メカニズムである、それは完全にバッファオーバーフロー攻撃を防ぐことができるのですか?答えはノーです。
セキュリティメカニズムとして、前述したように、DEPはまた、独自の制限があります。
まず、CPUがハードウェアDEPをサポートする必要はなく、すべてのCPUのDEPのためのハードウェアサポートを提供し、一部の古いCPUトップDEPでプレーすることができません。
第2に、Windowsの互換性のへのすべてのプロセスのDEP保護を開くことができない、または異常かもしれません。例えば、いくつかのサードパーティ製のプラグインDLL、それはDEPをサポートしているかどうかを確認することができないことは、プログラムがDLLがオープンDEP保護をあえてされていませんが含まれます。そして、そこにATL 7.1を使用することであるか、プログラムの以前のバージョンでは、データ・ページ上で実行可能なコードを生成する必要があり、このような状況は、そうでない場合は、プログラムが異常になり、DEP保護をオンにすることはできません。
ここでも、/ NXCOMPATコンパイラオプション、またはIMAGE_DLLCHARACTERISTICS_NX_COMPATの設定は、Windows Vistaの上記システムに対して有効です。などのWindows XP SP3、など、以前のシステムでは、この設定は無視されます。言い換えれば、これでもリンクオプションプログラムで自動的にいくつかのオペレーティングシステム上のDEP保護を有効にしません。
最後に、DEPは、最も重要な二つの状態がOptInとOPTOUTで仕事をするとき、DEPは、動的にオペレーティング・システムがDEPの状態を制御するために、いくつかのAPI関数を提供していることを示しており、上のオフとすることができます。また、残念ながら、これらの関数への以前のオペレーティングシステムのAPI呼び出しに制限はありません、すべてのプロセスがこれらのAPI関数を呼び出すことができ、大きなセキュリティリスクを植えたが、また、私たちはDEPを破るための方法を提供します。
V. CコードブレークDEP
の#include <WINDOWS.H>
のtypedef列挙_PROCESSINFOCLASS
{
ProcessDebugPort =ただし0x22
} PROCESSINFOCLASS;
の#define MEM_EXECUTE_OPTION_ENABLEを0x2
DWORDのtypedef
(NtSetInformationProcess CALLBACK *)(
HANDLEのProcessHandleでは、
PROCESSINFOCLASS ProcessInformationClass、、IN
PVOID ProcessInformationでは、
ULONG ProcessInformationLength IN);
NTSETINFORMATIONPROCESS NtSetInformationProcess;
BOOL CloseProcessDEP()
{
HMODULE hNtdll。
hNtdll = LoadLibraryA( "NTDLL.DLL")。
(hNtdll == NULL)であれば
{
OutputDebugStringA( "LoadLibraryA NTDLL.DLLエラーの\ n");
0を返します。
}
= NtSetInformationProcess(NtSetInformationProcess)のGetProcAddress(hNtdll、 "NtSetInformationProcess");
IF(NtSetInformationProcess == NULL)
{
OutputDebugStringA( "のGetProcAddress NtSetInformationProcessエラーN- \");
0を返す;
}
ULONG ExecuteFlags = MEM_EXECUTE_OPTION_ENABLE;
//閉じるDEPここで呼ばれる
DWORD dwRet = NtSetInformationProcess(GetCurrentProcess()、ProcessDebugPort、&ExecuteFlags、はsizeof(ExecuteFlags));
IF(dwRet!= 0)
{
OutputDebugStringA( "N- \ NtSetInformationProcessエラー");
戻り0;
}
リターン1;
}
バイパス理論DEPでありますこのような関数の上に構築されました。
ExecuteFlags = MEM_EXECUTE_OPTION_ENABLE ULONG;
NtSetInformationProcess(
NtCurrentProcess()//(HANDLE)-1
ProcessExecuteFlags、ただし0x22 //
&ExecuteFlagsに0x2の// PTR
はsizeof(ExecuteFlags)); // 0x4の
MEM_EXECUTE_OPTION_ENABLEは、無効NXを0x2に設定(非実行)をサポートしています。最初のパラメータは、現在のプロセスに設定することができます。
チェンジ機能が得られMSの設計上の理由は、ユーザーの状態で呼び出すことができる、それはあなたがDEPをバイパスして、現在のプロセスのためのNXのサポートを無効にするには、この関数を呼び出すことができ、ユーザーモードで言うことです。一度関数を呼び出した後、DEPによって保護されず、スレッドスタックスペースやプロセスがシェルコードを実行するために使用することができます!