Отсутствие выделения стека в 64-битной системе при работе над статьей Aleph One

Я испортил "Smash the Stack для удовольствия и прибыли" от Aleph One и обнаружил, что при компиляции кода для моего 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, то она появляется?

1 ответ

AMD64 SysV ABI содержит концепцию, называемую красной зоной. Красная зона - область 128 байт, чуть ниже указателя стека. Его цель - позволить функциям выделять небольшое количество стека с необходимостью уменьшить указатель стека. Вот почему вы не видите уменьшенный указатель стека.

Компилировать с -mno-red-zone чтобы отключить эту функцию.

Другие вопросы по тегам