【发布时间】:2012-03-25 16:30:03
【问题描述】:
在教授给出的一些示例代码中:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf( "%s\n", alpha );
printf( "%c\n", alpha[8] );
alpha[8] = 'Z'; /* segmentation fault if alpha is declared statically! */
printf( "%d\n", sizeof( alpha ) );
printf( "%d\n", strlen( alpha ) );
char x[10];
strncpy( x, alpha, 26 );
/* strncpy() will NOT copy or append a '\0' */
printf( "%s\n", x );
return EXIT_SUCCESS;
}
当第一次编译和运行时,程序段错误是由于,从我在几分钟的谷歌搜索中看到,gcc 防止缓冲区溢出的保护机制(由printf( "%s\n", x ); 触发,其中 x 已填充 26 个字节α)。这一点我相信我明白。
但是,当使用 gcc -fno-stack-protector 禁用保护机制时,我看到的输出是:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
I
27
26
ABCDEFGHZJKLMNOPQRSTUVWXYZKLMNOPQRSTUVWXYZ
我认为由于 strncpy 不会终止字符串,所以当打印 X 时,它实际上可能会打印 alpha 的完整值 - 但实际上,它正在打印所有 alpha,然后还有更多alpha!
有人可以在这里提供一些见解吗?
【问题讨论】:
标签: c printf buffer-overflow strcpy