缓冲区溢出问题中的问题初始化顺序

problem initialization order in buffer overflow problem

首先,这是一道作业题。我不确定是否可以,但是 post 不知道如何更改 int 值。

我的问题是我是否有

的顺序
int set_me = 0;
char buf[15];

切换到

char buf[15];
int set_me = 0;

它仍然会通过溢出char数组来改变整数。我使用 gcc -m32 -o buffer -O0 -fno-stack-protector buffer.c 来编译文件。我想 -O0 让 gcc 不优化堆栈,所以 int 和 char[] 应该像在 c 代码中一样有序。原始代码在没有显示的 if 条件下做了一些事情。

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

int main(int argc, char** argv)
{
        if(argc != 2)

        {

                printf("usage:\n%s string\n", argv[0]);
                return EXIT_FAILURE;
        }
        int set_me = 0;
        char buf[15];

        if(set_me == 1111222){}
        return EXIT_SUCCESS;
}

堆栈上变量的顺序取决于实现。

仅仅因为变量在代码中以特定顺序定义并不意味着它们在编译的程序中也会以相同的顺序。添加更多不同类型的变量可能会也可能不会改变顺序,更改优化设置也可能会改变。

如果您要测试缓冲区溢出,则需要尝试变量声明,直到获得所需的布局。

正如已经指出的那样,即使没有优化,声明的顺序也无法预测堆栈上的分配顺序。它完全依赖于实现。

但是,如果确实溢出 'buf',您将写入越来越高的地址,但堆栈(通常)会向下增长。

因此,虽然无法确定是否覆盖堆栈帧中的其他变量,但可以肯定的是,如果缓冲区溢出足够大,您将破坏 main() 上方的堆栈,其中包含 return 任何调用 main() 的地址,这将以某种方式使您的程序崩溃。最好保持堆栈保护器处于启用状态,因为检测到的堆栈粉碎是从损坏的程序中相对干净地退出。

不受控制的溢出会导致各种奇怪的行为,尤其是当覆盖的 return 地址指向某些可执行代码时。这是溢出攻击的典型设置。

My question is if I have the order of

int set_me = 0;
char buf[15];

切换到

char buf[15];
int set_me = 0;

它仍然会通过溢出char数组来改变整数。我使用 gcc -m32 -o buffer -O0 -fno-stack-protector buffer.c 来编译文件。我猜 -O0 让 gcc 不优化堆栈,所以 int 和 char[] 应该像在 c 代码中一样有序。原始代码在没有显示的 if 条件下做了一些事情。 <