Cでのスタックオーバーフローについて質問があります。小さなテストプログラムを作成したので、8で開始すると、期待どおりの結果が得られ、2番目のbufの境界を上書きします。そのため、buf1は空になります。末尾のゼロは、buf1の最初の要素になりました。これまでのところ、16で試してみると、17 Asでイベントも機能するので、うまくいきます。しかし、私はここでセグメンテーション違反を期待します...セグメンテーション違反は24Asの後に発生します。何故ですか?x86-32 ubuntu、debian、suseでテストしました。常に24バイト後にsegfault...同じコードのAMD64システムでは、32 As後にsegfaultが発生します。予想どおり、24後のx86-32ではなぜですか????
含む
#include <string.h>
/*
* $ gcc -O0 -Wall -fno-stack-protector buffer.c -o buffer
*
* $ ./buffer AAAAAAAA
* buf1: test
* buf2: test
* buf1:
* buf2: AAAAAAAA
*
* $ ./buffer AAAAAAAAAAAAAAAAAAAAAAAA
* buf1: test
* buf2: test
* buf1: AAAAAAAAAAAAAAAA
* buf2: AAAAAAAAAAAAAAAAAAAAAAAA
* Segmentation fault (core dumped)
*/
static void exploit(const char *InputString)
{
char buf1[8];
char buf2[8];
strcpy(buf1, "test");
strcpy(buf2, "test");
printf("buf1: %s\n", buf1);
printf("buf2: %s\n", buf2);
strcpy(buf2, InputString);
printf("buf1: %s\n", buf1);
printf("buf2: %s\n", buf2);
}
int main(int argc, const char *argv[])
{
if (argc > 1)
exploit(argv[1]);
return 0;
}