Pogled na izkoriščanje ranljivosti

Ker sem se veselil nadaljnje razprave o tej temi, naj vam povem nekaj zgodovine, teorije in prakse glede ranljivosti. Vsi smo že slišali, da lahko varnostne napake stanejo veliko, vsi vemo, da moramo svojo programsko opremo posodabljati, vsi vemo, da veliko posodobitev povzročajo varnostne napake. Toda danes vam bom povedal nekaj o tem, kako te napake najdemo in izkoristimo. Pred tem pa bomo razjasnili nekaj podrobnosti, da bomo imeli boljši pregled.

Preden začnete

Najprej vam želim povedati, da se bomo osredotočili na prvo ranljivost, ki sem se jo naučil izkoriščati, znano Preliv medpomnilnika, v tej ranljivosti izkoriščamo pomanjkanje preverjanja pomnilnika, da naredimo zabavne stvari 🙂 Toda pojasnimo malo več o tem.

To ne bo resničen scenarij

Ne morem si privoščiti, da bi jih naučil, da prekinejo kateri koli program, ki ga vidijo 🙂 prvič, ker je to nevarno za njihove računalnike, drugič, ker bi to trajalo več kot moja običajna kvota besed.

Odpravimo se na izlet v 80. leta

Kaj vam bom pokazal, da lahko naredim na svojem prenosnem računalniku, vendar to ne pomeni, da je danes to mogoče narediti na preprost način 🙂 veliko teh konceptov je bilo že tolikokrat izkoriščenih, da so se nove zaščitne metode in nove metode izognile pojavili so se 😛, a to nas vrne na isto mesto, ni prostora, da bi vse to povedali 🙂

Na vašem procesorju morda ne bo delovalo

Čeprav bom uporabil zelo preprost primer, želim, da bo že od začetka povsem jasno, da je podrobnosti tega toliko in tako raznolikih, da tako kot se lahko izkaže enako kot jaz, če želite poskusiti, želenega učinka morda tudi ne bo mogoče doseči 🙂 Lahko pa si predstavljate, da tega ne morem razložiti v tem prostoru, še posebej zato, ker sem s tem uvodom sprejel že več kot 300 besed, tako da smo prišli naravnost do svoje točke.

Kaj je a Preliv medpomnilnika

Da bi odgovorili na to, moramo najprej razumeti prvo polovico te kombinacije.

Odbojniki

Ker gre za pomnilnik v računalniku, je logično, da mora obstajati nekakšen vsebnik z informacijami. Ko govorimo o vhodi izhodi, smo prišli neposredno do koncepta odbojniki. Da bo kratko, a varovalni To je pomnilniški prostor določene velikosti, v katerega bomo shranili količino informacij, preprosto 🙂

Kot že ime pove, se prelivi pojavijo, ko se medpomnilnik napolni z več informacijami, kot jih zmore. Zakaj pa je to pomembno?

Stack

Znani tudi kot skladi, so abstraktna vrsta podatkov, v kateri lahko sklad informacije, njihova glavna značilnost je, da imajo naročilo LIFO (zadnji v prvem izhodu). Pomislimo za trenutek na kup krožnikov, jih postavimo enega po enega na vrh, nato pa enega po enega vzamemo od zgoraj, tako da je zadnja plošča, ki smo jo postavili (tista, ki je na vrhu), prva plošča Kaj bomo vzeli ven, seveda, če lahko vzamemo samo po eno ploščo naenkrat in se odločimo, da to storimo v tem vrstnem redu:

Zdaj, ko poznate ta dva koncepta, jih moramo spraviti v red. Skladi so pomembni, ker ima vsak program, ki ga izvajamo, svojega izvedbeni sklad. Toda ta kup ima posebna značilnostraste navzdol. Edino, kar morate vedeti o tem, je, da se med izvajanjem programa, ko se prikliče funkcija, sklad preklopi s številke X v pomnilniku na številko (Xn). Toda za nadaljevanje moramo razumeti še en koncept.

Kazalci

To je koncept, ki mnoge programerje obnese, ko začnejo v svetu C, pravzaprav je velika moč programiranja C deloma posledica uporabe kazalcev. Da bo preprosto, kazalec kaže na pomnilniški naslov. To se sliši zapleteno, vendar ni tako zapleteno, vsi imamo RAM v svojih napravah, kajne? No, to lahko definiramo kot a zaporedna razporeditev blokovso te lokacije običajno izražene v šestnajstiških številih (od 0 do 9 in nato od A do F, na primer 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). Tukaj kot radovedna opomba, 0x10 NE je enako 10 😛, če ga pretvorimo v decimalni vrstni red, bi bilo enako, kot če bi rekli 15. To je nekaj, kar prav tako zmede več kot eno na začetku, a pojdimo na to.

Zapisi

Procesorji sodelujejo s številnimi evidence, ki delujejo za prenos lokacij iz fizičnega pomnilnika v procesor, pri arhitekturah, ki uporabljajo 64-bitne različice, je število registrov veliko in tukaj je težko opisati, toda da bi dobili idejo, so registri kot kazalci, med drugim navajajo stvari, pomnilniški prostor (lokacija).

Zdaj vadite

Vem, da je bilo do zdaj obdelanih veliko informacij, v resnici pa gre za nekoliko zapletena vprašanja, ki jih skušam razložiti na zelo preprost način, videli bomo majhen program, ki uporablja medpomnilnike in ga bomo razbili, da bomo to razumeli glede prelivov, očitno ta ni To je resničen program in "izognili se bomo" mnogim protiukrepom, ki se danes uporabljajo, samo zato, da pokažemo, kako so se stvari delale prej 🙂 in ker so nekatera od teh načel potrebna, da se lahko naučimo bolj zapletenih stvari 😉

GDB

Odličen program, ki je nedvomno eden najbolj uporabljenih programerjev C. Med njegovimi številnimi vrlinami imamo dejstvo, da nam omogoča, da vidimo vse to, o čemer smo govorili doslej, registre, sklad, medpomnilnike itd. 🙂 Poglejmo program, ki ga bomo uporabili za svoj primer.

retinput.c

Lastno. Christopher Diaz Riveros

To je dokaj preprost program, uporabljali bomo knjižnico stdio.h da lahko pridobijo informacije in jih prikažejo v terminalu. Vidimo funkcijo, imenovano return_input ki ustvarja a varovalni imenuje matrika, ki ima dolžino 30 zlogov (vrsta podatkov char je dolga 1 bajt).

Funkcija gets(array); zahtevajte informacije po konzoli in funkciji printf() vrne vsebino matrike in jo prikaže na zaslonu.

Vsak program, napisan v jeziku C, se začne s funkcijo main(), ta bo zadolžen samo za klic return_input, zdaj bomo sestavili program.

Lastno. Christopher Diaz Riveros

Vzemimo si nekaj, kar sem pravkar storil. Možnost -ggdb pove gcc-u, naj pripravi program z informacijami za gdb, da bo lahko pravilno odpravil napake. -fno-stack-protector To je možnost, ki je očitno ne bi smeli uporabljati, ampak jo bomo uporabili, ker bi sicer bilo mogoče v kupu ustvariti preliv medpomnilnika. Na koncu sem preizkusil rezultat. ./a.out samo zažene tisto, kar sem pravkar zbral, zahteva informacije in jih vrne. Tek 🙂

Opozorila

Še ena opomba tukaj. Ali vidite opozorila? očitno je nekaj, kar je treba upoštevati pri delu s kodo ali pri prevajanju, to je nekoliko očitno in malo je programov, ki imajo danes funkcijo gets() V kodi. Ena od prednosti Gentoo-a je ta, da pri sestavljanju vsakega programa vidim, kaj bi lahko bilo narobe, "idealen" program jih ne bi smel imeti, vendar bi bili presenečeni, koliko velikih programov ima ta opozorila, ker so zelo ZELO velika in je težko jim je slediti nevarnim funkcijam, kadar je hkrati veliko opozoril. Zdaj, če nadaljujemo

Odpravljanje napak programa

Lastno. Christopher Diaz Riveros

Zdaj je ta del lahko nekoliko zmeden, toda ker sem že dovolj napisal, si ne morem privoščiti, da bi vse razložil, žal mi je, če vidite, da grem prehitro 🙂

Razorožitev kode

Začnimo z ogledom našega sestavljenega programa za strojni jezik.

Lastno. Christopher Diaz Riveros

To je koda naše glavne funkcije v Skupščina, to naš procesor razume, vrstica na levi je fizični naslov v pomnilniku, <+ n> je znano kot odmik, v bistvu razdalja od začetka funkcije (main) do tega stavka (znanega kot opcode). Nato vidimo vrsto navodil (push / mov / callq…) in enega ali več registrov. Povzeto lahko rečemo, da gre za navedbo, ki ji sledita vir / izvor in cilj. <return_input> se nanaša na našo drugo funkcijo, poglejmo.

return_input

Lastno. Christopher Diaz Riveros

To je nekoliko bolj zapleteno, vendar želim le, da preverite nekaj stvari, imenuje se oznaka <gets@plt> in še zadnjo poklicano opcode retq označuje konec funkcije. Postavili bomo nekaj mejnih točk, eno v funkcijo gets in drugo v retq.

Lastno. Christopher Diaz Riveros

Run

Zdaj bomo zagnali program in videli, kako se začne akcija.

Lastno. Christopher Diaz Riveros

Vidimo, da se prikaže majhna puščica, ki označuje kodo za klic, kje smo, želim, da upoštevajo smer 0x000055555555469b, to je naslov po klicu return_input v funkciji main , to je pomembno, saj se mora tu program vrniti, ko končate s prejemanjem vhod, pojdimo v funkcijo. Zdaj bomo pred vnosom funkcije preverili pomnilnik gets.

Lastno. Christopher Diaz Riveros

Glavno funkcijo sem vam dal gor in poudaril kodo, na katero sem se skliceval, kot vidite, zaradi endianness je bil ločen na dva segmenta, želim, da upoštevajo smer 0x7fffffffdbf0 (prva z leve po komandosu x/20x $rsp) ker je to lokacija, ki jo moramo uporabiti za preverjanje rezultatov, nadaljujmo:

Prekinitev programa

Lastno. Christopher Diaz Riveros

Te sem poudaril 0x44444444ker so predstavitev naših DS-jev 🙂 zdaj smo začeli dodajati vhod do programa in kot vidite, smo od želenega naslova oddaljeni le dve vrstici, napolnili ga bomo, dokler ne bomo tik pred naslovi, ki smo jih poudarili v prejšnjem koraku.

Spreminjanje povratne poti

Zdaj, ko smo uspeli vnesti ta odsek kode, kjer označuje vrnitev funkcije, poglejmo, kaj se zgodi, če spremenimo naslov 🙂, namesto da bi šli na lokacijo kode opcij, ki sledi tisti, ki smo jo imeli pred časom, kaj mislite če se vrnemo k return_input? Toda za to je treba v binarno datoteko zapisati naslov, ki ga želimo, to bomo storili s funkcijo printf iz bash 🙂

Lastno. Christopher Diaz Riveros

Zdaj smo informacije prejeli dvakrat 😀 program zagotovo ni bil narejen za to, vendar smo uspeli zlomiti kodo in ponoviti nekaj, česar naj ne bi storili.

Razmišljanja

To preprosto spremembo lahko štejemo za a izkoriščanje zelo osnovno 🙂 uspel je prekiniti program in narediti nekaj, kar želimo, da naredi.

To je le prvi korak na skoraj neskončnem seznamu stvari, ki jih je treba videti in dodati, obstaja več načinov, da dodate več stvari kot preprosto ponavljanje naročila, toda tokrat sem napisal veliko in vse, kar je povezano z kodiranje lupine bi moral napisati več kot članke, rekel bi celotne knjige. Žal mi je, če se nisem mogel malo bolj poglobiti v teme, ki bi mi bile všeč, a zagotovo bo priložnost 🙂 Lep pozdrav in hvala, da ste prišli sem.


Pustite svoj komentar

Vaš e-naslov ne bo objavljen. Obvezna polja so označena z *

*

*

  1. Za podatke odgovoren: Miguel Ángel Gatón
  2. Namen podatkov: Nadzor neželene pošte, upravljanje komentarjev.
  3. Legitimacija: Vaše soglasje
  4. Sporočanje podatkov: Podatki se ne bodo posredovali tretjim osebam, razen po zakonski obveznosti.
  5. Shranjevanje podatkov: Zbirka podatkov, ki jo gosti Occentus Networks (EU)
  6. Pravice: Kadar koli lahko omejite, obnovite in izbrišete svoje podatke.

  1.   2p2 je dejal

    Bodite bolj neposredni. Pišite manj in se osredotočite na tisto, kar je pomembno

    1.    ChrisADR je dejal

      Živjo, hvala za komentar.

      Resnici na ljubo sem odrezal dobršen del idej, a kljub temu se mi je zdelo, da sem pustil minimum, da lahko nekdo, ki nima programskega znanja, dobi idejo.

      pozdrav

      1.    anonimni je dejal

        Težava je v tem, da tisti, ki nimajo znanja programiranja, ne bodo izvedeli za nič, ker je za začetek preveč zapleteno, toda tisti, ki znajo programirati, cenijo, da so bolj neposredni.

        Predvidevam, da ne morete doseči vseh, izbrati morate, in v tem primeru ste grešili, da bi radi veliko pokrivali.

        Mimogrede, kot konstruktivno kritiko vam povem, da imam rad te teme in bi rad, da še naprej pišete članke, čestitke!

    2.    anonimni je dejal

      Enako mislim.

      1.    ChrisADR je dejal

        Obema najlepša hvala !! Vsekakor je težko razumeti, kako doseči ciljno publiko, če je resnica, da je število ljudi z napredno programsko stopnjo, ki berejo te članke, malo (vsaj o tem lahko sklepamo na podlagi komentarjev)

        Vsekakor sem se pregrešil, ker sem hotel poenostaviti nekaj, za kar je treba razumeti široko bazo znanja. Upam, da razumete, da ker sem šele začel z blogiranjem, še nisem odkril natančne točke, ko bralci vedo in razumejo, kaj govorim. Tako bi bilo veliko lažje govoriti resnico 🙂

        Poskušal bom biti krajši, ko to zasluži, brez depersonalizacije oblike, saj je ločevanje načina pisanja od vsebine nekoliko bolj zapleteno, kot bi si lahko predstavljali, vsaj imam jih precej povezane, vendar mislim, da bom na koncu lahko dodal vrstice v namesto da bi rezali vsebino.

        pozdrav

  2.   Mario je dejal

    Kje bi lahko vedeli več o tej temi? Kakšna priporočena knjiga?

    1.    ChrisADR je dejal

      Primer so iz The Shellcoder's Handbook povzeli Chris Anley, John Heasman, Felix Linder in Gerardo Richarte, toda za 64-bitni prevod sem se moral naučiti o svoji arhitekturi, priročnik za razvijalce Intel, zvezki 2 in 3 pa sta precej zanesljiv vir za to. Dobro je prebrati tudi dokumentacijo GDB, ki je priložena ukazu 'info gdb'. Za učenje Assembly in C obstaja veliko zelo dobrih knjig, le da so zbirne knjige nekoliko stare, zato obstaja vrzel, ki jo je treba zapolniti z drugo tipska dokumentacija.

      Sama lupina danes zaradi različnih razlogov ni več tako učinkovita, je pa vseeno zanimivo spoznavanje novih tehnik.

      Upam, da malo pomaga 🙂 Lep pozdrav

  3.   Franz je dejal

    Buen artículo, el viejo blog desdelinux ha vuelto a renacer =)
    Ko pravite, da oddaljena lupina ni tako učinkovita, mislite na protiukrepe, namenjene ublažitvi napadov, temu pravijo žaljiva varnost.
    Lep pozdrav in tako nadaljujte

    1.    ChrisADR je dejal

      Najlepša hvala, Franz, zelo prijazne besede, pravzaprav sem mislil, da je Shellcoding danes veliko bolj zapleten, kot ga vidimo tukaj. Na voljo imamo ASLR (generator naključnega pomnilnika) zaščito skladov, različne ukrepe in protiukrepe, ki omejujejo število opcode, ki jih je mogoče vstaviti v program, in to je šele začetek.

      S spoštovanjem,

  4.   Brezplačna programska oprema je dejal

    Pozdravljeni, boste naredili še en del za razširitev teme? Zanimivo je

    1.    ChrisADR je dejal

      Pozdravljeni, zadeva je vsekakor precej zanimiva, toda stopnja zapletenosti, ki bi jo sprejeli, bi postala zelo visoka, verjetno bi vključevala veliko število objav, ki bi razložila različne predpogoje za razumevanje drugega. Verjetno bom o tem pisal, vendar to ne bodo naslednje objave, pred nadaljevanjem s tem želim napisati nekaj tem.

      Lep pozdrav in hvala za delitev

  5.   kaktus je dejal

    Zelo dober che! Prispevate odlične objave! Eno od vprašanj je, da to informacijsko varnost začenjam z branjem knjige z naslovom "Zagotavljanje varnosti s testiranjem pisala". Ali je ta knjiga priporočljiva? Kako predlagate, da se začnem pozanimavati o teh vprašanjih?

    1.    ChrisADR je dejal

      Pozdravljeni kaktus, gre za celotno vesolje o ranljivostih, drugi pa, resnici na ljubo, je odvisno od tega, kaj pritegne vašo pozornost in potrebe, ki jih imate. Ali raziskovalec ranljivosti ali forenzični analitik, ekipa za obnovo po katastrofi ima zelo različen nabor spretnosti. Očitno vsak od njih zahteva drugačno tehnično znanje, priporočam, da začnete odkrivati ​​točno tisto, kar vam je všeč, in začnete požirati knjige, članke in druge, predvsem pa vadite vse, kar ste prebrali, četudi je zastarelo, to bo na koncu spremenilo.
      S spoštovanjem,

  6.   Eizen je dejal

    Hej.
    Najlepša hvala za razlago te teme in komentar, da imamo za dodatne informacije "Priročnik Shellcoderja". Že imam v branju 😉