以下是堆栈框架的外观:
(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;
}
主要的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
答案 0 :(得分:0)
看起来堆栈框架的规格在x86和x86_64之间发生了显着变化。您对x86堆栈帧(Intel386 Processor Supplement)是正确的。然而,x86_64规范(AMD64 Architecture Support Supplement)传递寄存器中的整数参数(第3.2.3段)。下面的项目#2:
如果类是MEMORY,则在堆栈上传递参数。
如果类是INTEGER,则使用序列rdi,%rsi,%rdx,%rcx,%r8和%r9的下一个可用寄存器13。
如果类是SSE,则使用下一个可用的向量寄存器,寄存器按从%xmm0到%xmm7的顺序获取。
如果该类是SSEUP,则在最后使用的向量寄存器的下一个可用的8字节块中传递8字节。
- 醇>
如果该类是X87,X87UP或COMPLEX_X87,则会在内存中传递。
现在,堆栈框架如下所示:
如果查看堆栈帧,main中的返回地址是8 [%rbp]或0x004005be,参数位于正确的寄存器中:
(gdb) x/32 $rbp
0x7fffffffe040: 0xffffe050 0x00007fff 0x004005be 0x00000000
0x7fffffffe050: 0x00000000 0x00000000 0xf7a36f45 0x00007fff
0x7fffffffe060: 0x00000000 0x00000000 0xffffe138 0x00007fff
0x7fffffffe070: 0x00000000 0x00000001 0x004005a1 0x00000000
0x7fffffffe080: 0x00000000 0x00000000 0xdf5e7534 0x8acdbc8c
0x7fffffffe090: 0x00400470 0x00000000 0xffffe130 0x00007fff
0x7fffffffe0a0: 0x00000000 0x00000000 0x00000000 0x00000000
0x7fffffffe0b0: 0x1f9e7534 0x75324373 0x02a47534 0x753253ca
(gdb) info registers
rax 0x4005a1 4195745
rbx 0x0 0
rcx 0x4 4
rdx 0x3 3
rsi 0x2 2
rdi 0x1 1
....