2

プログラムをユーザーモードで実行しているときに、x86でセグメント化されたメモリを使用することは可能ですか?もしそうなら、これを容易にするツール(例えばC / C ++コンパイラ)はありますか?これは本当に強力なメカニズムのようで、プログラム内でプログラムを実行できます。

Chromiumがネイティブクライアントのサンドボックス化にセグメンテーションを使用していると聞きましたが、その方法、またはアセンブリまたは組み込みのコンパイラサポートを使用しているかどうかはわかりません。

4

1 に答える 1

2

Native Clientは、コンパイラサポート(asm拡張子はここではgnu形式)とアセンブリの両方を使用して、セグメントレジスタを操作します。

http://www.google.com/codesearch/p?hl=en#IAaH75l62fw/service_runtime/linux/sel_segments.c&l=71

uint16_t NaClGetEs(void)
{
  uint16_t seg1;
  asm("mov %%es, %0" : "=r" (seg1) : );
  return seg1;
}
void    NaClSetEs(uint16_t   seg1)
{
  asm("movw %0, %%es;" : : "r" (seg1));
}

したがって、それは可能ですが、プログラミングするのはかなり困難です。

ネイティブクライアントに関する論文があります:http://nativeclient.googlecode.com/svn/trunk/src/native_client/documentation/nacl_paper.pdf

NaClは追加のコード検証を行います(信頼できないコードがセグメントレジスタを再プログラムすることを許可しません)が、セグメント自体を変更します。これはいくつかの問題につながります、....論文のセクション3を読んでください。

セグメンテーションの別のユーザーは、i386上のW ^Xテクノロジーを備えたOpenBSDOS(CSセグメント制限) http://www.openbsd.org/papers/ven05-deraadt/mgp00010.html(プレゼンテーション全体はhttp://www.openbsdです。 org / papers / ven05-deraadt / index.html

于 2011-02-17T19:53:05.163 に答える