web-dev-qa-db-ja.com

正当なプログラムに「jmp esp」命令があるのはなぜですか?

一般的なエクスプロイトトリックは、スタックオーバーフローを使用して命令ポインターを上書きし、コードセグメントのどこかでjmp esp命令を指すようにして、攻撃者が選択した任意のコードを実行するようです。

ただし、正当なプログラム(通常、自己変更ではなく、すべての実行可能コードがコードセグメントに格納されている)を使用して、最初にそのようなjmp esp命令を含めるとどうなるかを理解するのに苦労します。場所。

7
1110101001

命令jmp espFF E4としてエンコードされます。実際のjmp命令を見つける必要はありません。他のコードやデータの真ん中にあるバイトだけを見つける必要があります。

これは、リターン指向プログラミング(ROP)の基礎であり、これらの有用な命令の小さなシーケンスは、しばしば「ROPガジェット」と呼ばれます。

この特定の手法は、実行不可能なスタックによって簡単に破られることに注意してください。 (JITコンパイラーのような特定の場合を除いて)実行可能スタックを要求することは非常にまれであるため、これは単純で効果的な緩和策です。これを回避するために、return-to-libcのようなテクニックがあり、これらの小さなROPガジェットをいくつか連鎖させて、より長い命令シーケンスを構築します。

6
David