ウィキペディアによると、NXビットはすべてのx64バイナリに設定されています。
OS X for Intelは、AppleによってサポートされるすべてのCPUでNXビットをサポートします(10.4.4以降–最初のIntelリリース以降)。MacOS X 10.4は、NXスタック保護のみをサポートします。MacOS X 10.5、すべての64ビット実行可能ファイルにはNXスタックとヒープ、W ^ X保護が含まれます。これには、x86-64(Core 2以降)およびG5 Mac上の64ビットPowerPCが含まれます。
ただし、実行可能ファイルが64ビットでない場合はどうなりますか:Mach-O executable i386
?
同様に、ASLRの場合、ウィキペディアは、デフォルトで10.7以降で有効になっていると述べています。
Mac OS X Lion 10.7(2011年7月リリース)では、Appleがすべてのアプリケーションをカバーするように実装を拡張し、「アドレススペースレイアウトランダム化(ASLR)がすべてのアプリケーションで改善されました。 32ビットアプリの場合(ヒープメモリ保護と同様)、64ビットアプリケーションと32ビットアプリケーションの攻撃に対する耐性を高めます。」
これは、コンパイラオプションを介してオプトアウトする方法がないことを意味しますか?ある場合、アプリケーションがそうでないことをどのように確認できますか?一部のライブラリーがASLR化されている可能性があるが、他のライブラリーはそうではないWindowsとの類似点はありますか?
NXビットはAMDアーキテクチャ用、XビットはIntel用です。基本的に、ページが実行可能かどうかを知りたい。 vmmap <pid or partial process name>
は、メモリチャンクの権限を一覧表示します。
OS XでASLR(PIE、正確には)を確認するには、otool -hv <file_path>
を使用して「PIE」フラグをチェックアウトします。たとえば、私のi386
WiresharkにはPIEフラグがありません(おそらくb/cであり、フラグなしでコンパイルされています)。 10.9ではどのようになっているのかわかりませんが、10.7では--no_pie
フラグを使用してプログラムをリンクし、PIEを無効にできます。
https://github.com/electron-archive/brightray/blob/master/tools/mac/change_mach_o_flags.py に興味深いスクリプトがあり、質問に答えることができます。実際にcanを使用して、コンパイル済みのバイナリを--no-pie
フラグでスクリプトからオプトアウトできます。その一部を引用して、ソース全体を読んでもらいましょう。
...
実行不可のヒープ
従来、Mac OS Xでは、32ビットプロセスには実行を禁止するように設定されたデータページがありませんでした。ユーザープログラムはmprotectとmach_vm_protectを呼び出してデータページ内のコードの実行を拒否できますが、カーネルはページテーブルを更新せずにそのような要求を黙って無視し、ハードウェアはそのようなページでコードを喜んで実行します。 64ビットプロセスには、常にデータページの適切なハードウェア保護が与えられました。この動作は、デフォルトで1に設定されているvm.allow_data_exec sysctlを介してシステム全体のレベルで制御可能でした。値が1のビット(デフォルトで設定)は、32ビットプロセスのデータページでのコード実行を許可し、ビット値2(デフォルトではクリア)を指定すると、64ビットプロセスに対して同じことが行われます。
Mac OS X 10.7では、実行可能ファイルを「オプトイン」して、適用されたデータページでのコード実行に対するハードウェア保護を適用できます。これは、|フラグ|に新しいビットを設定することによって行われます実行可能ファイルの| mach_header |のフィールド。 MH_NO_HEAP_EXECUTIONが設定されている場合、vm.allow_data_execの設定に関係なく、適切な保護が適用されます。
...
その上に、SOページへのリンクを追加する必要があります。この問題に関連する2つの非常に良い答えがあります: https://stackoverflow.com/questions/12824045/what-正確にランダム化された-aslr-in-macos-x-and-ios