我有一个关于 C 中的堆栈溢出的问题。我写了一个小测试程序,所以当我用 8 As 启动它时,我得到了我所期望的,我写在第二个 buf 的边界上,因此 buf1 是空的,因为现在,尾随零是 buf1 中的第一个元素。到目前为止一切顺利,如果我尝试使用 16 As 它也可以,使用 17 As 进行事件。但我预计这里会出现段错误……段错误在 24 As 之后出现。这是为什么?我在 x86-32 ubuntu、debian 和 suse 上进行了测试。总是在 24 字节后出现段错误……在具有相同代码的 AMD64 系统上,我在 32 后得到段错误,正如我所期望的那样……但是为什么在 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;
}