スタックに直接ジャンプするのではなく、JMPESPを使用する理由



Why Jmp Esp Instead Directly Jumping Into Stack



解決:

スタック上のバ​​ッファがオーバーフローしているため、エクスプロイトペイロードはスタックに到達します。これにより、リターンアドレスも制御できるようになります。

ESPは、ペイロードの開始を直接指します(実行後スタック上のリターンアドレスを上書きする4バイトの直後にペイロードを配置するため、攻撃している関数でretします。retは4(または8)バイトをEIPにポップし、ESPが直接続くペイロードを指すようにします。



しかし、その時点でESPがどのような価値を持つかはわかりません 、スタックASLRのため、およびこの時点までの呼び出しスタックの深さが異なるため、アドレスが変更される可能性があります。 したがって、正しい差出人住所をハードコーディングすることはできません

しかし 次のようにデコードするバイトがある場合jmpespまたはプロセスのメモリ内の固定(非ASLR)アドレスの任意の場所でespを呼び出します 、ハードコーディングできます それ エクスプロイトのリターンアドレスとしてのアドレス。実行はそこに行き、次にペイロードに行きます。



実際、これはよくあることです。一部のDLLでは、コードに対してASLRが有効になっておらず、メインの実行可能ファイルのコードもASLRされていない可能性があります。

ASLRのコード 全て コードはjmp esp攻撃。ただし、攻撃者がターゲットプロセスにアドレスをリークさせる可能性がある場合を除きます。

64ビットコードの場合、使用できない可能性が高いことに注意してくださいコードアドレスには先頭が含まれるため、文字列ベースのバッファオーバーフローのjmp rsp0バイト。




したがって、jmp espは、(非常に大きなNOPスレッドを使用して)リターンアドレスを繰り返し推測するよりもはるかに信頼性の高いエクスプロイトを提供します。

推測を繰り返すと、間違っているたびにターゲットプロセスがクラッシュしますが、jmp espは、最初の試行で成功する可能性が高くなります。これにより、クラッシュログが残らないようになります。また、クラッシュしているサーバープロセスを探し、IPアドレスなどからの接続をブロックする侵入検知システムを無効にする可能性もあります。


探している2バイトの命令は、プログラムが正常に実行されたときに別の命令の一部として、または静的データとして表示される可能性があることに注意してください(特に読み取り専用データは実行可能ページにあることがよくあります)。したがって、2バイトのシーケンスを検索する必要があります。プログラムの分解におけるjmpesp。コンパイラは決して使用しませんjmp espなので、その方法で見つけることはできません。


より一般的には 、任意のレジスタ内のバッファポインタで終了する任意の関数(例:memcpyまたは特にstrcpy)は ret2reg 攻撃、jmpeax命令。

これは、アドレスのゼロバイトが高い64ビットモードで機能します。もしもstrcpyの末尾のゼロはその上位アドレスバイトを書き込みます。エクスプロイト文字列の終わりは、スタック上のリターンアドレスを上書きするゼロ以外のアドレスバイトである可能性があります。

この場合、実行可能ペイロードは 関数がレジスタポインティングを残すバッファ内のスポットにあるリターンアドレス。 (通常、レジスターにバッファーへの有用なポインターがある場合は、バッファーの先頭)。


バッファがオーバーランした後、ESPはシェルコードを持ちます。あなたは免疫でそれを確認することができます、EIPはESPを指しなければなりません。私の理解では、エクスプロイトの前に、システムDLLは、DLLがいつ呼び出されるかに応じて、ESPを使用する必要があります。

しかし、バッファがオーバーフローした後、EIPはどこを指すべきかわかりません。 EIPに渡す4バイトは、[jmpESP]アドレスのいずれでもかまいません。

だからそれはこのようになります-

  1. EIPまで正確にバッファをオーバーフローさせます
  2. [jmpESP]アドレスをEIPに渡します
  3. ESPに保存された値が実行されます(NOP +シェルコード)

[jmp ESP]でエクスプロイトを作成し、アドレスのバリエーションを使用しましたが、そのたびに脆弱性を悪用する可能性がありました。

これがexploit.pyです。RPCRTdllを使用していることに注意してください。ただし、shell32.dllやその他のシステムdllも使用できます。

https://github.com/shankar-ray/Exploit-Development/blob/master/exploit-py

私はいくつかの追加のNOPでシェルバインドシェルコードを使用しています。

ところで、OSに何らかの保護がある場合、またはコンパイラが元のsrcコードのコンパイル中にいくつかの保護を追加した場合。これは、シェルコードの場所を見つけるための宝探しになります。次に、シェルコードに到達するためにいくつかのジャンプを使用する必要があります。

お役に立てば幸いです。