Dillema с переполнением буфера

Я играю с одним примером переполнения стека. Этот пример выглядит следующим образом:

 void return_input (void){ 
    char array[30];    
    gets (array); 
    printf("%s\n", array); 

 }

 main() { 
    return_input();    
    return 0;    
 }

Весь этот код находится в файле с именем overflow.c. У нас есть уязвимая функция с именем return_input, особенно это 30-байтовый массив символов. Я скомпилировал его и открыл уязвимую функцию в gdbи получил следующий вывод:

 (gdb) disas return_input
 0x08048464 <+0>:   push   %ebp
 0x08048465 <+1>:   mov    %esp,%ebp
 0x08048467 <+3>:   sub    $0x48,%esp
 0x0804846a <+6>:   mov    %gs:0x14,%eax
 0x08048470 <+12>:  mov    %eax,-0xc(%ebp)
 0x08048473 <+15>:  xor    %eax,%eax
 0x08048475 <+17>:  lea    -0x2a(%ebp),%eax
 0x08048478 <+20>:  mov    %eax,(%esp)
 0x0804847b <+23>:  call   0x8048360 <gets@plt>
 0x08048480 <+28>:  lea    -0x2a(%ebp),%eax
 0x08048483 <+31>:  mov    %eax,(%esp)
 0x08048486 <+34>:  call   0x8048380 <puts@plt>
 0x0804848b <+39>:  mov    -0xc(%ebp),%eax
 0x0804848e <+42>:  xor    %gs:0x14,%eax
 0x08048495 <+49>:  je     0x804849c <return_input+56>
 0x08048497 <+51>:  call   0x8048370 <__stack_chk_fail@plt>
 0x0804849c <+56>:  leave  
 0x0804849d <+57>:  ret    
 End of assembler dump.

Как видно из пролога функции, мы зарезервировали hex48(dec 72) байт в стеке для локальных переменных. Сначала я пытался найти адрес, по которому в стеке начинается наш уязвимый массив. Я думаю, что это -0x2a(%ebp), я прав? Hex2a — это 42 десятичных числа. Насколько я понимаю, это означает, что мы можем безопасно записать 42 байта, прежде чем мы начнем перезаписывать EBP, сохраненный в стеке. Но когда я запускаю этот пример, достаточно исправить только 37 байтов, чтобы получить ошибку сегментации:

rustam@rustam-laptop:~/temp/ELF_reader$ ./overflow
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Segmentation fault (core dumped)

Как 37 байтов достаточно для переполнения буфера? Если наш локальный массив символов составляет -42 байта от сохраненного EBP

6
задан Rustam Issabekov 17 June 2012 в 07:43
поделиться