В този урок ще говорим за препълване на буфер (Препълване на буфера), грешка, която съществува от дълго време, възниква, когато данните, които се копират в областта на паметта (която е била предварително запазена) не са проверени правилно, може да се окаже, че приложението работи правилно, ако потребителят вмъква данни с адекватен размер, но ако запазим памет за 15 знака и потребителят вмъкне 20, това ще засегне друга област от паметта, която може или не може да бъде запазена.
Това може да накара нашата програма да виси, но може да бъде и много по -лошо, потребител със злонамерени намерения може да се възползва от тази грешка и да повлияе на работата на приложението или да изпълни произволен код на компютър (обикновено този код ще отвори интерпретатор на команди ). Също така, ако програмата работи с повишени привилегии, имаме сериозен недостатък в сигурността. Друга атака, която може да промени работата на приложение или да инжектира код, е XSS.
ЗабележкаИзпълненията, които ще видите в този урок, са извършени в 32-битовата операционна система Ubuntu 16.04.
Нека видим а Прост пример за C код, който е уязвим за тази атака, при стартиране на програмата трябва да предадем параметър, приложението очаквайте да получите низ не по -дълъг от 15 знака, ако това е очакваният низ, това ще бъде успешен достъп, ако не, той ще бъде "отказан". Кодът е както е показано по -долу:
#include #include #define password "Test" void test (char * str) {char буфер [15]; int n = 0; strcpy (буфер, str); if (strcmp (буфер, парола) == 0) {n = 1; } if (n) {printf ("Успех \ n"); изход (0); } else {printf ("Достъпът е отказан \ n"); }} int main (int argc, char * argv []) {if (argc <2) {printf ("Приложението изисква параметър \ n"); изход (-1); } тест (argv [1]); }Програмата е кръстена на overflow.c, и за компилиране е използвано следното:
gcc overflow.c -o overflow -fno -stack -protectorПоследната част: -fno-stack-protector Използва се така, че компилаторът да не поставя защита и можем да покажем примера. Ако потребителят въведе правилни данни, което е низ от максимум 15 знака, програмата работи добре, ако въведем неправилна „парола“, тя ще ни покаже Отказан достъп, и ако сложим "Тест”Ще ни постави Успех. Нека видим улавяне, изпълняващо програмата 2 пъти, веднъж с неправилен достъп и друго с правилния низ:
Виждаме, че всичко работи правилно. Но какво ще стане, ако вмъкнем горен низ, нека видим какво ще се случи:
Стартирахме програмата с 20 букви А, и ни показва Успех. В това приложение нямаме нищо, просто излизаме от приложението, но имаме достъп до ограничена зона, без да знаем паролата. Ако заменим следната функция:
strcpy (буфер, str);Със следното:
strncpy (буфер, str, 15);Y изпълняваме кода с 20 букви А, имаме следния изход:
Можете също да видите, че ние използваме strcmp, вместо това трябва да използваме strncmp, така че ние също контролираме размера. Контролирахме, че само максимум 15 знака могат да бъдат копирани, така че това не засяга нашата програма, ако те вмъкнат повече. Ако след показване на съобщението Успех изпълняваме системна команда (в този случай кой съм аз), получаваме информацията:
По -горе не сме root, но ако го изпълним с sudo, получаваме следното:
Единственото нещо, което добавихме, е ред в кода, който видяхме по -горе, под реда на кода:
printf ("Успех \ n");Ние сме сложили:
система ("whoami");За да разбера малко какво се е случило, ще променя програмата, за да покаже двете променливи, които имаме (буфер Y н) независимо дали е правилно или не, а по -долу е изходът, първо вмъкваме низ, който ще се третира като правилен („Тест”), След това неправилна, която не надвишава дължината и накрая 20 букви А:
Виждаме, че при първото изпълнение си заслужава 1 Променливата н, тъй като преминалата верига е правилната, във втората си заслужава 0, защото е грешно, но в последното си заслужава 1094795585, което прави пропускането на условието, което поставяме ако (п), това ще бъде вярно, стига n да е различно от 0. Това не е добро състояние, въпреки че не би трябвало да се провали, ако останалата част от кода беше правилна. Ако сложим 16 букви А като параметър ще видим, че стойността на променливата н то е 65:
Ако погледнем ASCII кода, номерът 65 съответства на буквата ДА СЕ, видяхме, че паметта на променливата n е случайно докосната от нас, че допълнителната буква, която сме предали като параметър, е отишла към променливата н. Ще имаме памет, както следва:
Ако излезем извън символите, може да ни изпрати съобщение за нарушение на сегмента (ако премахнем изход (0) какво имаме в ако (п)), можем да го видим на следното изображение:
Това предупреждение се дължи на опит за достъп до област от паметта, която е извън границите на тази, определена от операционната система за приложението. Ако съставихме примера, както следва:
gcc overflow.c -o overflow -fstack -protectorИли просто премахване -fno-stack-protector От компилацията, която видяхме за първи път, и изпълнихме кода с препълване, получаваме следния резултат:
Допълнителна защита, която ни предоставя gcc.
ЗабележкаАко искаме да изпълним код (shellcode) ще трябва да презапишем адреса за връщане с този на нашия шелкод, той е малко по -сложен от примера, видян в урока и следователно изисква повече работа.
Ако някой успее да се възползва от тази уязвимост, тя може да ви причини много щети. Избягвайте този вид неуспех и че злонамерен потребител може да се възползва от това е много лесно, програмирайте правилно, трябва да знаете добре езика за програмиране, който се използва, да знаете какви функции да използвате и какво да не използвате, тествайте приложението Е, не само с правилни данни, той също трябва да работи правилно, когато се занимаваме с непредвидени данни.
Други атаки, които можете да прегледате и да сте наясно, така че да не ви засягат или да сведат до минимум рисковете си, са: DoS и Brute Force. И не забравяйте да проверите CVE страницата за уязвимости.
Хареса ли ви и помогнахте на този урок?Можете да възнаградите автора, като натиснете този бутон, за да му дадете положителна точка