Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.07;
Скачать: CL | DM;

Вниз

Переполнение буфера/кучи   Найти похожие ветки 

 
Галинка ©   (2007-09-08 17:03) [0]

Где почитать по сабжу? Желательно на русском.


 
tesseract ©   (2007-09-08 17:10) [1]

буфера или таки стэка ?


 
Инс ©   (2007-09-08 17:11) [2]


> или таки стэка ?

А я прочел "кучи"...


 
Вася Правильный   (2007-09-08 17:17) [3]

переполнение где?


 
Kerk ©   (2007-09-08 17:20) [4]

Чего там читать? Там пол-абзаца на все. Хотя, наверно, новомодные авторы всяких паттернов напридумывали


 
tesseract ©   (2007-09-08 17:22) [5]


> А я прочел "кучи"...


её можно переполнить ?


 
Anatoly Podgoretsky ©   (2007-09-08 17:30) [6]

> tesseract  (08.09.2007 17:22:05)  [5]

Можно все


 
oxffff ©   (2007-09-08 17:31) [7]

HeapCreate, HeapReAlloc?
VirtualAllocEx,VirtualFreeEx?


 
Dib@zol ©   (2007-09-08 17:31) [8]

Вруби бесконечную рекурсию и подожди часок другой - узнаешь.


 
Инс ©   (2007-09-08 17:36) [9]


> её можно переполнить ?

Можно. Посмотри последний параметр HeapCreate. Даже если его установить нулевым, АП не резиновое.

PS: АП - это адресное пространство, а не Анатолий Подгорецкий ;)


 
Anatoly Podgoretsky ©   (2007-09-08 17:37) [10]

> Инс  (08.09.2007 17:36:09)  [9]

Я тоже не резиновый!


 
Галинка ©   (2007-09-08 17:38) [11]

В том то и дело, что есть буфер, который в стэке, а есть буфер - в "куче". Скорее всего это вопрос терминологии.

Имеется в виду "залезание" в неположенное место. Например, при попытке сохранения строки длинны большей, чем под нее выделено место, произойдет переписывание данных в памяти, следующей за выделенной под эту строку. Будет ошибка, и по логике, процедура будет завершена, и система перейдет на адрес возврата. Если нужным образом переадресовать точку выхода, то можно вызвать "нужную" программу.

Но пока у меня все как-то в кучу собрано. Хочется почитать что-то написанное более менее человеческим языком, чтобы понять и разложить все для себя по полочкам.


 
Инс ©   (2007-09-08 17:40) [12]


> Например, при попытке сохранения строки длинны большей,
> чем под нее выделено место, произойдет переписывание данных
> в памяти, следующей за выделенной под эту строку

Совсем не факт. Очень даже вероятно не перезаписывание, а сразу же AV. Если виртуальная память по этим адресам не спроецирована, например.


 
Инс ©   (2007-09-08 17:41) [13]


> [11] Галинка ©   (08.09.07 17:38)

Что такое виртуальная память знаете вообще?


 
oxffff ©   (2007-09-08 17:41) [14]


> Имеется в виду "залезание" в неположенное место


Это называется page fault


 
DrPass ©   (2007-09-08 17:43) [15]


> Будет ошибка, и по логике, процедура будет завершена, и
> система перейдет на адрес возврата. Если нужным образом
> переадресовать точку выхода, то можно вызвать "нужную" программу.
>

Будет или AV, или ничего не будет


 
Галинка ©   (2007-09-08 17:45) [16]

Инс, Вы мыслите в категориях дельфи. А я говорю про языки более низкого уровня. Пока я понимаю так, что именно этим и отличается новая концепция "управляемого" кода.

Короче вот нашла статейку

http://www.osp.ru/os/2001/05-06/180186/_p2.html

может еще кому-то интересно будет.


 
oxffff ©   (2007-09-08 17:46) [17]


>  Хочется почитать что-то написанное более менее человеческим
> языком, чтобы понять и разложить все для себя по полочкам.
>


Открыть любую документация  по защищенному режиму начиная с 386.
Прочитать Page Translation and Protection в том числе и на русском.


 
Anatoly Podgoretsky ©   (2007-09-08 17:46) [18]

> Галинка  (08.09.2007 17:45:16)  [16]

Управляемый код доступен для большинства языков, включая ассеблер.
Это дисциплина программирования.


 
Инс ©   (2007-09-08 17:47) [19]


> Инс, Вы мыслите в категориях дельфи. А я говорю про языки
> более низкого уровня. Пока я понимаю так, что именно этим
> и отличается новая концепция "управляемого" кода.

Я мыслю в категориях операционной системы, вообще-то.


 
Инс ©   (2007-09-08 17:48) [20]

А вы мыслите в категориях реального режима микропроцессора.


 
oxffff ©   (2007-09-08 17:49) [21]


> Галинка ©   (08.09.07 17:45) [16]
> Инс, Вы мыслите в категориях дельфи. А я говорю про языки
> более низкого уровня. Пока я понимаю так, что именно этим
> и отличается новая концепция "управляемого" кода.


А что уже есть новая концепция управляемого кода?

Не поделитесь ссылочкой.


 
DrPass ©   (2007-09-08 17:50) [22]


> Инс, Вы мыслите в категориях дельфи. А я говорю про языки
> более низкого уровня

Я, правда, не совсем Инс... но в данном случае поведение Delphi ничем не отличается от не-Delphi. Такой механизм работы с памятью задается даже не операционной системой, а архитектурой PC-компьютера. Единственное исключение - виртуальные машины или использование какого-либо специализированного менеджера памяти. Там "хозяин-барин" в лице их разработчика может задать любой механизм работы с памятью


 
Галинка ©   (2007-09-08 17:51) [23]

Тогда это что? Мания? На эту тему куча статей и даже целые ресурсы посвещены этой проблеме.

Инс, тогда посоветйте, что почитать на эту тему. Я не спорить пришла. И очень извиняюсь, если пока так выглядело ))


 
J_f_S   (2007-09-08 17:51) [24]


> Галинка ©   (08.09.07 17:45) [16]

Все проще, вики из элайв йет:
http://ru.wikipedia.org/wiki/Переполнение_буфера


 
Инс ©   (2007-09-08 17:51) [25]


> Такой механизм работы с памятью задается даже не операционной
> системой, а архитектурой PC-компьютера

Поддержу, Windows, как известно, работает под управлением процессора, работающего в защищенном режиме, со всеми вытекающими.


 
Anatoly Podgoretsky ©   (2007-09-08 17:52) [26]

> Галинка  (08.09.2007 17:51:23)  [23]

Просто старые языки накладывают проблемы, плюс опасные конструкции в АПИ, когда размер не контролируется и позволяет делать переполнение.


 
Инс ©   (2007-09-08 17:53) [27]


> Инс, тогда посоветйте, что почитать на эту тему.

Рихтера.


 
Галинка ©   (2007-09-08 17:54) [28]

"Можно выделить два типа ошибок переполнения: одни приводят к чтению не принадлежащих к массиву ячеек памяти, другие — к их модификации. В зависимости от расположения буфера за ним могут находиться:

   * другие переменные и буферы;
   * служебные данные (например, сохраненные значения регистров и адрес возврата из функции);
   * исполняемый код;
   * незанятая или несуществующая область памяти.

Несанкционированное чтение не принадлежащих к массиву данных может привести к утере конфиденциальности, а их модификация в лучшем случае заканчивается некорректной работой приложения (чаще всего «зависанием»), а в худшем — выполнением действий, никак не предусмотренных разработчиком (например, отключением защиты). Еще опаснее, если непосредственно за концом массива следуют адрес возврата из функции; в этом случае уязвимое приложение потенциально способно выполнить от своего имени любой код, переданный ему злоумышленником. И, если это приложение исполняется с наивысшими привилегиями (что типично для сетевых служб), взломщик сможет как угодно манипулировать системой." (с)

Может я что-то не понимаю? Или неправильно интерпретирую?


 
oxffff ©   (2007-09-08 17:55) [29]


> Галинка ©   (08.09.07 17:51) [23]


Создайте класс, обертку буфера. И делайте Range checking в каждом потенциально опасном методе доступа к буферу.


 
Инс ©   (2007-09-08 17:56) [30]


> "Можно выделить два типа ошибок переполнения: одни приводят
> к чтению не принадлежащих к массиву ячеек памяти, другие
> — к их модификации.

А третие - к немедленному AV.


 
Галинка ©   (2007-09-08 17:56) [31]

Инс, что именно у Рихтера? Поисковик дает на десяток страниц про дотнет. Но мне предстоит писать на чистом Си.


 
oxffff ©   (2007-09-08 17:57) [32]

Есть еще червертые. Например double page Fault и синий экран


 
oxffff ©   (2007-09-08 17:58) [33]


> Но мне предстоит писать на чистом Си.


Читать [29]


 
Галинка ©   (2007-09-08 17:58) [34]

Инс ©   (08.09.07 17:51) [25]

если бы речь шла про Винду ((( В моем случае это Линукс. Там что-то за этим следит?


 
J_f_S   (2007-09-08 17:59) [35]


> Галинка ©   (08.09.07 17:56) [31]

Почитайте ссылку, которую я вам дал. Там все написано, и к тому же приведены ссылки на методы атаки путем переполнения буфера и защиты от него. Инс говорит немного о другом, как мне кажется.


 
Инс ©   (2007-09-08 17:59) [36]


> Инс, что именно у Рихтера?

Да просто, как операционная система работает с памятью. Зная теорию, все практические проблемы сами решатся. Вот ссылка:
http://wm-help.net/books-online/print-page/59464/59464.html


 
J_f_S   (2007-09-08 18:01) [37]

А полностью тема "сисек" раскрыта в статьях на соответсвующем форуме ;)
http://wasm.ru/publist.php?list=20


 
Инс ©   (2007-09-08 18:03) [38]

Не знаю как в Линуксе, но в Windows можно уменьшить вероятность повредить данные поместив их в отдельную кучу.


 
Галинка ©   (2007-09-08 18:15) [39]

Хоть что-то можно поставить в заслугу программистам Микрософт. Может Уинда не такая уж и плохая.

А есть что-то подобное про Линукс?


 
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.63 MB
Время: 0.037 c
2-1189570888
Виталий_____
2007-09-12 08:21
2007.10.07
Динамическое создание формы


2-1189424465
Mariya
2007-09-10 15:41
2007.10.07
Контексный поиск


15-1189090603
Нуждающийся в совете
2007-09-06 18:56
2007.10.07
Учебник по теории вероятности и математической статистике.


15-1188978747
Nic
2007-09-05 11:52
2007.10.07
Настройка web - сервака: ещё пара вопросов


15-1189256604
Галинка
2007-09-08 17:03
2007.10.07
Переполнение буфера/кучи