overflow.c:
#include <stdio.h>
#include <string.h>
int checkpass(void) {
int x;
char a[9];
x = 0;
fprintf(stderr, "a at %p \nx at %p\n",(void*)a, (void*)&x );
printf("Please input password:\t");
scanf("%s",a);
if (strcmp(a, "upass") == 0) {
x = 1;
}
return x;
}
int main(int argc, char const *argv[])
{
printf("%d\n",checkpass());
return 0;
}
以下是windows和linux下运行的结果:
由于GCC默认了栈溢出的错误提示,所以...如果要关闭的话需要在makefile里写入export CFLAGS="-fno-stack-protector"
此外使用gets()函数也是不安全的
安全的做法是
scanf("%8",a);