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

时间:2018-11-02 16:50:09

标签: c gcc stack buffer-overflow

首先,这是一个作业问题。我不确定是否可以,但是不发布有关如何更改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;
}

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

因此,尽管无法确定是否覆盖堆栈框架中的其他变量,但是可以确定的是,如果缓冲区溢出足够大,则会破坏main()之上的堆栈,其中main()除其他内容外还包含所谓的返回地址。 main(),以一种或另一种方式会使您的程序崩溃。最好保持启用堆栈保护程序,因为检测到的堆栈粉碎是相对较坏的退出程序的退出。

不受控制的溢出会导致各种奇怪的行为,尤其是如果重写的返回地址指向某些可执行代码时。这是用于溢出攻击的典型设置。

  

我的问题是我是否要订购

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条件未显示的情况下执行了某些操作。 << / p>