在处理Aleph One文章时,64位系统上没有堆栈分配

我一直在搞乱来自Aleph One的“Smash the stack for Fun and Profit”,并发现在为我的64位处理器编译代码时,堆栈内存不能使用通常的“sub $ VALUE,% REG“。

这是函数源代码:

void function() { char buffer1[5]; char buffer2[10]; int *ret; ret = buffer1 + 32; (*ret) +=8; } 

这是编译版本

 function: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $1868654947, -16(%rbp) movb $0, -12(%rbp) leaq -16(%rbp), %rax addq $32, %rax movq %rax, -8(%rbp) movq -8(%rbp), %rax movl (%rax), %eax leal 8(%rax), %edx movq -8(%rbp), %rax movl %edx, (%rax) nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc 

为什么没有标准的堆栈分配,如果我使用-m32选项与gcc它出现?

amd64 SysV ABI包含一个称为红色区域的概念。 红色区域是堆栈指针正下方128字节的区域。 它的目的是允许函数分配少量的堆栈而不得不减少堆栈指针。 这就是为什么你没有看到堆栈指针减少的原因。

使用-mno-red-zone编译以关闭此function。