Попытка переполнения буфера

Я пытаюсь изменить результат функции, используя переполнение буфера, чтобы изменить результаты в стеке с помощью следующего кода: I '

#include 
#include 
#include 


int check_auth1(char *password) 
{
    char password_buffer[8];
    int auth_flag = 0;
    strcpy(password_buffer, password);
    if (strcmp(password_buffer, "cup") == 0) {
        auth_flag = 1;
    }
    return auth_flag;
}
int main(int argc, char **argv)
{
    if (argc < 2) {
        printf("Usage: %s \n", argv[0]);
        exit(0);
    }
    int authenticated = check_auth1(argv[1]);
    if (authenticated != 1) {
        printf("NOT Allowed.\n");
    } else {
        printf("Allowed.\n");
    }
    return 0;
}

Я использую GDB для анализа стека, и это то, что у меня есть:

0xbffff6d0: 0xbffff8e4  0x0000002f  0xbffff72c  0xb7fd0ff4
0xbffff6e0: 0x08048540  0x08049ff4  0x00000002  0x0804833d
0xbffff6f0: 0x00000000  0x00000000  0xbffff728  0x0804850f
0xbffff700: 0xbffff901  0xb7e5e196  0xb7fd0ff4  0xb7e5e225
0xbffff710: 0xb7fed280  0x00000000  0x08048549  0xb7fd0ff4
0xbffff720: 0x08048540  0x00000000  0x00000000  0xb7e444d3
0xbffff730: 0x00000002  0xbffff7c4  0xbffff7d0  0xb7fdc858
0xbffff740: 0x00000000  0xbffff71c  0xbffff7d0  0x00000000


    [1] $ebp                0xbffff6f8
    [2] $esp                0xbffff6d0
    [3] password            0xbffff700
    [4] auth_flag           0xbffff6ec
    [5] password_buffer     0xbffff6e4


   0x080484ce : push   %ebp
   0x080484cf : mov    %esp,%ebp
   0x080484d1 : and    $0xfffffff0,%esp
   0x080484d4 : sub    $0x20,%esp
   0x080484d7 : cmpl   $0x1,0x8(%ebp)
   0x080484db :    jg     0x80484ff 
   0x080484dd :    mov    0xc(%ebp),%eax
   0x080484e0 :    mov    (%eax),%edx
   0x080484e2 :    mov    $0x8048614,%eax
   0x080484e7 :    mov    %edx,0x4(%esp)
   0x080484eb :    mov    %eax,(%esp)
   0x080484ee :    call   0x8048360 
   0x080484f3 :    movl   $0x0,(%esp)
   0x080484fa :    call   0x80483a0 
   0x080484ff :    mov    0xc(%ebp),%eax
   0x08048502 :    add    $0x4,%eax
   0x08048505 :    mov    (%eax),%eax
   0x08048507 :    mov    %eax,(%esp)
   ----------
   IMPORTANT STUFF STARTS NOW
   0x0804850a :    call   0x8048474 
   0x0804850f :    mov    %eax,0x1c(%esp)
   0x08048513 :    cmpl   $0x1,0x1c(%esp)
   0x08048518 :    je     0x8048528 

Я определил, как далеко от $ ebp находится &password_buffer: 0xbffff6f8 - 0xbffff6e4 = 14 байтов

Так с 14 'A' вход, т.е../stackoverflowtest $(perl -e 'print "A" x 14') это должно привести меня кПозволил".

Куда я иду не так? Что требуется для ввода переполнения?

Канары ASLR и gcc отключены.

дамп сборки check_auth1:

Dump of assembler code for function check_auth1:
   0x08048474 : push   %ebp
   0x08048475 : mov    %esp,%ebp
   0x08048477 : push   %edi
   0x08048478 : push   %esi
   0x08048479 : sub    $0x20,%esp
=> 0x0804847c : movl   $0x0,-0xc(%ebp)
   0x08048483 :    mov    0x8(%ebp),%eax
   0x08048486 :    mov    %eax,0x4(%esp)
   0x0804848a :    lea    -0x14(%ebp),%eax
   0x0804848d :    mov    %eax,(%esp)
   0x08048490 :    call   0x8048370 
   0x08048495 :    lea    -0x14(%ebp),%eax
   0x08048498 :    mov    %eax,%edx
   0x0804849a :    mov    $0x8048610,%eax
   0x0804849f :    mov    $0x4,%ecx
   0x080484a4 :    mov    %edx,%esi
   0x080484a6 :    mov    %eax,%edi
   0x080484a8 :    repz cmpsb %es:(%edi),%ds:(%esi)
   0x080484aa :    seta   %dl
   0x080484ad :    setb   %al
   0x080484b0 :    mov    %edx,%ecx
   0x080484b2 :    sub    %al,%cl
   0x080484b4 :    mov    %ecx,%eax
   0x080484b6 :    movsbl %al,%eax
   0x080484b9 :    test   %eax,%eax
   0x080484bb :    jne    0x80484c4 
   0x080484bd :    movl   $0x1,-0xc(%ebp)
   0x080484c4 :    mov    -0xc(%ebp),%eax
   0x080484c7 :    add    $0x20,%esp
   0x080484ca :    pop    %esi
   0x080484cb :    pop    %edi
   0x080484cc :    pop    %ebp
   0x080484cd :    ret  

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

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