【问题标题】:Memory address of variable does not match with "info frame" output of gdb变量的内存地址与 gdb 的“信息帧”输出不匹配
【发布时间】:2021-04-25 10:36:19
【问题描述】:

我在 main() 中有 2 个 Char 类型的数组,如下所示:

char a[8]="aaaaaaaa";
char b[8] = "bbbbbbbb";

当我打印 &a 和 &b 的值时,我分别从 gdb 得到 0x7ffeefbffa40 和 0x7ffeefbffa38。 但是,当我做信息框架时,我得到了以下信息:

Stack level 0, frame at 0x7ffeefbffa60:
 rip = 0x100003e0a in main (bufferoverflowex1.c:8); saved rip = 0x7fff20395621
 source language c.
 Arglist at 0x7ffeefbffa50, args: 
 Locals at 0x7ffeefbffa50, Previous frame's sp is 0x7ffeefbffa60
 Saved registers:
  rbp at 0x7ffeefbffa50, rip at 0x7ffeefbffa58

我对当地人的价值感到困惑。它是 xxxffa50。但是局部变量的地址是 xxxx40 和 xxxx38。变量怎么可能存储在信息框返回的Locals地址之前的地址?

【问题讨论】:

标签: c debugging memory gdb


【解决方案1】:

变量怎么可能存储在信息框返回的Locals地址之前的地址?

这并没有什么令人惊讶或不寻常的地方。

在大多数现代机器上,堆栈会向下增长(朝向较低地址)。所以调用框架布局看起来像这样:

                   caller stack frame

                   return address
                   saved previous frame pointer
0x7ffeefbffa60 ->
                   space for other callee-saved registers
0x7ffeefbffa50 ->
                   other locals
0x7ffeefbffa48 ->
                   a[8]
0x7ffeefbffa40 ->
                   b[8]
0x7ffeefbffa38 ->
                   possibly other locals, alloca(), unnamed temporaries, etc.

当 GDB 说“locals at 0xADDRESS”时,在这台(以及其他“堆栈增长”的机器上),它的意思是“locals are below 0xADDRESS。

【讨论】:

  • 在原始发布者的情况下,由于堆栈保护,变量 a 应位于地址 0x7ffeefbffa38,变量 b 应位于地址 0x7ffeefbffa40。
【解决方案2】:

如前所述,堆栈在 x86、ARM 上向下增长。好吧,例如考虑以下程序:

void func(void) {
    int a;
    {
        int b;
    }
    {
        int c;
    }
}

bc 的生命周期不重叠,因此它们可以存储在堆栈上的相同位置。显然,为了不浪费空间,它们必须位于堆栈的顶部,即 below a 在内存中。

现在,如果您有一个任意复杂的函数来获取本地存储的最低地址,那就有点乏味了。您必须组装整个函数,直到您知道局部变量的最低地址。它对你一点帮助也没有——因为很容易跟踪的一件事是局部变量的开始(即最高地址),通常相对于帧指针寄存器。

【讨论】:

    【解决方案3】:

    函数中局部变量的内存是从栈中分配的,就像这样(如果你用stack-protecter编译的话):

      High Memeory Address
    [       Allocated     ]
    [       Allocated     ]
    [       Allocated     ]
    [       Allocated     ]
                           <--0x7ffeefbffa50
    [       Allocated     ]
    [          b          ]
                           <--0x7ffeefbffa40
    [          a          ]
                           <--0x7ffeefbffa38
    [       Unallocated   ]
    [       Unallocated   ]
    [       Unallocated   ]
    [       Unallocated   ]
    [       Unallocated   ]
      Low Memeory Address
    

    如果您使用“-fno-stack-protector”参数进行编译,变量将在堆栈中像这样定位(与您的结果不完全一致):

      High Memeory Address
    [       Allocated     ]
    [       Allocated     ]
    [       Allocated     ]
    [       Allocated     ]
                           <--0x7ffeefbffa50
    [          a          ]
                           <--0x7ffeefbffa48
    [          b          ]
                           <--0x7ffeefbffa40
    [       Unallocated   ]
    [       Unallocated   ]
    [       Unallocated   ]
    [       Unallocated   ]
    [       Unallocated   ]
      Low Memeory Address
    

    根据你的结果,我想你可以参考第一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 2018-02-24
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多