C言語の以下のコードを実行しました。
このコードは、char型の配列を2つ作り、そのうち後に定義した変数に
大きい数値を入力し、スタックオーバーフローを起こさせてみる、というものです。
環境、コンパイラは ”gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4" です。
#include<stdio.h> #include<string.h> int main(int argc,char *argv[]){ char buffer_one[8], buffer_two[8]; printf("Buffer size : %d\n", sizeof(buffer_one)); int i; for(i=0;i<8;i++) printf("buffer_one[%d] : %p buffer_two[%d] : %p\n", i, &buffer_one[i], i, &buffer_two[i]); putchar('\n'); strcpy(buffer_one,"one"); strcpy(buffer_two,"two"); printf("[前] buffer_two は %p にあり、その値は \'%s\' です\n", buffer_two, buffer_two); printf("[前] buffer_one は %p にあり、その値は \'%s\' です\n", buffer_one, buffer_one); printf("\n[STRCPY] %d バイトを buffer_two にコピーします\n\n", strlen(argv[1])); strcpy(buffer_two, argv[1]); printf("[後] buffer_two は %p にあり、その値は\'%s\' です\n", buffer_two, buffer_two); printf("[後] buffer_one は %p にあり、その値は\'%s\' です\n", buffer_one, buffer_one); }
このプログラムの実行結果は以下です。(スタックの保護は -fno-stack-protector オプションでなくしています)
****@****:~$ ./a.out 12345678901234567890 Buffer size : 8 buffer_one[0] : 0x7fffa6e10730 buffer_two[0] : 0x7fffa6e10720 buffer_one[1] : 0x7fffa6e10731 buffer_two[1] : 0x7fffa6e10721 buffer_one[2] : 0x7fffa6e10732 buffer_two[2] : 0x7fffa6e10722 buffer_one[3] : 0x7fffa6e10733 buffer_two[3] : 0x7fffa6e10723 buffer_one[4] : 0x7fffa6e10734 buffer_two[4] : 0x7fffa6e10724 buffer_one[5] : 0x7fffa6e10735 buffer_two[5] : 0x7fffa6e10725 buffer_one[6] : 0x7fffa6e10736 buffer_two[6] : 0x7fffa6e10726 buffer_one[7] : 0x7fffa6e10737 buffer_two[7] : 0x7fffa6e10727 [前] buffer_two は 0x7fffa6e10720 にあり、その値は 'two' です [前] buffer_one は 0x7fffa6e10730 にあり、その値は 'one' です [STRCPY] 20 バイトを buffer_two にコピーします [後] buffer_two は 0x7fffa6e10720 にあり、その値は'12345678901234567890' です [後] buffer_one は 0x7fffa6e10730 にあり、その値は'7890' です
この結果を見ると、何故か buffer_one と buffer_two の間に
8バイトの間があるのがわかります。
連続して作った変数で、どちらも大きさは8バイトなのになぜこうなるのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/14 18:07
2017/08/14 18:33
2017/08/14 18:35
2017/08/14 18:37 編集
2017/08/14 19:09
2017/08/14 19:20