Текущий архив: 2007.10.07;
Скачать: CL | DM;
Вниз
Переполнение буфера/кучи Найти похожие ветки
← →
Zeqfreed © (2007-09-08 18:53) [40]Мнда. Вы чего боитесь то? Система (даже этот ужасный и плохой Линукс!) не даст вам испортить ничьи чужие данные, если только вы не подгрузите свой модуль в ядро. Каждому процессу выделяется свой Виртуальный Анатолий Подгоретский размером до 4 Гб на 32-битных платформах (в Виндоус 2 вроде, в Линукс 3, кажется, но тут не уверен). Почитать можно, например, "Linux: азбука ядра" в соавторстве Стивена Смолски, Гордона Фишера и Клаудии Зальзберг или "Операционные Системы" Таненбаума.
← →
Инс © (2007-09-08 18:56) [41]
> [40] Zeqfreed © (08.09.07 18:53)
Речь не об этом. Испортить данные в своем же адресном пространстве (выход за границы одного массива - и перезапись данных в другом массиве, например).
← →
Zeqfreed © (2007-09-08 18:57) [42]> Инс © (08.09.07 18:56) [41]
А это уже либо голова на плечах есть, либо ее нет. И статьи тут не помогут, по-моему.
← →
Anatoly Podgoretsky © (2007-09-08 18:59) [43]
> Виртуальный Анатолий Подгоретский размером до 4 Гб
А если будет выделен app
← →
Zeqfreed © (2007-09-08 19:01) [44]> Anatoly Podgoretsky © (08.09.07 18:59) [43]
Надеюсь, что app будет достаточно мудр, чтобы правильно отнестись к моей дерзкой выходке :)
← →
Галинка © (2007-09-08 19:19) [45]Попробовала написать программку для компилятора gcc, но под виндой.
#include <stdio.h>
int main(){
char satz[10];
printf("Введите строку: ");fflush(stdout);
gets(satz);
printf("%s", satz);
return 0;
}
(про опасность использования gets читала, но попробовать надо же на чем-то). При вводе строки больше, чем на 10 символов, строка принимается, и выводится полностью (!). Никаких ошибок не возникает. Т.е. сооьвествие нигде не проверяется.
← →
Галинка © (2007-09-08 19:30) [46]Zeqfreed © (08.09.07 18:53) [40]
я ничего пока не боюсь. Просто ищу информацию.
← →
Галинка © (2007-09-08 20:22) [47]Удалено модератором
← →
Zeqfreed © (2007-09-08 20:38) [48]> Галинка © (08.09.07 19:19) [45]
> Никаких ошибок не возникает.
Хе-хе. До тех пор, пока введенаая строка не перезапишет память, где printf вызывается.
А вообще к такому коду одно удовольствие эксплоиты писать.
← →
Zeqfreed © (2007-09-08 20:43) [49]А по теме достаточно ознакомиться с http://en.wikipedia.org/wiki/Buffer_overflow и по ссылкам оттуда почитать статьи, если есть какие-то непонятки.
← →
Галинка © (2007-09-08 20:51) [50]
> Zeqfreed © (08.09.07 20:38) [48]
Так поэтому и спрашиваю, как не надо писать.
Нашла, что вроде в OpenBSD сделали StackGuard, который вроде защищает от таких ошибок. А есть ли что-то подобное у других дистрибьютеров: SuSE, RedHat и т.п. Вроде как в стандарт gcc это не включено пока. Или это уже старая инфа, и теперь это стандарт?
Про ввод с клавиатуры понятно. А если вводим строку, скажем, из поля БД? Там тоже есть опасность? Т.е. такой синтаксис вообще опасно применять?
← →
Anatoly Podgoretsky © (2007-09-08 20:53) [51]> Галинка (08.09.2007 20:51:50) [50]
Что с базы, что с клавиатуры, надо контролировать размер.
← →
Галинка © (2007-09-08 20:58) [52]
#include <stdio.h>
int main(){
string1 = (char *) malloc (10);
printf ("Please enter a string of 9 characters or fewer.\n");
fflush(stdout);
fgets(string1, 10, stdin);
printf ("\nYou typed the following string:\n%s\n\n", string1);
fflush(stdout);
return 0;
}
вот другая реализация того же самого действия. Вроде все корректно. Какие неудобства может доставить подобная реализация?
← →
Zeqfreed © (2007-09-08 21:01) [53]> Галинка © (08.09.07 20:51) [50]
Надеяться нужно не на посторонние утилиты, которые по мановению волшебной палочки исключают все возможные проблемы, а на собственную грамотность и достаточное понимание пишущегося кода.
При работе с базами данных обычно люди используют сторонние библиотеки, в которых вызвращаются указатели на заботливо выделенные области памяти необходимого размера. А также используются типа данных с автоматическим управлением памятью. Не понятно где вы там собрались применять такой синтаксис.
← →
Инс © (2007-09-08 21:02) [54]
> Нашла, что вроде в OpenBSD сделали StackGuard, который вроде
> защищает от таких ошибок. А есть ли что-то подобное у других
> дистрибьютеров: SuSE, RedHat и т.п. Вроде как в стандарт
> gcc это не включено пока. Или это уже старая инфа, и теперь
> это стандарт?
Иллюзия того, будто бы операционная система может спасти от кривости рук программиста. Конечно, свалить все на систему проще всего.
← →
Zeqfreed © (2007-09-08 21:06) [55]> Галинка © (08.09.07 20:58) [52]
По-моему во всех реализациях буфер сбрасывается после каждой выведенной строки. Т.е. после \n не нужно вызывать fflush. А так в принципе переполнений здесь быть не должно :)
← →
Галинка © (2007-09-08 21:08) [56]Я не собираюсь ничего не на кого сваливать. Почему все только нападают?
Насколько я поняла, системы защиты квази-целостности призваны только сигнализировать, что что-то не так. Т.е. генерируют прерывание если canary word до вызова и после не идентичны. Т.е. если адрес возврата функции переписан чем-то. Они автоматом не исправляют ошибок разработчика.
ПыСы: форумы существуют для общения, а не для проявления чувства превосходства над начинающими.
← →
Галинка © (2007-09-08 21:10) [57]Zeqfreed © (08.09.07 21:06) [55]
странно, но когда пишу именно в Линуксе, то fflush не требуется. А вот когда связка Win+MinGW+Eclipse почему-то без flush вывод "зависает" ((
← →
Zeqfreed © (2007-09-08 21:17) [58]> Галинка © (08.09.07 21:10) [57]
Отсюда вывод - писать нужно в Линуксе ;)
← →
Галинка © (2007-09-08 21:21) [59]Я и буду. Но пока дома на винде "пристреливаюсь" )) Пробую разные реализации. А на работе есть RedHat )) Т.е. под него и надо будет писать.
Страницы: 1 2 вся ветка
Текущий архив: 2007.10.07;
Скачать: CL | DM;
Память: 0.58 MB
Время: 0.022 c