2017-07-26 12 views
4

私はエクスプロイトがどのように動作するかについて読んでいます。スタックのリターンアドレスを上書きして動作するようです。これをもっと難しくするために(スタック型カナリアス、ASLR、DEPなど)多くの努力が払われてきましたが、ハードウェア製作者にとってレジスタを追加する方が簡単で、返却アドレスを保持することになります。この方法では、リターンアドレスは定義によってバッファオーバーフローによって上書きされませんでした。コールとレットはまだ存在し、今日のCPUと同じように動作します(唯一の違いはリターンアドレスを格納する場所です)、互換性に関する問題はあまりないように見えます。アドレスにアクセスするためにRAMの代わりにレジスタを使用しているので、パフォーマンスの影響はおそらくプラスになります(ただし重要ではありません)。別のレジスタを使用してリターンアドレスを格納していますか?

インテルは、2つの余分なレジスタを必要とするにもかかわらず、MPXが実装されているため、セキュリティ目的でさらに多くのレジスタを割り当てる余裕があるようです。だから、なぜ彼らは復帰アドレスを格納する特別なレジスタを追加しないのですか?

+0

これはまったく不愉快なアイデアではありません。私はどこかで読んでいます(残念ながら、私はどこを覚えていませんか)。部屋の象は、任意にネストされた関数呼び出しを許可するスタック構造が必要であるということです。別のコール/スタックスタック(これは以前私が指摘していたアイデアです)はより強固に見えます。互換性の問題は避けられませんが、関数呼び出し中にスタックがどのように満たされているかに依存するツールもありますが、私たちは(さらに別の)移行期間を設けることができると信じています。 –

+0

ネストされたコールをどのように解決しましたか? (メモリに値を格納することを除いて、コードによって任意に操作することができます) – Ped7g

+1

オンチップリターンアドレスを持つことのパフォーマンス上の利点は、[リターンアドレスキャッシュ](https://priorart.ip。 com/IPCOM/000108056)を使用して、RET命令の結果を予測する。 –

答えて

2

これは既に存在します。

  • SPARCは、基本的にCPUが節約され、レジスタ1つの関数の呼び出し/リターンを復元register windowsと呼ばれるものがあります:私は3つのアーキテクチャとそのような機能を備えた一つの言語を知っています。慣例により、戻りアドレスは関数呼び出し時にレジスタo7に格納され、呼び出し先がスタックフレームを確立するとi7にローテーションされます。呼び出し先が別の関数を呼び出すと、このアドレスは危険なコードで触れられずに内部レジスタスタックに移動します。
  • クヌスのMMIXも同様の設計ですが、リターンアドレスは関数呼び出し時にほとんどアクセスできないレジスタスタックに直接格納されるため、必要なものはかなりです。
  • ARMとARM64のリンクレジスタはです。関数呼び出しでは、リターンアドレスがリンクレジスタに格納されます。関数リターンは、リンクレジスタ内のアドレスへの間接的なジャンプだけです。これは実際にリンクレジスタの内容をネストされた関数呼び出しでスタックに格納しなければならないので、リーフ関数以外の機能(つまり、他の関数を呼び出さない関数)では余分なセキュリティを無効にします。
  • Forthプログラミング言語は、値のスタックと戻りアドレスのスタックがそれぞれ1つずつ設計されています。どちらのスタックもプログラムで自由に操作できますが、リターンスタックを操作するときは注意が必要です。実際には、これは、リターンスタック用のアーキテクチャのレジスタとデータスタック用のレジスタのいずれかを使用して実装されます。これはまた、あなたが言及した問題を解決するが、十分に賢いプログラマーは、間違った入力がリターンスタックを壊すことを許すことによって、まだまだ混乱する可能性がある。
+0

レジスタウィンドウは、ハードウェアのパイプライン化とより良いコンパイラ最適化を実現するハードウェア機能です...あなたが探している機能ではありません。彼らはSparcが生きなければならない欠陥です。 – cb88

+0

@ cb88パイプライニングをどのように妨げていますか? – fuz

+0

当初は、コンパイラがレジスタロード/ストア命令をうまくスケジューリングするためにあまりにも愚かであったため、それらは入れ替えられましたが、レジスタウィンドウは実際には良いコンパイラよりも遅く、電力効率が悪いです...パイプラインははるかに複雑であり、実装方法によってはストールやバブルの可能性が増します。そしてSparcはそれを行うのは、仕様に入っているからです。 – cb88

関連する問題