Попытка разбить стек

Я пытаюсь воспроизвести результаты переполнения стека, которые я прочитал из статьи Алефа Уэна «разбить стек ради удовольствия и прибыли» (можно найти здесь:http://insecure.org/stf/smashstack.html).

Попытка переписать обратный адрес, похоже, не работает для меня.

Код C:

            void function(int a, int b, int c) {
               char buffer1[5];
               char buffer2[10];
               int *ret;
               //Trying to overwrite return address
               ret = buffer1 + 12;
               (*ret) = 0x4005da;
            }

            void main() {
              int x;

              x = 0;
              function(1,2,3);
              x = 1;
              printf("%d\n",x);
            }

разобрали главное:

            (gdb) disassemble main
            Dump of assembler code for function main:
               0x00000000004005b0 <+0>:     push   %rbp
               0x00000000004005b1 <+1>:     mov    %rsp,%rbp
               0x00000000004005b4 <+4>:     sub    $0x10,%rsp
               0x00000000004005b8 <+8>:     movl   $0x0,-0x4(%rbp)
               0x00000000004005bf <+15>:    mov    $0x3,%edx
               0x00000000004005c4 <+20>:    mov    $0x2,%esi
               0x00000000004005c9 <+25>:    mov    $0x1,%edi
               0x00000000004005ce <+30>:    callq  0x400564 <function>
               0x00000000004005d3 <+35>:    movl   $0x1,-0x4(%rbp)
               0x00000000004005da <+42>:    mov    -0x4(%rbp),%eax
               0x00000000004005dd <+45>:    mov    %eax,%esi
               0x00000000004005df <+47>:    mov    $0x4006dc,%edi
               0x00000000004005e4 <+52>:    mov    $0x0,%eax
               0x00000000004005e9 <+57>:    callq  0x400450 <printf@plt>
               0x00000000004005ee <+62>:    leaveq
               0x00000000004005ef <+63>:    retq
            End of assembler dump.

Я жестко закодировал обратный адрес, чтобы пропустить x = 1; В строке кода я использовал жестко закодированное значение из дизассемблера (адрес: 0x4005da). Целью этого эксплойта является печать 0, но вместо этого это печать 1.

У меня очень сильное чувство, что "ret = buffer1 + 12;" не является адресом обратного адреса. Если это так, то как я могу определить адрес возврата, gcc выделяет больше памяти между адресом возврата и буфером.

Ответы на вопрос(4)

Ваш ответ на вопрос