【发布时间】:2016-07-10 20:01:44
【问题描述】:
堆栈帧的外观如下:
(high memory addresses)
-function arguments
-return address
-saved frame pointer
-local variables
(low memory addresses)
问题是为什么我的堆栈帧看起来像这样:
(high memory addresses)
-return address
-saved frame pointer
-local variables
-function arguments
(low memory addresses)
我在 gdb 中调试时注意到了这一点。 我用 C 编写代码并在 Kali Linux x86_64(intel core i7)上使用 gcc 5.4.0 编译。
C 代码:
void test_function(int a, int b, int c, int d) {
int flag;
char buffer[10];
flag = 31337;
buffer[0] = 'A';
}
int main() {
test_function(1, 2, 3, 4);
return 0;
}
main中rbp的值:
0x7fffffffe260
test_functtion调用地址后的汇编指令:
0x00000000004004e1
在 test_function 框架中对 rsp 执行 x 命令的结果:
0x7fffffffe240: 0x00000004 0x00000003 0x00000002 0x00000001
0x7fffffffe250: 0x00400441 0x00000000 0x004003b0 0x00007a69
0x7fffffffe260: 0xffffe270 0x00007fff 0x004004e1 0x00000000
0x7fffffffe270: 0x004004f0 0x00000000 0xf7a575f0 0x00007fff
【问题讨论】:
-
因为堆栈向下增长。
-
我知道,但如果你把它颠倒过来,它甚至不对应。
-
“堆栈帧的外观如下:”。你从哪里得到的?
-
每次我在谷歌上输入堆栈框架图,这是我唯一得到的东西,我读了一本名为“黑客:剥削的艺术”的书,它是同一张图(那个人写这本书也是用gcc)。
-
我认为您可能误解了某些信息。首先,正如已经指出的那样,您在第一张图中的地址是颠倒的。其次,请向我们展示您用来制作第二张图的代码和 gdb 输出(或其他信息)。