为什么我在堆栈中初始化的变量之间存在“空白”?

问题描述 投票:0回答:1

enter image description here

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv) {
    int modified;
    char buffer[64];

    modified = 0;
    gets(buffer);

    if(modified != 0)
        printf("Changed!");
    else
        printf("Not changed!");
}

我正在尝试解决缓冲区溢出问题。

当程序计数器达到if(modified!= 0)时,基本指针为0x00007fffffffdfe0。

在基本指针的正下方,我看到4个字节,其中包含有意义的整数0。

但是,缓冲区不位于修改的int的正下方。

它看起来像是4字节的0s,然后0x00007fff在堆栈中,然后是我输入的64字节的As。

为什么在修改int之后不立即显示char缓冲区[64]?为什么会有“差距”?

我用gcc -g -fno-stack-protector test1.c -o test1编译了它

谢谢

c linux stack x86-64 buffer-overflow
1个回答
3
投票

首先,您应该了解,编译器/链接器可以自由地为您在'automatic'范围内声明的变量分配any地址(即,对于函数而言是本地的-并且main只是另一个函数,实际上)。

关于“为什么”有4个字节的“零”,这几乎是肯定的,因为在所使用的平台上,编译器意识到当内存的地址更有效时(即更快),对内存的访问更为有效。内存与eight byte值对齐-因此它“添加”了额外的四个字节,以适当地“对齐” buffer数组的地址。有关对齐和效率的讨论,请参见here

© www.soinside.com 2019 - 2024. All rights reserved.