C, PHP, VB, .NET

Дневникът на Филип Петров


* Препълване на буфера

Публикувано на 30 ноември 2008 в раздел ОСУП.

Препълването на буфера или „buffer overflow“ е проблем, който отново се основава на лошо филтриране на входните данни. Особено силно видими са проблемите при езици за програмиране, които позволяват директен достъп до паметта на ниско ниво (например С и С++). Този проблем е може би най-разпространения при много видове сървърни приложения.

Принципът на препълването на буфера е да бъде подменена информация в части на паметта, които би трябвало да бъдат недостъпни. Крайната цел на атаката е да бъде изпълнен програмен код, който като администратори не бихме искали да бъде стартиран. Преди да демонстрираме проблема ще разгледаме организацията на паметта:

1. „Кодов сегмент“ е част от паметта, при която се записват инструкции на асемблер. Тези инструкции се изпълняват от процесора. Не е задължително да са последователно подредени – използва се EIP указател.

2. „Сегмент за информация“ е мястото, в което се записват променливи и буфери.

3. „Стек“ е частта в паметта, където се записват променливите на функциите и се предават променливи към функции.

Функцията сама по себе си е кодов сегмент. Обикновено една функция извиква друга, като след приключването на втората управлението на програмата се връща към първата. Целта на препълването на буфера е да успеем да „прескочим“ в кодовия сегмент на паметта и да изпълним код, който не е желан.

Прeдлагам ви да прочетете един почти изчерпателен пример. В него се демонстрира конкретно как се прави buffer overflow. Прикачвам ви (за всеки случай) и видеото от част 1, сорс кода от част 1, първа половина на видеото от част 2, втора половина на видеото от част 2 и сорс кода от част 2 на нашия сървър.

 



Добави коментар

Адресът на електронната поща няма да се публикува


*