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

Я пытаюсь воспроизвести результаты стекового потока, которые я прочитал из Aleph One 'статьяразбивая стек для удовольствия и прибыли "(можно найти здесь: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 :     push   %rbp
               0x00000000004005b1 :     mov    %rsp,%rbp
               0x00000000004005b4 :     sub    $0x10,%rsp
               0x00000000004005b8 :     movl   $0x0,-0x4(%rbp)
               0x00000000004005bf :    mov    $0x3,%edx
               0x00000000004005c4 :    mov    $0x2,%esi
               0x00000000004005c9 :    mov    $0x1,%edi
               0x00000000004005ce :    callq  0x400564 
               0x00000000004005d3 :    movl   $0x1,-0x4(%rbp)
               0x00000000004005da :    mov    -0x4(%rbp),%eax
               0x00000000004005dd :    mov    %eax,%esi
               0x00000000004005df :    mov    $0x4006dc,%edi
               0x00000000004005e4 :    mov    $0x0,%eax
               0x00000000004005e9 :    callq  0x400450 
               0x00000000004005ee :    leaveq
               0x00000000004005ef :    retq
            End of assembler dump.

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

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

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

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