私はそれARM
がリンクレジスタを使用しているのを見ました、そしてそれがユーザースペースの悪意のあるコードによって書かれないのだろうかと思いましたか?
つまり、stackoverflow攻撃を実行して、スタック上のリターンアドレスをオーバーライドすることはできません(のようにx86
)。
私はそれARM
がリンクレジスタを使用しているのを見ました、そしてそれがユーザースペースの悪意のあるコードによって書かれないのだろうかと思いましたか?
つまり、stackoverflow攻撃を実行して、スタック上のリターンアドレスをオーバーライドすることはできません(のようにx86
)。
私はあなたの質問に質問で答えます:
関数Aが関数Bを呼び出し、関数Bが関数Cを呼び出す場合、Cの実行中にBの差出人住所はどこに保存されますか?C ...のリターンアドレスを保持しているため、リンクレジスタに含めることはできません。
余談LR
ですが、ユーザースペースから書き込み可能です。
リンクレジスタを使用すると、ユーザー入力で上書きするのが少し難しくなりますが、不可能ではありません。最も一般的な理由はネストされた関数です。別の関数を呼び出す場合は、呼び出しによって破壊されるため、現在のLRをどこかに保存する必要があります。その論理的な場所は、他の保存されたレジスタとのスタックであり、それがほとんどのコンパイラが行うことです。したがって、バッファオーバーフローは、保存されたLRを上書きする可能性があり、その保存された値がポップされて「呼び出し元に戻る」ために使用されるときに、制御転送が発生する可能性があります。