У овом водичу ћемо говорити о преливању бафера (Буффер Оверфлов), грешка која постоји већ дуже време, настаје када се подаци који се копирају у меморијско подручје (које је претходно резервисано) не провере правилно, може се десити да апликација ради исправно ако корисник убаци податке помоћу одговарајуће величине, али ако резервишемо меморију за 15 знакова, а корисник уметне 20, то ће утицати на другу меморијску област која може, али и не мора бити резервисана.
Ово може учинити да наш програм виси, али може бити и много горе, корисник са злонамерним намерама може искористити ову грешку и утицати на рад апликације или извршити произвољан код на рачунару (обично ће тај код отворити тумач команди ). Такође, ако програм ради са повишеним привилегијама, имамо озбиљну сигурносну грешку. Други напад који може да промени рад апликације или убризгавање кода је КССС.
БелешкаИзвршења која ћете видети у овом водичу изведена су у 32-битном Убунту 16.04 оперативном систему.
Погледајмо а Једноставан пример Ц кода који је рањив на овај напад, приликом покретања програма морамо проћи параметар, апликацију очекујте да примите низ који не садржи више од 15 знакова, ако је то очекивани низ, то ће бити успешан приступ, ако не, биће "одбијен". Код је приказан испод:
#инцлуде #инцлуде #дефине пассворд "Тест" воид тест (цхар * стр) {цхар буффер [15]; инт н = 0; стрцпи (бафер, стр); иф (стрцмп (бафер, лозинка) == 0) {н = 1; } иф (н) {принтф ("Успех \ н"); екит (0); } елсе {принтф ("Приступ одбијен \ н"); }} инт маин (инт аргц, цхар * аргв []) {иф (аргц <2) {принтф ("Апликација захтева параметар \ н"); излаз (-1); } тест (аргв [1]); }Програм је добио име преливање.ц, а за компајлирање је коришћено следеће:
гцц оверфлов.ц -о оверфлов -фно -стацк -протецторПоследњи део: -фно-стацк-протецтор Користи се тако да компајлер не ставља заштиту и можемо показати пример. Ако корисник унесе тачне податке, што је низ од највише 15 знакова, програм ће добро функционисати, ако унесемо нетачну „лозинку“ то ће нам показати Приступ одбијен, а ако ставимо „Тест”Ставиће нас Успех. Погледајмо снимак који извршава програм 2 пута, једном са нетачним приступом, а други са исправним низом:
Видимо да све ради како треба. Али шта ако уметнемо горњи низ, да видимо шта ће се догодити:
Покренули смо програм са 20 слова А, и показује нам Успех. У овој апликацији немамо ништа, једноставно изађемо из апликације, али смо приступили ограниченом подручју без познавања лозинке. Ако заменимо следећу функцију:
стрцпи (бафер, стр);На следећи начин:
стрнцпи (бафер, стр, 15);И извршавамо код са 20 слова А, имамо следећи излаз:
Такође можете видети да их користимо стрцмп, уместо тога треба да користимо стрнцмп, па контролишемо и величину. Контролисали смо да се може копирати највише 15 знакова, тако да то не утиче на наш програм ако убаци више. Ако након приказивања поруке Успех извршавамо системску команду (у овом случају ко сам ја), добијамо информације:
Горе нисмо роот, али ако га изведемо са судо, добијамо следеће:
Једино што смо додали је ред у коду који смо видели горе, испод линије кода:
принтф ("Успех \ н");Ставили смо:
систем ("вхоами");Да бих мало разумео шта се догодило, променићу програм тако да прикаже 2 променљиве које имамо (тампон И н) да ли је тачан или не, а испод је излаз, прво убацујемо низ који ће се третирати као тачан („Тест”), Затим погрешан који не прелази дужину и на крају 20 слова А.:
Видимо да у првом извршењу вреди 1 Променљива н, јер је ланац који је прошао исправан, у другом вреди 0, јер је погрешно, али у последњем вреди 1094795585, што чини прескакање услова који постављамо ако (н), биће тачно све док је н различито од 0. То није добро стање, иако не би морало да пропадне да је остатак кода тачан. Ако ставимо 16 слова А. као параметар видећемо да је вредност променљиве н То је 65:
Ако погледамо АСЦИИ код, број 65 одговара слову ДО, видели смо да смо случајно додирнули меморију променљиве н, да је додатно слово које смо проследили као параметар отишло у променљиву н. Сећање бисмо имали на следећи начин:
Ако одемо даље од знакова, можда ће нам послати поруку о кршењу сегмента (ако елиминишемо излаз (0) шта имамо у ако (н)), можемо то видети на следећој слици:
Ово упозорење је због покушаја приступа меморијском подручју које је изван граница оног које оперативни систем додељује апликацији. Ако смо пример саставили на следећи начин:
гцц оверфлов.ц -о оверфлов -фстацк -протецторИли само уклањање -фно-стацк-протецтор Из компилације коју смо видели први пут и извршавамо код са оверфлов -ом, добијамо следећи резултат:
Додатна заштита коју нам пружа гцц.
БелешкаАко желимо да извршимо код (схеллцоде) морали бисмо преписати повратну адресу са оном нашег схелл кода, нешто је сложенији од примера виђеног у водичу и стога захтева више рада.
Ако неко успе да искористи ову рањивост, може вам нанети велику штету. Избегавајте ову врсту грешке и да злонамерни корисник то може искористити је врло лако, програмирајте исправно, морате добро познавати програмски језик који се користи, знати које функције користити, а шта не, тестирати апликацију Па, не само са тачним подацима, он такође мора исправно радити када се бавимо непредвиђеним подацима.
Други напади које можете прегледати и бити свесни како не би утицали на вас или смањили ризик су: ДоС и Бруте Форце. И не заборавите да проверите ЦВЕ страницу ради утврђивања рањивости.
Да ли вам се допао и помогао овај водич?Можете наградити аутора притиском на ово дугме да бисте му дали позитиван поен