【发布时间】: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 中的工作方式:How should character arrays be used as strings?。