缓冲区溢出没有发生
Buffer Overflow not happened
我尝试了这个示例 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 fault?
我用kali linux 64
vendor_id : 正版英特尔
型号名称:Intel(R) Core(TM) i3 CPU M 350 @ 2.27GHz
架构:x86_64
CPU 运算模式:32 位、64 位
字节顺序:小端
我通过添加这两行来编辑代码:
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
尝试:
sudo echo 0 > /proc/sys/kernel/randomize_va_space
然后像这样再次编译:
gcc buffer2.c -o buffer2 -fno-stack-protector
C 中没有运行时边界检查。写入数组边界外的元素是 undefined behavior。未定义的行为意味着就标准而言,任何事情都可能发生。因此,虽然分段错误很可能发生,但绝不能保证。
没有分段错误并不意味着没有缓冲区溢出。肯定有。这次只是没有导致分段错误。这种类型的错误很严重,会导致许多安全问题。这个故事的寓意是永远不要导致缓冲区溢出。不安全,不能指望C保护。
我尝试了这个示例 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 fault?
我用kali linux 64
vendor_id : 正版英特尔
型号名称:Intel(R) Core(TM) i3 CPU M 350 @ 2.27GHz
架构:x86_64
CPU 运算模式:32 位、64 位
字节顺序:小端
我通过添加这两行来编辑代码:
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
尝试:
sudo echo 0 > /proc/sys/kernel/randomize_va_space
然后像这样再次编译:
gcc buffer2.c -o buffer2 -fno-stack-protector
C 中没有运行时边界检查。写入数组边界外的元素是 undefined behavior。未定义的行为意味着就标准而言,任何事情都可能发生。因此,虽然分段错误很可能发生,但绝不能保证。
没有分段错误并不意味着没有缓冲区溢出。肯定有。这次只是没有导致分段错误。这种类型的错误很严重,会导致许多安全问题。这个故事的寓意是永远不要导致缓冲区溢出。不安全,不能指望C保护。