2015-10-16 3 views
-4

Я попробовал этот пример кода на C:переполнения буфера не произошло

int main() 
{ 
    int array[5]; 
    int i; 

    for (i = 0; i <= 255; i++) 
    { 
     array[i] = 10; 
    } 
} 

и компилировать его с помощью:

gcc -m32 -o a.out buffer2.c 

мой вопрос, почему не Сегментация вина?

я использовать Kali Linux 64

VENDOR_ID: GenuineIntel

Название модели Intel (R) ядра (ТМ) i3 CPU M 350 @ 2.27GHz

Архитектура: x86_64

CPU op-mode (s): 32-bit, 64-bit

Байт: Маленький Эндиан


Я редактировал код, добавив следующие две строки:

int main() 
{ 
    int x = 12; 

    int array[5]; 
    int i; 

    for (i = 0; i <= 255; i++) 
    { 
     array[i] = 10; 
    } 

    printf("%d\n", x); 
} 

и что является результатом:

10 
Segmentation fault 
+3

Вы внесли неопределенное поведение, а это значит, что события не определены. Вы абсолютно * можете * получить ошибку сегментации, но это не гарантия. – turbulencetoo

+2

Неопределенное поведение, ну, не определено - так что это не * определено * как segfault, хотя это часто бывает. (Кстати, переполнение буфера, безусловно, произошло, оно просто не вызвало segfault) –

+1

Переполнение буфера не такое же, как ошибка сегментации. Вы можете переполнять буфер и по-прежнему получать доступ к памяти в адресном пространстве вашего процесса (что является серьезной проблемой безопасности). – Jason

ответ

3

В C. проверка кадров во время выполнения C. Запись в элементы за пределами массива undefined behavior. Неопределенное поведение означает, что что-то может случиться в том, что касается стандарта. Таким образом, хотя вероятность сегментации довольно вероятна, это отнюдь не гарантировано.

Просто потому, что не было ошибки сегментации, это не означает, что переполнение буфера не было. Там определенно было. На этот раз это не привело к ошибке сегментации. Этот тип ошибки является серьезным и может вызвать ряд проблем безопасности. Мораль этой истории не вызывает переполнения буфера. Это небезопасно, и вы не можете полагаться на C, чтобы защитить вас.

0

Try:

sudo echo 0 > /proc/sys/kernel/randomize_va_space 

И скомпилировать снова, как это:

gcc buffer2.c -o buffer2 -fno-stack-protector 
+0

Я пробовал это, но не работал! –

+0

странно, это работает для меня: http://i.imgur.com/yrcbDeS.png –

+0

@LightFlow Неопределенное поведение не определено, и хотя это может вызвать ошибку seg, оно все равно не гарантируется. Кроме того, я настоятельно рекомендую вам * не * выключить рандомизированное адресное пространство. Это очень полезная функция безопасности, и есть очень мало причин, по которым вы бы отключили это. –