Попытка переполнения буфера
Я пытаюсь изменить результат функции, используя переполнение буфера, чтобы изменить результаты в стеке с помощью следующего кода: 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