スタックをアンワインドし、各 CALL に割り当てられたスタック スペースと静的に派生したローカル変数のサイズの間に不一致があるかどうかを判断する機能をデバッガーに追加しています (Ptrace を使用して、トレースされたプロセスと libbfd/libopcodes を操作しています)。途中で各フレームのアドレスとローカルスタックサイズを出力します。
私の一般的な方法論は、ベース ポインター ( EBP
/ RBP
) でアドレスを取得し、ポインターをインクリメントして格納されたフレーム ポインターを格納し、そのアドレスを逆参照し、それを調べてPTRACE_PEEKDATA
、スタック外の領域を占有するアドレスを逆参照するまで繰り返します。
コード/データ セグメント レジスタをチェックする方法は知っていますが、理想的には、W^X メモリ ページまたは実行不可能なスタックによってセグメンテーションが変更された場合でも、まだコールスタック内にあるかどうかをチェックする方法が必要です。
要するに、一般保護違反をトリガーせずにスタックの外に移動したとき、どのように確認できますか (一般的な場合)。
(余談ですが、ここではアドレスのページセグメントをチェックすることが理想的な方法であるという前提で操作していることに気付きました。おそらく、アドレスが現在のプロセスのスタックスペース内にあるかどうかを判断するための別の簡単な方法が存在します)