I denne opplæringen skal vi snakke om bufferoverløp (Bufferoverflyt), en feil som har eksistert i lang tid, oppstår når dataene som er kopiert i et minneområde (som tidligere er reservert) ikke er kontrollert riktig, kan det være at programmet fungerer som det skal hvis brukeren setter inn data med en tilstrekkelig størrelse, men hvis vi reserverer minne for 15 tegn og brukeren setter inn 20, vil det påvirke et annet minneområde, som kan reserveres eller ikke.
Dette kan få programmet til å henge, men det kan også være mye verre, en bruker med ondsinnede intensjoner kan dra nytte av denne feilen og påvirke driften av applikasjonen eller utføre vilkårlig kode på en datamaskin (normalt vil denne koden åpne en tolk av kommandoer ). Også hvis programmet kjører med forhøyede privilegier, har vi en alvorlig sikkerhetsfeil. Et annet angrep som kan endre driften av et program eller injisere kode er XSS.
MerkHenrettelsene du vil se gjennom denne opplæringen, er utført i 32-biters Ubuntu 16.04-operativsystemet.
La oss se a Enkelt eksempel på C -kode som er sårbart for dette angrepet, når vi starter programmet må vi passere en parameter, applikasjonen forvent å motta en streng som ikke er mer enn 15 tegn, hvis det er den forventede strengen, vil det være en vellykket tilgang, hvis ikke vil det bli "nektet". Koden er som vist nedenfor:
#include #include #define password "Test" void test (char * str) {char buffer [15]; int n = 0; strcpy (buffer, str); if (strcmp (buffer, passord) == 0) {n = 1; } hvis (n) {printf ("Suksess \ n"); exit (0); } annet {printf ("Tilgang nektet \ n"); }} int main (int argc, char * argv []) {if (argc <2) {printf ("Appen krever en parameter \ n"); utgang (-1); } test (argv [1]); }Programmet er oppkalt etter overløp. c, og for å kompilere følgende har blitt brukt:
gcc overflow.c -o overflow -fno -stack -protectorDen siste delen: -fno-stack-beskytter Den brukes slik at kompilatoren ikke setter beskyttelse, og vi kan vise eksemplet. Hvis brukeren legger inn riktige data, som er en streng på maksimalt 15 tegn, fungerer programmet bra, hvis vi skriver inn feil "passord", vil det vise oss Ingen tilgang, og hvis vi legger "Test"Vil sette oss Suksess. La oss se en fangst som utfører programmet 2 ganger, en gang med feil tilgang og en annen med riktig streng:
Vi ser at alt fungerer som det skal. Men hva om vi setter inn en øvre streng, la oss se hva som skjer:
Vi har lansert programmet med 20 bokstaver A, og viser oss Suksess. I denne applikasjonen har vi ingenting, vi avslutter ganske enkelt programmet, men vi har fått tilgang til et begrenset område uten å vite passordet. Hvis vi erstatter følgende funksjon:
strcpy (buffer, str);Av følgende:
strncpy (buffer, str, 15);Y vi kjører koden med 20 bokstaver A, har vi følgende utgang:
Du kan også se at vi bruker strcmp, i stedet bør vi bruke strncmp, så vi kontrollerer også størrelsen. Vi har kontrollert at bare maksimalt 15 tegn kan kopieres, så det påvirker ikke programmet vårt hvis de setter inn flere. Hvis etter at meldingen ble vist Suksess vi utfører en systemkommando (i dette tilfellet hvem er jeg), får vi informasjonen:
Ovenfor er vi ikke root, men hvis vi kjører det med sudo, får vi følgende:
Det eneste vi har lagt til er en linje i koden som vi så ovenfor, under kodelinjen:
printf ("Suksess \ n");Vi har satt:
system ("whoami");For å forstå litt hva som har skjedd, skal jeg endre programmet for å vise de 2 variablene vi har (buffer Y n) om det er riktig eller ikke, og nedenfor er utgangen, den første setter vi inn en streng som vil bli behandlet som korrekt (“Test”), Deretter en feil en som ikke overskrider lengden og til slutt 20 bokstaver A.:
Vi ser at det er verdt i den første henrettelsen 1 Variabelen n, fordi kjeden som er passert er den riktige, i den andre er den verdt 0, fordi det er feil, men i det siste er det verdt 1094795585, som gjør at vi hopper over betingelsen som vi legger hvis (n), vil det være sant så lenge n er forskjellig fra 0. Det er ikke en god tilstand, selv om det ikke trenger å mislykkes hvis resten av koden var riktig. Hvis vi legger 16 bokstaver A. som parameter vil vi se at verdien av variabelen n Det er 65:
Hvis vi ser på ASCII -koden, tallet 65 tilsvarer bokstaven TIL, vi har sett at minnet til variabelen n ved et uhell har blitt berørt av oss, den ekstra bokstaven som vi har passert som parameter har gått til variabelen n. Vi vil ha minnet slik:
Hvis vi går utover tegn, kan det være at det sender oss en melding om brudd på segmenter (hvis vi eliminerer avslutte (0) hva har vi i hvis (n)), kan vi se det på følgende bilde:
Denne advarselen skyldes et forsøk på å få tilgang til et minneområde som ligger utenfor grensene for det som operativsystemet har tilordnet applikasjonen. Hvis vi samlet eksemplet slik:
gcc overflow.c -o overflow -stack -protectorEller bare fjerne -fno-stack-beskytter Fra samlingen som vi så første gang, og vi kjører koden med overløp, får vi følgende resultat:
En ekstra beskyttelse som gcc gir oss.
MerkHvis vi ønsket å utføre en kode (shellcode) Vi må overskrive returadressen med shell -koden vår, den er noe mer kompleks enn eksemplet i opplæringen og krever derfor mer arbeid.
Hvis noen klarer å dra fordel av dette sikkerhetsproblemet, kan det forårsake mye skade. Unngå å ha denne typen feil og at en ondsinnet bruker kan dra nytte av dette er veldig enkelt, programmer riktig, du må kjenne godt til programmeringsspråket som brukes, vite hvilke funksjoner du skal bruke og hva du ikke skal bruke, test programmet vel, ikke bare med riktige data, det må også fungere riktig når vi håndterer uforutsette data.
Andre angrep som du kan gjennomgå og være oppmerksom på slik at de ikke påvirker deg eller minimerer risikoen, er: DoS og Brute Force. Og ikke glem å sjekke CVE -siden for sårbarheter.
Likte og hjalp du denne opplæringen?Du kan belønne forfatteren ved å trykke på denne knappen for å gi ham et positivt poeng