SROP - Sigreturn-Oriented Programming
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)
Sigreturn
は、主にシグナルハンドラの実行が完了した後のクリーンアップに使用される特別な syscall です。シグナルは、オペレーティングシステムによってプログラムに送信される中断で、通常は何らかの例外的な状況が発生したことを示します。プログラムがシグナルを受け取ると、シグナルを処理するために シグナルハンドラ という特別な関数を使用して、現在の作業を一時的に中断します。
シグナルハンドラが終了した後、プログラムは何も起こらなかったかのように 以前の状態に戻る 必要があります。ここで sigreturn
が登場します。これは、プログラムが シグナルハンドラから戻る のを助け、シグナルハンドラによって使用されたスタックフレーム(関数呼び出しとローカル変数を格納するメモリのセクション)をクリーンアップすることでプログラムの状態を復元します。
興味深いのは、sigreturn
がプログラムの状態をどのように復元するかです:それは すべてのCPUのレジスタ値をスタックに保存することによって 行います。シグナルがもはやブロックされていないとき、sigreturn
はこれらの値をスタックからポップし、実質的にCPUのレジスタをシグナルが処理される前の状態にリセットします。これには、スタックの現在のトップを指すスタックポインタレジスタ(RSP)が含まれます。
ROPチェーンから sigreturn
syscall を呼び出し、スタックにロードしたいレジスタ値を追加することで、すべてのレジスタ値を 制御 し、したがって例えば execve
syscall を /bin/sh
で 呼び出す ことが可能です。
これは Ret2syscall の一種 であり、他の Ret2syscall を呼び出すためのパラメータを制御するのがはるかに簡単になります:
Ret2syscall興味がある方のために、これは後で値を回復するためにスタックに保存される sigcontext 構造体 です(図は こちらから):
より良い説明のために、こちらも確認してください:
こちらに例があります では、ROPを介してsigneturnへの呼び出しが構築されており(rxaに値0xf
を入れています)、これはそこからの最終的なエクスプロイトです:
Check also the exploit from here where the binary was already calling sigreturn
and therefore it's not needed to build that with a ROP:
スタックに書き込みを行い、その後**sigreturn
システムコールを呼び出すアセンブリバイナリ。スタックにret2syscallをsigreturn**構造体を介して書き込み、バイナリのメモリ内にあるフラグを読み取ることが可能です。
スタックに書き込みを行い、その後**sigreturn
システムコールを呼び出すアセンブリバイナリ。スタックにret2syscallをsigreturn**構造体を介して書き込むことが可能です(バイナリには/bin/sh
という文字列があります)。
64ビット、relroなし、canaryなし、nx、pieなし。gets
関数を悪用したシンプルなバッファオーバーフローで、ret2syscallを実行します。ROPチェーンはgets
を再度呼び出して/bin/sh
を.bss
に書き込み、**alarm
**関数を悪用してeaxを0xf
に設定し、SROPを呼び出してシェルを実行します。
64ビットアセンブリプログラム、relroなし、canaryなし、nx、pieなし。フローはスタックに書き込み、複数のレジスタを制御し、システムコールを呼び出し、その後exit
を呼び出します。選択されたシステムコールはsigreturn
で、レジスタを設定し、eip
を以前のシステムコール命令を呼び出すように移動させ、memprotect
を実行してバイナリ空間をrwx
に設定し、バイナリ空間内のESPを設定します。フローに従って、プログラムは再度ESPに読み込みを呼び出しますが、この場合ESPは次の命令を指しているため、シェルコードを渡すことで次の命令として書き込み、実行します。
SROPは、シェルコードが配置された場所に実行権限(memprotect)を与えるために使用されます。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)