Сколько байтов необходимо, чтобы зарезервировать пространство в памяти для переменных - PullRequest
0 голосов
/ 14 апреля 2020

Я новичок в изучении эксплойтов и начинаю с самого начала, как работает память. Я слежу за текстом Smashing the Stack для удовольствия и получения прибыли. В первом примере они разбирают код и объясняют, что происходит. Я не могу понять, почему моя машина зарезервировала 30 байтов, когда достаточно 20 - как в примере.

Вот мой C код:

void function(int a, int b, int c){
    char buffer1[5];
    char buffer2[10];
}

void main (){
    function(1, 2, 3);
}

Вот разборка функции:

(gdb) disass function 
Dump of assembler code for function function:
   0x000000000000066a <+0>: push   %rbp
   0x000000000000066b <+1>: mov    %rsp,%rbp
   0x000000000000066e <+4>: sub    $0x30,%rsp
   0x0000000000000672 <+8>: mov    %edi,-0x24(%rbp)
   0x0000000000000675 <+11>:    mov    %esi,-0x28(%rbp)
   0x0000000000000678 <+14>:    mov    %edx,-0x2c(%rbp)
   0x000000000000067b <+17>:    mov    %fs:0x28,%rax
   0x0000000000000684 <+26>:    mov    %rax,-0x8(%rbp)
   0x0000000000000688 <+30>:    xor    %eax,%eax
   0x000000000000068a <+32>:    nop
   0x000000000000068b <+33>:    mov    -0x8(%rbp),%rax
   0x000000000000068f <+37>:    xor    %fs:0x28,%rax
   0x0000000000000698 <+46>:    je     0x69f <function+53>
   0x000000000000069a <+48>:    callq  0x540 <__stack_chk_fail@plt>
   0x000000000000069f <+53>:    leaveq 
   0x00000000000006a0 <+54>:    retq   
End of assembler dump.

...