Показать сообщение отдельно

  #210  
Старый 31.08.2007, 22:27
Ni0x
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме:
2009677

Репутация: 472
По умолчанию

Кез, ты не прав.
Статическая память(секции .data, .bss) иницилизируется нулями при запуске программы. У переменных в стеке и куче гарантия такой инициализации отсутствует, поэтому нужно специально инициализировать такие переменные для нормальной работы приложения. Содержимое неинициализированной переменной неопределено, зато можно точно предсказать что будет содержаться в неинициализированной области памяти. Представь себе неинициализированною стековую переменную, в ней может оказаться куча всего, в том числе сохраненные регистры, переменные от предыдущих вызовов, и тд. Все зависит от нахождения такой переменной в стеке. Стоит лишь взять определенную область памяти под контроль и появится возможность эксплутации. Конечно программистам, которые пишут для себя калькуляторы и тд плевать на такие уязвимости, однако раньше в крупных opensource проектах можно было часто встретить такие баги, сейчас они почти не попадаются. Для наглядности приведу пример:
Код:
unsigned int func(char *s)
{
char *vuln;
if(s)
{
vuln = malloc(1024);
...
}
free(vuln);
return 0;
}
А теперь подумайте, если аргумент s будет равен нулю, то указатель vuln окажется неинициализированным до конца функции, где для него будет вызвана функция free. О результате подумайте сами.

Последний раз редактировалось Ni0x; 31.08.2007 в 22:30..
 
Ответить с цитированием