変更を防ぐために、vtables が読み取り専用としてメモリに格納されていることを知っています。vtables を正確に格納しているのはどのセクションですか?
別の質問として、vtables が持っている読み取り専用権限によると、エクスプロイト書き込みプロセスでどのように変更されたのでしょうか?
vtable が読み取り専用メモリに格納されているという考えはどこから得られますか? vtable の実装は完全にコンパイラで定義されており、読み取り専用であるという保証はまったくありません。多くの実装では、書き込み保護が利用できない場合など、書き込み可能なメモリに格納される可能性があると思います。
vtable 自体が書き込み保護されている場合でも、オブジェクト インスタンス内の vtable ポインターを変更して、実際の vtable のように見える選択したメモリを指し示すことができない理由はありません。それを利用して、別の関数にジャンプします。
まず、仮想メソッド テーブルは、大部分の C++ コンパイラの実装の詳細です。さらに、コンパイラは仮想テーブルを読み取り専用メモリに保存することを標準で義務付けられていません (これは、C++ がターゲット ハードウェア アーキテクチャに読み取り専用メモリをまったく必要としないことを考慮すると明らかです)。したがって、すべてのコンパイラがそうしているわけではありません。読み取り専用メモリが使用可能であっても、実行できるものと実行できないものがあります。
次に、一部のシステムで一部のC++ コンパイラが vtables を使用し、実行可能ローダーが読み取り専用メモリにロードされるように宣言する場合: ローダーがメモリ ステータスを読み取り専用に変更できる場合、一部のアーキテクチャでは十分な権限を持つプログラム元に戻すことができる場合があります。ただし、メモリが物理的に読み取り専用の場合、実行可能ローダーでも変更する方法がないため、プログラムは ROM のバリアントに存在する必要があります。これは間違いなく可能であり、この場合 (ハードウェアで保護された読み取り専用メモリ) 悪意を持って上書きする方法はありません。