1

私はそれARMがリンクレジスタを使用しているのを見ました、そしてそれがユーザースペースの悪意のあるコードによって書かれないのだろうかと思いましたか?

つまり、stackoverflow攻撃を実行して、スタック上のリターンアドレスをオーバーライドすることはできません(のようにx86)。

4

2 に答える 2

3

私はあなたの質問に質問で答えます:

関数Aが関数Bを呼び出し、関数Bが関数Cを呼び出す場合、Cの実行中にBの差出人住所はどこに保存されますか?C ...のリターンアドレスを保持しているため、リンクレジスタに含めることはできません。


余談LRですが、ユーザースペースから書き込み可能です。

于 2012-08-28T16:27:07.187 に答える
2

リンクレジスタを使用すると、ユーザー入力で上書きするのが少し難しくなりますが、不可能ではありません。最も一般的な理由はネストされた関数です。別の関数を呼び出す場合は、呼び出しによって破壊されるため、現在のLRをどこかに保存する必要があります。その論理的な場所は、他の保存されたレジスタとのスタックであり、それがほとんどのコンパイラが行うことです。したがって、バッファオーバーフローは、保存されたLRを上書きする可能性があり、その保存された値がポップされて「呼び出し元に戻る」ために使用されるときに、制御転送が発生する可能性があります。

于 2012-08-28T16:39:33.213 に答える