web-dev-qa-db-ja.com

EIPは何の略ですか?

eipを参照するtonの質問がここにあります:

EIPとは何ですか?エクスプロイトターゲットとしても、無害なコードとしても、どのように使用されますか?

17
Ares

EIPは、x86アーキテクチャー(32ビット)のレジスターです。スタックの「拡張命令ポインター」を保持します。つまり、次のコマンドを実行するために次に進む場所をコンピューターに指示し、プログラムのフローを制御します。

レジスターがどのように機能するかをよりよく理解するためにアセンブリ言語を研究します。 Skull Security には優れた入門書があります。

18
HashHazard

コンピュータが追跡する必要のある基本的なことの1つは、実行されている命令がメモリ内のどこにあるかです。

これは通常、CPUによって命令ポインタまたはプログラムカウンタレジスタ と呼ばれるものを使用して行われます。正確な名前はアーキテクチャによって異なりますが、この概念はすべてのアーキテクチャで一般化されています。これはIntel CPUでは命令ポインタと呼ばれ、この回答で使用する用語です。命令ポインタは、メモリから命令が実行されている間、継続的にインクリメントされ、ある種のジャンプ命令が実行されるたびに更新されます。複数の並列実行パイプラインと複数のコアを備えた最新のCPUアーキテクチャでは、CPUの内部で実際に何が行われているのかがさらに複雑になりますが、外部の観察者にとって、何が行われているのか、および関連するレジスタの目的を理解するには、簡単な説明で十分です。

古いIntel 8086/8088、80186および80286は16ビットプロセッサであるため、命令ポインターは通常、コードセグメント(code selector 80286、ただしプロテクトモードのセレクターを除いて、セレクターはセグメントと非常によく似ています)および命令ポインター。アセンブラparlaceでは、CS:IPコロンは、メモリアドレスを形成するためのセグメントとオフセットのペアとしてのペアを示します。ここでのCSとIPはCPUレジスタであり、CPUチップ自体内の小さなメモリロケーションです。この特定のケースでは、サイズはそれぞれ16ビットです。 (DS:DXこれは、通常、メモリ内のデータを読み書きする場所です。 DS was data segmentであり、DXは、この場合はデータセグメントオフセットを保持する汎用レジスターです。それぞれAX、BX、CXおよびDXとして、それぞれ上半分-たとえばAH-または下半分-AL、および特定の最近のCPUには多数のレジスターがあり、数十のレジスターが一般的で、100を超えるレジスターは前代未聞ではありません。

Intelは1980年代後半に80386 CPUを作成する際に、アドレス空間を32ビットに拡張するなど、多くの変更を加えました概念としてセレクターを維持しながら。このため、古い16ビット値では不十分で、命令ポインタが32ビットに拡張されました。完全な下位互換性を維持するために(この時点で、Intelはおそらく80286のレッスンを学びましたが、これはより一方向の互換性があります。8086/ 8088のリアルモードから80286の保護モードですが、戻るのははるかに困難であり、これは実際には問題であることが判明しました)、32で動作しているときに、CPUが命令ポインターを保持するための新しいレジスタが必要でしたビットモード。

80386では、拡張(32ビット)レジスタはExxという名前でしたが、対応する16ビットレジスタは以前はxxと呼ばれていました。したがって、たとえば、古い16ビットアキュムレータレジスタAXと拡張された32ビットアキュムレータレジスタEAX(16ビットの半分のEAHとEAL)が得られます。この命名規則に従って、拡張命令ポインタレジスタはEIPと呼ばれていました。

余談ですが、多くの場合、正しい値は単なるEIPではなくCS:EIPです。これは、EIPの値が、コードセレクターによって定義されている開始位置からoffsetのままであるためです。

13
a CVn

EIPは、基本的なプログラム実行レジスタです。

-エクスプロイトのターゲットとして、pg。 Intelマニュアルの81はそれをすべて言う

ソフトウェアからEIPレジスタに直接アクセスすることはできません。制御転送命令(JMP、Jcc、CALL、RETなど)、割り込み、例外によって暗黙的に制御されます。 EIPレジスタを読み取る唯一の方法は、CALL命令を実行してから、プロシージャスタックから戻り命令ポインタの値を読み取ることです。 EIPレジスタは、プロシージャスタックの戻り命令ポインタの値を変更し、戻り命令を実行することにより、間接的にロードできます。

コードセグメントレジスタ(CS)とEIPの組み合わせがこの「論理アドレス」を作成することを考えると、プログラムの実行でEIPが果たす役割を理解するのは単純ですが複雑に見えます。すべてのx86 CPUがプリフェッチを使用するため、バスから読み取られる命令はEIPレジスタに何があるか。単純な部分は、EIPの値が次の命令の場所を決定するために使用されることです。これにより、前の命令に戻るか、直線コードで進むかが決まります。以前の命令で得られた結果はEAXに保存されます。

-そして無害なコードで?

コードがアルゴリズムを実行したり、関数を呼び出したりするときはいつでも、必ずこのレジスターを利用します。

1
Robert Houghton