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