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

标签 c gcc stack buffer-overflow

首先,这是一个家庭作业问题。我不确定这是否可以,但不要发布任何有关如何更改 int 值的内容。

我的问题是我是否有顺序

int set_me = 0;
char buf[15];

切换到

char buf[15];
int set_me = 0;

它仍然会通过溢出字符数组来更改整数。我使用 gcc -m32 -o buffer -O0 -fno-stack-protector buffer.c 来编译该文件。我猜 -O0 让 gcc 不优化堆栈,因此 int an 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;
}

最佳答案

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

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

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

关于c - 缓冲区溢出问题中的初始化顺序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53122780/

相关文章:

c - 多个 float 之和

ubuntu - 无法在调试器内调用标准数学函数?

c - pthread_mutex_lock 是否包含内存栅栏指令?

gcc - 我的代码适用于 gcc 4.6,但不适用于 gcc 4.7(或更高版本)

linux - 程序栈的增长方向到底是什么?

c - sprintf 无法更改 printf 调用中的静态变量

C程序中裁剪BMP文件图像

c - 给结构体数组赋值问题?

linux - 代码注入(inject) - Solaris 和 Linux

c - 如何打印内存和缓冲区的长度?