我正在对堆栈溢出进行一些基础研究,并且在如何覆盖/修改位于内存缓冲区下方的局部变量时遇到了一些麻烦。
考虑以下伪 C 代码段
char buff[20];
int pass=0;
.
.
.
gets(buff)
check if buff equals something, if true set pass == 1
if pass == 1, grant access
现在,根据我收集的内容,声明的变量在堆栈上是反向排序的。也就是说,buff位于堆栈中的通道上方。当get将某些内容复制到buff中时,缓冲区会向高地址空间增长 - 朝向返回地址并远离传递变量。我键入什么输入并不重要 - 我根本无法覆盖传递,因为它位于缓冲区的"错误"一侧?
您无法保证变量在堆栈上的位置。编译器可以重新排列它们。而且pass
是否恰好位于buff[19]
之后也没关系.尝试访问buff[20]
仍然是未定义的行为。未定义的行为是未定义的,因此任何事情都可能发生。
但是,如果您声明struct
则有点不同。让我们举这个简单的例子:
struct foobar {
int foo;
char bar;
struct foobar * next;
}
在这里,您可以保证foo
、bar
和next
将按照您指定的顺序排列。