缓冲区溢出未发生

我试过这个示例c代码:

int main() { int array[5]; int i; for (i = 0; i <= 255; i++) { array[i] = 10; } } 

并使用以下方法编译它

 gcc -m32 -o a.out buffer2.c 

我的问题是为什么没有Segmentation故障?

我用kali linux 64

vendor_id:GenuineIntel

型号名称:Intel(R)Core(TM)i3 CPU M 350 @ 2.27GHz

架构:x86_64

CPU操作模式:32位,64位

字节顺序:Little Endian


我通过添加以下两行来编辑代码:

 int main() { int x = 12; int array[5]; int i; for (i = 0; i <= 255; i++) { array[i] = 10; } printf("%d\n", x); } 

这就是结果:

 10 Segmentation fault 

在C中没有运行时边界检查。写入数组边界之外的元素是未定义的行为 。 未定义的行为意味着就标准而言,任何事情都可能发生。 因此,虽然很可能存在分段错误,但它并不能保证。

仅仅因为没有分段错误并不意味着没有缓冲区溢出。 肯定有。 这次只是没有导致分段错误。 这种类型的错误很严重,可能会导致许多安全问题。 这个故事的寓意是不会导致缓冲区溢出。 这不安全,你不能依靠C来保护你。

尝试:

 sudo echo 0 > /proc/sys/kernel/randomize_va_space 

并再次编译如下:

 gcc buffer2.c -o buffer2 -fno-stack-protector