我正在对堆栈溢出进行一些基础研究,并且如何覆盖/修改位于 内存中缓冲区的局部变量有一些麻烦。
考虑下面的一段伪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位于堆栈中的通道上方。当将某些内容复制到buff中时,缓冲区会朝着高地址空间增长 - 朝向返回地址并远离传递变量。输入我输入的内容并不重要 - 我根本无法覆盖传递,因为它出现在“错误”上。缓冲区的一边?
答案 0 :(得分:2)
您无法保证堆栈中变量的位置。编译器可能会重新排列它们。如果pass
恰好位于buff[19]
之后,则无关紧要。尝试访问buff[20]
仍然是未定义的行为。未定义的行为未定义,因此可能发生任何事情。
但是,如果您声明struct
,则会有所不同。让我们来看一个这个简单的例子:
struct foobar {
int foo;
char bar;
struct foobar * next;
}
您可以保证foo
,bar
和next
符合您指定的顺序。