gcc是否智能地进行内存分配以防止缓冲区溢出攻击?
int function(char *str) {
int a = 0; // See the
char b[16] = "abcd"; // changes here
if(!strcmp(b, str))
a = 1;
return a;
}
Run Code Online (Sandbox Code Playgroud)
和
int function(char *str) {
char b[16] = "abcd"; // See the
int a = 0; // changes here
if(!strcmp(b, str))
a = 1;
return a;
}
Run Code Online (Sandbox Code Playgroud)
当我用gdb调试它时,它总是首先将内存分配给整数变量然后分配字符数组; 无论变量声明的顺序是什么.即在上述两种情况下,编译器首先分配内存a
然后分配给内存b
.
(higher address)
Memory
| |
| |
+--------+
| |
| |
| |
| |
+--------+ <----- b (16 bytes)
| |
+--------+ <----- a (4 bytes)
| |
(lower address)
Run Code Online (Sandbox Code Playgroud)
所以,即使我们提供超过16个字符str
,它也不会影响价值a
.有人可以帮帮我吗?
谢谢.
Has*_*kun 11
是的,如果用-fstack-protector
旗帜运行.
当使用该标志运行时,GCC添加堆栈canaries,将数组变量排序到堆栈帧的最高部分,以使其更难以溢出它们并破坏其他变量,并使函数参数的副本与其他本地存储一起存储.
有关详细信息,请参阅有关缓冲区溢出保护的Wikipedia页面和ProPolice主页