Tratando de romper la pila

Estoy tratando de reproducir los resultados de stackoverflow que leí en el artículo de Aleph One "rompiendo la pila por diversión y ganancias" (se puede encontrar aquí:http://insecure.org/stf/smashstack.html).

Tratar de sobrescribir la dirección de retorno no parece funcionar para mí.

Código 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);
            }

principal desmontado

            (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.

He codificado la dirección de retorno para omitir el x = 1; línea de código, he utilizado un valor codificado en el desensamblador (dirección: 0x4005da). El propósito de este exploit es imprimir 0, pero en cambio está imprimiendo 1.

Tengo un sentimiento muy fuerte de que "ret = buffer1 + 12;" No es la dirección de la dirección de retorno. Si este es el caso, ¿cómo puedo determinar la dirección de retorno? Gcc está asignando más memoria entre la dirección de retorno y el búfer.

Respuestas a la pregunta(4)

Su respuesta a la pregunta