使用缓冲区溢出覆盖位于缓冲区下方的局部变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用缓冲区溢出覆盖位于缓冲区下方的局部变量相关的知识,希望对你有一定的参考价值。

我正在对堆栈溢出进行一些基础研究,并且如何覆盖/修改位于内存中缓冲区下方的局部变量有一些麻烦。

考虑以下伪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中时,缓冲区会朝着高地址空间增长 - 朝向返回地址并远离传递变量。我键入的输入无关紧要 - 因为它位于缓冲区的“错误”一侧,所以我根本无法覆盖传递?

答案

您无法保证堆栈中变量的位置。编译器可能会重新排列它们。如果pass恰好位于buff[19]之后并不重要。试图访问buff[20]仍然是未定义的行为。未定义的行为是未定义的,因此任何事情都可能发生。

但是,如果你宣布一个struct它有点不同。我们来看一个这个简单的例子:

struct foobar {
    int foo;
    char bar;
    struct foobar * next;
}

在这里,您可以保证foobarnext将按照您指定的顺序排列。

以上是关于使用缓冲区溢出覆盖位于缓冲区下方的局部变量的主要内容,如果未能解决你的问题,请参考以下文章

编译器如何在堆栈上安排局部变量?

程序保护机制

windows下简单的缓冲区溢出之slmail

Linux下简单的缓冲区溢出

堆栈缓冲区溢出会导致堆损坏吗?

2.3 修改函数返回地址