Da jeg glædede mig til at fortsætte med at diskutere dette emne, lad mig fortælle dig lidt historie, teori og praksis om sårbarheder. Vi har alle hørt nu, at sikkerhedsfejl kan koste meget, vi ved alle, at vi skal holde vores software opdateret, vi ved alle, at mange opdateringer er forårsaget af sikkerhedsfejl. Men i dag vil jeg fortælle dig lidt om, hvordan disse fejl findes og udnyttes 🙂 Men inden dette skal vi afklare et par detaljer for at få et bedre overblik.
Før du starter
Først vil jeg fortælle dig, at vi vil fokusere på den første sårbarhed, som jeg lærte at udnytte, den kendte Bufferoverløb, i denne sårbarhed drager vi fordel af manglende hukommelsesverifikation til at gøre sjove ting 🙂 Men lad os afklare lidt mere om det.
Dette bliver ikke et virkeligt verdensscenarie
Jeg har ikke råd til at lære dem at bryde ethvert program, de ser - først fordi det er farligt for deres computere, for det andet fordi det ville tage mere end min sædvanlige ordkvote.
Vi tager på en tur til 80'erne
Hvad jeg skal vise dig, kan jeg gøre på min bærbare computer, men det betyder ikke, at det kan gøres i dag på en enkel måde 🙂 mange af disse begreber er allerede blevet udnyttet så mange gange, at nye beskyttelsesmetoder og nye metoder til at undgå dem er dukket op 😛 men det returnerer os til det samme sted, der er ikke plads til at kunne fortælle alt det 🙂
Det fungerer muligvis ikke på din processor
Selvom jeg skal bruge et meget simpelt eksempel, vil jeg have det helt klart fra begyndelsen, at detaljerne i dette er så mange og så varierede, at ligesom det kan komme ud på samme måde som mig, hvis du vil prøve det , den ønskede effekt kan muligvis heller ikke opnås 🙂 Men du kan forestille dig, at jeg ikke kan forklare det i dette rum, især fordi jeg med denne introduktion allerede har taget mere end 300 ord, så vi kommer lige til vores punkt.
Hvad er en Bufferoverløb
For at besvare dette skal vi først forstå den første halvdel af denne kombination.
Buffere
Da alt handler om hukommelse på en computer, er det logisk, at der skal være en slags informationsbeholder. Når vi taler om indgange o udgange, kommer vi direkte til begrebet buffere. For at holde det kort, a buffer Det er et hukommelsesrum af defineret størrelse, hvor vi skal gemme en mængde information, simpel 🙂
Overløb opstår, som navnet antyder, når en buffer fylder med mere information, end den kan håndtere. Men hvorfor er dette vigtigt?
Stak
Også kendt som stakke, de er en abstrakt datatype, som vi kan stak information, deres vigtigste egenskab er, at de har en ordre LIFO (Last In First Out). Lad os tænke et sekund på en stak plader, vi lægger dem ovenpå en efter en, og så tager vi dem ud en efter en fra toppen, dette gør den sidste plade, vi har lagt (den der er øverst ) er den første plade, vi skal tage ud, selvfølgelig hvis vi kun kan tage en plade ad gangen, og vi beslutter at gøre det i den rækkefølge: P.
Nu hvor du kender disse to koncepter, er vi nødt til at sætte dem i orden. Stakke er vigtige, fordi hvert program, vi kører, har sit eget udførelsesstak. Men denne stak har en særlig egenskab, vokser ned. Det eneste du skal vide om dette er, at mens et program kører, når en funktion kaldes, går stakken fra et tal X i hukommelsen til et nummer (Xn). Men for at fortsætte skal vi forstå endnu et koncept.
Markører
Dette er et koncept, der gør mange programmerere vanvittige, når de starter i C's verden, faktisk skyldes den store kraft ved C-programmering delvis brugen af pegepinde. For at holde det enkelt, en markør peger på en hukommelsesadresse. Dette lyder komplekst, men det er ikke komplekst, vi har alle RAM i vores maskiner, ikke? Nå, dette kan defineres som en fortløbende arrangement af blokke, udtrykkes disse placeringer normalt i hexadecimale tal (fra 0 til 9 og derefter fra A til F, såsom 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). Her som en nysgerrig note, 0x10 INGEN er lig med 10 😛 hvis vi konverterer det til decimalrækkefølge, ville det være det samme som at sige 15. Dette er noget, der også forvirrer mere end en i starten, men lad os komme ned til det.
Records
Processorer arbejder med et antal registros, der arbejder for at overføre placeringer fra fysisk hukommelse til processoren, for arkitekturer, der bruger 64-bit, er antallet af registre stort og svært at beskrive her, men for at få ideen er registre som pegepinde, de angiver blandt andet , et hukommelsesrum (placering).
Øv dig nu
Jeg ved, at det har været meget information at behandle indtil nu, men i virkeligheden er det noget komplekse spørgsmål, som jeg forsøger at forklare på en meget enkel måde, vi vil se et lille program, der bruger buffere, og vi skal bryde det for at forstå dette om overløb, dette er naturligvis ikke Det er et rigtigt program, og vi vil "undgå" mange af de modforanstaltninger, der bruges i dag, bare for at vise, hvordan ting blev gjort før 🙂 og fordi nogle af disse principper er nødvendige for at kunne lære mere komplekse ting complex
GDB
Et godt program, der utvivlsomt er et af de mest anvendte af C. programmører. Blandt dets mange dyder har vi det faktum, at det giver os mulighed for at se alt dette, som vi hidtil har talt om, registre, stakken, buffere osv. 🙂 Lad os se det program, som vi skal bruge til vores eksempel.
retinput.c
Dette er et ret simpelt program, vi skal bruge biblioteket stdio.h
for at kunne få information og vise dem i en terminal. Vi kan se en funktion kaldet return_input
som genererer en buffer kaldet matrix, som har en længde på 30 bytes (char-datatypen er 1 byte lang).
Funktionen gets(array);
anmode om information efter konsol og funktion printf()
returnerer arrayets indhold og viser det på skærmen.
Hvert program skrevet i C begynder med funktionen main()
, dette vil kun være ansvarlig for at kalde return_input, nu skal vi kompilere programmet.
Lad os tage lidt af det, jeg lige har gjort. Muligheden -ggdb
fortæller gcc at kompilere programmet med information til gdb for at kunne fejle korrekt. -fno-stack-protector
Det er en mulighed, som vi naturligvis ikke skal bruge, men som vi skal bruge, fordi det ellers ville være muligt at generere bufferoverløbet i stakken. Til sidst har jeg testet resultatet. ./a.out
det kører bare det, jeg lige har kompileret, det beder om information og returnerer det. Løb 🙂
advarsler
En anden note her. Kan du se advarslerne? klart det er noget at tage i betragtning, når vi arbejder med kode eller kompilering, dette er lidt indlysende, og der er få programmer, der i dag har funktionen gets()
I koden. En fordel ved Gentoo er, at ved at sammensætte hvert program kan jeg se, hvad der kan være galt, et "ideelt" program burde ikke have dem, men du vil blive overrasket over, hvor mange store programmer der har disse advarsler, fordi de bare er MEGET store, og det er svært at holde styr på dem. farlige funktioner, når der er mange advarsler på samme tid. Nu hvis vi fortsætter
Fejlfinding af programmet
Nu kan denne del være lidt forvirrende, men da jeg allerede har skrevet nok, har jeg ikke råd til at forklare alt, så undskyld, hvis du ser, at jeg går for hurtigt 🙂
Frakobling af koden
Lad os starte med at se på vores kompilerede maskinsprogsprogram.
Dette er koden for vores hovedfunktion i Assembly, dette er hvad vores processor forstår, linjen til venstre er den fysiske adresse i hukommelsen <+ n> er kendt som offset, dybest set afstanden fra begyndelsen af funktionen (hoved) til denne erklæring (kendt som opcode). Derefter ser vi typen instruktion (push / mov / callq ...) og et eller flere registre. Sammenfattet kan vi sige, at det er indikationen efterfulgt af kilde / oprindelse og destination. <return_input>
refererer til vores anden funktion, lad os tage et kig.
return_input
Dette er lidt mere komplekst, men jeg vil bare have dig til at kontrollere et par ting, der er et mærke kaldet <gets@plt>
og en sidste opkode kaldet retq
angiver slutningen af funktionen. Vi vil sætte et par breakpoints, en i funktionen gets
og en anden i retq
.
Kør
Nu skal vi køre programmet for at se, hvordan handlingen begynder.
Vi kan se, at der vises en lille pil, der indikerer opkoden, hvor vi er, jeg vil have dem til at tage højde for retningen 0x000055555555469b
, dette er adressen efter opkaldet til return_input
i funktion main
, dette er vigtigt, da det er her, programmet skal vende tilbage, når du er færdig med at modtage indgang, lad os komme ind i funktionen. Nu skal vi kontrollere hukommelsen, inden vi går ind i funktionen gets
.
Jeg har sat hovedfunktionen tilbage til dig, og jeg har fremhævet den kode, jeg henviste til, som du kan se på grund af endighed er blevet opdelt i to segmenter, vil jeg have dig til at tage hensyn til retningen 0x7fffffffdbf0
(den første fra venstre efter kommandoen x/20x $rsp
) da dette er det sted, vi skal bruge til at kontrollere get-resultatet, lad os fortsætte:
Bryder programmet
Jeg har fremhævet dem 0x44444444
fordi de er repræsentationen af vores D'er 🙂 nu er vi begyndt at tilføje indgang til programmet, og som du kan se, er vi kun to linjer fra vores ønskede adresse, vi skal udfylde det, indtil vi er lige før adresserne, som vi fremhævede i det forrige trin.
Ændring af returstien
Nu hvor det er lykkedes os at indtaste dette afsnit af koden, hvor det angiver funktionens returnering, lad os se, hvad der sker, hvis vi ændrer adressen 🙂 i stedet for at gå til placeringen af opkoden, der følger den, vi havde for et øjeblik siden, hvad synes du, hvis vi går tilbage til return_input
? Men til dette er det nødvendigt at skrive den adresse, vi ønsker i binær, vi skal gøre det med funktionen printf
fra bash 🙂
Nu har vi modtaget oplysningerne to gange 😀 programmet var bestemt ikke lavet til det, men det er lykkedes os at bryde koden og få den til at gentage noget, som det ikke skulle gøre.
Refleksioner
Denne enkle ændring kan betragtes som en udnytte meget grundlæggende 🙂 han har formået at bryde programmet og gøre noget, vi vil have ham til at gøre.
Dette er bare det første trin i en næsten uendelig liste over ting at se og tilføje, der er måder at tilføje flere ting end blot at gentage en ordre, men denne gang har jeg skrevet meget og alt relateret til skalkodning Det er et emne at skrive mere end artikler, komplette bøger, vil jeg sige. Beklager, hvis jeg ikke har været i stand til at fordybe mig lidt mere i emner, som jeg gerne ville have, men der vil helt sikkert være en chance 🙂 Hilsner og tak for, at du er kommet her.
Vær mere direkte. Skriv mindre og fokuser på det der betyder noget
Hej, tak for kommentaren.
For at fortælle sandheden har jeg skåret en god del af idéer, men alligevel syntes det mig, at jeg forlod minimumet, så nogen, der ikke har programmeringskendskab, kan få en idé.
hilsen
Problemet er, at de, der ikke har programmeringsviden, ikke finder ud af noget, fordi det er for komplekst til at begynde med, men de, der ved, hvordan man programmerer, sætter pris på at være mere direkte.
Jeg antager, at du ikke kan nå ud til alle, du skal vælge, og i dette tilfælde har du syndet for at dække meget.
Forresten, jeg fortæller dig som en konstruktiv kritik, jeg elsker disse emner, og jeg vil gerne have, at du fortsætter med at skrive artikler, tillykke!
Jeg synes det samme.
Mange tak til begge dele !! det er bestemt svært at forstå, hvordan man når ud til målgruppen, når sandheden er, at antallet af personer med et avanceret programmeringsniveau, der læser disse artikler, er lille (i det mindste kan man udlede på baggrund af kommentarerne)
Jeg har bestemt syndet fra at ville forenkle noget, der kræver en bred videnbase for at blive forstået. Jeg håber, du forstår, at da jeg lige er begyndt at blogge, har jeg endnu ikke opdaget det nøjagtige punkt, hvor mine læsere kender og forstår, hvad jeg siger. Det ville gøre det meget lettere at fortælle sandheden 🙂
Jeg vil prøve at være kortere, når det fortjener uden at personalisere formatet, da det er lidt mere kompliceret at adskille skrivemåden fra indholdet, end man måske forestiller sig, jeg har dem i det mindste ret sammenkædede, men jeg formoder, at jeg i sidste ende vil være i stand til for at tilføje linjer i stedet for at skære indhold.
hilsen
Hvor kunne du vide mere om emnet? Enhver anbefalet bog?
Eksemplet, jeg fik fra The Shellcoder's Handbook af Chris Anley, John Heasman, Felix Linder og Gerardo Richarte, men for at udføre 64-bit oversættelsen måtte jeg lære mere om min arkitektur, Intel-udviklerhåndbogen, bind 2 og 3 er en ret pålidelig kilde til det. Det er også godt at læse GDB-dokumentationen, der kommer med kommandoen 'info gdb'. For at lære samling og C er der mange meget gode bøger, bortset fra at forsamlingsbøgerne er lidt gamle, så der er et hul at udfylde med en anden type dokumentation.
Selve shellkoden er ikke længere så effektiv i disse dage af forskellige årsager, men det er stadig interessant at lære nye teknikker.
Håber det hjælper lidt 🙂 Hilsner
Buen artículo, el viejo blog desdelinux ha vuelto a renacer =)
Når du siger, at fjernskal ikke er så effektiv, mener du modforanstaltninger designet til at afbøde angreb, de kalder det stødende sikkerhed.
Hilsen og fortsæt det
Mange tak Franz 🙂 meget venlige ord, faktisk mente jeg, at Shellcoding i dag er meget mere kompleks end det, vi ser her. Vi har ASLR (tilfældig hukommelsesplaceringsgenerator) stakbeskytteren, de forskellige tiltag og modforanstaltninger, der begrænser antallet af opkoder, der kan injiceres i et program, og det er kun begyndelsen.
Regards,
Hej, vil du gøre en anden del, der udvider emnet? Det er interessant
Hej, emnet er bestemt ganske interessant, men det kompleksitetsniveau, som vi ville tage, ville blive meget højt og sandsynligvis involvere et stort antal indlæg for at forklare de forskellige forudsætninger for at forstå det andet. Jeg vil sandsynligvis skrive om det, men det vil ikke være følgende indlæg, jeg vil skrive et par emner inden jeg fortsætter med dette.
Hilsner og tak for deling
Meget god che! Du bidrager med gode indlæg! Et spørgsmål, jeg starter denne IT-sikkerhed ved at læse en bog kaldet "Sikre sikkerhed ved pen-test." Anbefales denne bog? Hvordan foreslår du, at jeg begynder at forhøre mig om disse problemer?
Hej kaktus, det er et helt univers om sårbarheder og andre, for at sige sandheden afhænger det meget af, hvad der fanger din opmærksomhed, og de behov, du har, en it-manager behøver ikke at kende det samme som en pen-tester, Eller en forsker i sårbarhed eller en retsmedicinsk analytiker, et katastrofegendannelsesteam har et meget andet sæt færdigheder. Det er klart, at hver af dem kræver et andet niveau af teknisk viden, jeg anbefaler, at du begynder at opdage, hvad du kan lide, og begynder at fortære bøger, artikler og andre, og vigtigst af alt, øve alt, hvad du læser, selvom det er forældet, det vil gøre en forskel i sidste ende.
Regards,
Hej.
Mange tak for at forklare dette emne samt kommentere, at vi har "The Shellcoder's Handbook" for ekstra information. Jeg har allerede afventet læsning 😉