Ret2esp / Ret2reg
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
ESP(スタックポインタ)が常にスタックの最上部を指しているため、この技術はEIP(命令ポインタ)を**jmp esp
またはcall esp
**命令のアドレスで置き換えることを含みます。これにより、シェルコードは上書きされたEIPの直後に配置されます。ret
命令が実行されると、ESPは次のアドレスを指し、正確にシェルコードが格納されている場所になります。
**アドレス空間配置のランダム化(ASLR)**がWindowsまたはLinuxで有効でない場合、共有ライブラリに見つかるjmp esp
またはcall esp
命令を使用することが可能です。しかし、ASLRが有効な場合、これらの命令を見つけるために脆弱なプログラム自体を調べる必要があるかもしれません(そしてPIEを打破する必要があるかもしれません)。
さらに、EIPの破損の後にシェルコードを配置できることは、関数の操作中に実行されるpush
またはpop
命令がシェルコードに干渉しないことを保証します。この干渉は、シェルコードが関数のスタックの中間に配置された場合に発生する可能性があります。
RIPを上書きした後に書き込むスペースが不足している場合(おそらく数バイトだけ)、初期の**jmp
**シェルコードを次のように書き込みます:
スタックの早い段階にシェルコードを書きます。
この技術の例はhttps://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rspで見つけることができ、最終的なエクスプロイトは次のようになります:
この技術の別の例はhttps://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.htmlで見ることができます。NXが有効でないバッファオーバーフローがあり、$esp
のアドレスを減少させるためにガジェットが使用され、その後shellcode
にジャンプするためにjmp esp;
が使われます。
同様に、関数がシェルコードが格納されているアドレスを返すことが分かっている場合、call eax
または jmp eax
命令(ret2eax テクニックとして知られる)を利用して、シェルコードを実行する別の方法を提供できます。eaxと同様に、興味深いアドレスを含む他のレジスタも使用できます(ret2reg)。
いくつかの例はここにあります:
strcpy
は eax
にシェルコードが格納されているバッファのアドレスを保存し、eax
は上書きされていないため、ret2eax
を使用することが可能です。
ARM64 では、SP レジスタにジャンプする命令は存在しません。レジスタに sp を移動させ、そのレジスタにジャンプするガジェットを見つけることができるかもしれませんが、私の Kali の libc ではそのようなガジェットを見つけることができませんでした:
私が発見した唯一のものは、spがジャンプする前にコピーされたレジストリの値を変更するものでした(そのため、それは無意味になります):
もしレジストリに興味深いアドレスがあれば、適切な命令を見つけることでそこにジャンプすることが可能です。あなたは次のようなものを使用できます:
ARM64では、**x0
**が関数の戻り値を格納します。したがって、x0がユーザーによって制御されるバッファのアドレスを格納し、実行するシェルコードを含む可能性があります。
Example code:
関数の逆アセンブルを確認すると、バッファへのアドレス(bofに対して脆弱で、ユーザーによって制御される)が、バッファオーバーフローから戻る前に**x0
に格納されている**ことがわかります:
また、**do_stuff
関数内にbr x0
**というガジェットが見つかることもあります:
バイナリがPIEなしでコンパイルされているため、そのガジェットを使用してそこにジャンプします。パターンを使用すると、バッファオーバーフローのオフセットは80であることがわかるので、エクスプロイトは次のようになります:
もし fgets
の代わりに read
のようなものが使われていた場合、戻りアドレスの最後の2バイトだけを上書きすることで PIEをバイパスすることが可能だったでしょう。br x0;
命令に戻るために完全なアドレスを知る必要はありませんでした。
fgets
では、最後にヌル (0x00) バイトを追加するため、うまくいきません。
NX: スタックが実行可能でない場合、シェルコードをスタックに配置して実行するためには役に立ちません。
AWSハッキングを学び、練習する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、練習する: HackTricks Training GCP Red Team Expert (GRTE)