コード/ソフトウェアはどのようにしてメモリ内の想定されていない場所にアクセスできるようになるのでしょうか?

コード/ソフトウェアはどのようにしてメモリ内の想定されていない場所にアクセスできるようになるのでしょうか?

デフォルトでは、アプリケーションを実行すると、アクセスできる RAM の量が制限されますよね? 技術的には、私の VLC は Chrome が使用するメモリ アドレスにアクセスできませんでした。しかし、オペレーティング システム/コンパイラが、コードが許可されていないアドレスへのアクセスを誤って許可することはどのように可能でしょうか。多くの「エクスプロイト」や「ペイロード」がこの事実を利用して、多くのスペースを占有し、他のアドレスに「オーバーフロー」する変数を作成することは知っていますが、これは実際にはどのように起こるのでしょうか?

一部のプログラムは他のプログラムよりもこの傾向が強いのでしょうか? どの言語でコーディングされているかは関係あるのでしょうか? たとえば、C ではメモリを自由に操作できますが、Java ではできないことは知っています。

また、これの利点は何でしょうか? 誰かが悪意のあるコードを書いてメモリ内のどこかにアクセスした場合、何ができるでしょうか? 私が考えられる唯一のことは、RAM に保存されたパスワード/キーです。

追伸これを Stack Overflow に投稿することも考えましたが、私の質問はプログラミングの観点に特に関連したものよりもずっと広範囲です。間違った場所に投稿してしまった場合は申し訳ありません。

答え1

奇妙なことに、それはオーバーフローを伴う -スタックオーバーフロー- 対象プログラムの動作を変更したりクラッシュさせたりするために、慎重に作成されたプロセスを使用して、必要以上にスペースを使用する

答え2

具体的なポイント:通常、関心のある「オーバーフロー」は、あるアプリケーション(プロセス)が別のアプリケーション(プロセス)を上書きすることを許可するものではありません。むしろ、プロセスが処理しているデータによってプログラムが自分自身の一部(通常はスタック、場合によっては間接的に)をそのデータで上書きし、その結果、そのプロセス

その後、そのプロセスは通常のIPCとシステムコールでやり取りし、アカウントがアクセスできる他のすべてのものを乗っ取ることができます。VLCは通常のアドレスではChromeのメモリスペースにアクセスできませんが、できる:

  • デバッガーを装い、Chrome プロセスにアタッチして変更します。
  • ファイルとアカウント設定を書き換えて、今後ログインするたびにコードが実行されるようにします。
  • ネットワーク接続を開き、他のマシンに拡散します。

残念ながら、最近のオペレーティングシステムは、時折の例外はあるものの、実行するすべてのプログラムをアカウント内のすべてで完全に信頼していると想定しています。これは、専門家だけが使用するネットワーク化されていないタイムシェアリングシステムの時代(OSが提供する保護がユーザー同士を互いに保護した(自社のソフトウェアからではなく)

関連情報