【发布时间】:2013-03-19 09:02:33
【问题描述】:
gcc 是否智能进行内存分配以防止缓冲区溢出攻击?
int function(char *str) {
int a = 0; // See the
char b[16] = "abcd"; // changes here
if(!strcmp(b, str))
a = 1;
return a;
}
和
int function(char *str) {
char b[16] = "abcd"; // See the
int a = 0; // changes here
if(!strcmp(b, str))
a = 1;
return a;
}
当我用 gdb 调试它时,它总是先分配内存给整数变量,然后是字符数组; 不管变量声明的顺序是什么。
即在上述两种情况下,编译器首先将内存分配给a,然后再分配给b。
(higher address)
Memory
| |
| |
+--------+
| |
| |
| |
| |
+--------+ <----- b (16 bytes)
| |
+--------+ <----- a (4 bytes)
| |
(lower address)
因此,即使我们在str 中提供超过16 个字符,它也不会影响a 的值。
有人可以帮我吗?
谢谢。
【问题讨论】:
-
标准允许出于编译器想要完成的任何目的进行此类重新排序。最常见的 - 优化。它仍然是“智能”,但不是为了防止“缓冲区溢出攻击”。而且它仍然是一个未定义的行为(缓冲区溢出)