I denne vejledning vil vi tale om bufferoverløb (Bufferoverløb), en fejl, der har eksisteret i lang tid, opstår, når de data, der er kopieret i et hukommelsesområde (som tidligere er reserveret) ikke kontrolleres korrekt, kan det være, at applikationen fungerer korrekt, hvis brugeren indsætter data med en tilstrækkelig størrelse, men hvis vi reserverer hukommelse til 15 tegn, og brugeren indsætter 20, vil det påvirke et andet hukommelsesområde, som måske er reserveret eller ikke.
Dette kan få vores program til at hænge, men det kan også være meget værre, en bruger med ondsindede hensigter kan drage fordel af denne fejl og påvirke applikationens drift eller udføre vilkårlig kode på en computer (normalt åbner denne kode en tolk af kommandoer ). Også hvis programmet kører med forhøjede privilegier, har vi en alvorlig sikkerhedsfejl. Et andet angreb, der kan ændre driften af et program eller injicere kode, er XSS.
BemærkDe henrettelser, du vil se i hele denne vejledning, er blevet udført i 32-bit Ubuntu 16.04-operativsystemet.
Lad os se a Enkelt eksempel på C -kode, der er sårbar over for dette angreb, når vi starter programmet, skal vi sende en parameter, applikationen forvent at modtage en streng, der ikke er mere end 15 tegn, hvis det er den forventede streng, vil det være en vellykket adgang, hvis ikke vil det blive "nægtet". Koden er som vist herunder:
#include #include #define password "Test" void test (char * str) {char buffer [15]; int n = 0; strcpy (buffer, str); hvis (strcmp (buffer, adgangskode) == 0) {n = 1; } hvis (n) {printf ("Succes \ n"); exit (0); } ellers {printf ("Adgang nægtet \ n"); }} int main (int argc, char * argv []) {if (argc <2) {printf ("Appen kræver en parameter \ n"); exit (-1); } test (argv [1]); }Programmet er opkaldt efter overløb. c, og til at kompilere følgende er blevet brugt:
gcc overflow.c -o overflow -fno -stack -protectorDen sidste del: -fno-stack-beskytter Det bruges, så kompilatoren ikke sætter beskyttelse, og vi kan vise eksemplet. Hvis brugeren indtaster korrekte data, som er en streng på maksimalt 15 tegn, fungerer programmet godt, hvis vi indtaster et forkert "kodeord", vil det vise os Adgang nægtet, og hvis vi sætter "Prøve”Vil sætte os Succes. Lad os se en optagelse, der udfører programmet 2 gange, en gang med forkert adgang og en anden med den korrekte streng:
Vi ser, at alt fungerer korrekt. Men hvad nu hvis vi indsætter en øvre streng, lad os se, hvad der sker:
Vi har lanceret programmet med 20 bogstaver A, og viser os Succes. I denne applikation har vi ingenting, vi forlader simpelthen applikationen, men vi har adgang til et begrænset område uden at kende adgangskoden. Hvis vi erstatter følgende funktion:
strcpy (buffer, str);Ved følgende:
strncpy (buffer, str, 15);Y vi udfører koden med 20 bogstaver A, har vi følgende output:
Du kan også se, at vi gør brug af strcmp, i stedet skal vi bruge strncmp, så vi styrer også størrelsen. Vi har kontrolleret, at der maksimalt kan kopieres 15 tegn, så det påvirker ikke vores program, hvis de indsætter flere. Hvis efter visning af meddelelsen Succes vi udfører en systemkommando (i dette tilfælde hvem er jeg), får vi oplysningerne:
Ovenstående er vi ikke root, men hvis vi udfører det med sudo, får vi følgende:
Det eneste, vi har tilføjet, er en linje i koden, som vi så ovenfor, under kodelinjen:
printf ("Succes \ n");Vi har sat:
system ("whoami");For at forstå lidt, hvad der er sket, vil jeg ændre programmet for at vise de 2 variabler, vi har (buffer Y n) uanset om det er korrekt eller ej, og nedenfor er output, det første vi indsætter en streng, der vil blive behandlet som korrekt (“Prøve”), Så en forkert, der ikke overskrider længden og endelig 20 bogstaver A.:
Vi ser, at det i den første udførelse er værd 1 Variablen n, fordi den passerede kæde er den korrekte, i den anden er den værd 0, fordi det er forkert, men i det sidste er det værd 1094795585, hvilket får springe den betingelse over, som vi sætter hvis (n), det vil være sandt, så længe n er forskellig fra 0. Det er ikke en god stand, selvom det ikke skulle mislykkes, hvis resten af koden var korrekt. Hvis vi sætter 16 bogstaver A som parameter vil vi se, at værdien af variablen n det er 65:
Hvis vi ser på ASCII -koden, tallet 65 svarer til brevet TIL, vi har set, at hukommelsen til variablen n ved et uheld er blevet berørt af os, det ekstra bogstav, som vi har givet som parameter, er gået til variablen n. Vi ville have hukommelsen som følger:
Hvis vi går ud over tegn, kan det være, at det sender os en meddelelse om krænkelse af et segment (hvis vi fjerner afslut (0) hvad har vi i hvis (n)), kan vi se det på følgende billede:
Denne advarsel skyldes et forsøg på at få adgang til et hukommelsesområde, der ligger uden for grænserne for det, som operativsystemet har tildelt applikationen. Hvis vi sammensatte eksemplet som følger:
gcc overflow.c -o overflow -stack -protectorEller bare fjerne -fno-stack-beskytter Fra den samling, vi så første gang, og vi udfører koden med overløb, får vi følgende resultat:
En ekstra beskyttelse, som gcc giver os.
BemærkHvis vi ville udføre en kode (shellcode) vi skulle overskrive returadressen med vores shellcode, den er noget mere kompleks end eksemplet set i selvstudiet og kræver derfor mere arbejde.
Hvis nogen formår at udnytte denne sårbarhed, kan det forårsage meget skade. Undgå at have denne type fejl, og at en ondsindet bruger kan drage fordel af dette er meget let, programmer korrekt, du skal kende godt det programmeringssprog, der bruges, vide, hvilke funktioner der skal bruges, og hvad de ikke skal bruge, test applikationen godt, ikke kun med korrekte data, det skal også fungere korrekt, når vi behandler uforudsete data.
Andre angreb, som du kan gennemgå og være opmærksom på, så de ikke påvirker dig eller minimerer deres risici, er: DoS og Brute Force. Og glem ikke at tjekke CVE -siden for sårbarheder.
Kan du lide og hjælpe denne vejledning?Du kan belønne forfatteren ved at trykke på denne knap for at give ham et positivt punkt