バッファオーバーフローについて読んで、以下のサンプルコードに出くわしました:-
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1,2,3);
}
それは、私が推測する楽しみと利益のためにスタックを粉砕するという有名な記事からのものです。(参考: http: //insecure.org/stf/smashstack.html)
この記事では、メモリ アドレスはワード サイズの倍数 (この場合は 1 ワード = 4 バイト) でしかアクセスできないため、buffer1 と buffer2 にスペースを割り当てるには 20 バイト (buffer1 に 8 バイト、buffer2 に 12 バイト) が必要であると述べています。
しかし、メモリはバイトアドレス指定可能であることを思い出します。つまり、メモリから一度に1バイトにアクセスできます。これをプロセッサのビット数と関連付けました。たとえば、32 ビット プロセッサは 2^32 のメモリ ロケーションにアクセスでき、1 つのメモリ ロケーションが 1 バイト (8 ビット) を保持するため、32 ビット プロセッサのアドレス可能なメモリの合計は (2^32)/(1024*1024*1024) = 4096 に等しくなります。 MB = 4GB。
上記の例では、buffer1 と buffer2 の両方が 1 バイトを必要とする char 型であるため、buffer1 と buffer2 にそれぞれ 5 バイトと 10 バイトを割り当てることができないのはなぜですか?
メモリ アクセスがワード サイズの倍数に制限されるのはなぜですか?