House of Force
Last updated
Last updated
Naučite i vežbajte hakovanje AWS-a:HackTricks Obuka AWS Crveni Tim Stručnjak (ARTE) Naučite i vežbajte hakovanje GCP-a: HackTricks Obuka GCP Crveni Tim Stručnjak (GRTE)
Ova tehnika je zakrpljena (ovde) i proizvodi ovu grešku: malloc(): corrupted top size
Možete probati kod odavde da je testirate ako želite.
Cilj ovog napada je da se može alocirati komad na određenoj adresi.
Prekoračenje koje omogućava prepisivanje veličine zaglavlja vrha komada (npr. -1).
Biti u mogućnosti da se kontroliše veličina alociranja hipa
Ako napadač želi da alocira komad na adresi P da bi prepisao vrednost ovde. Počinje tako što prepisuje veličinu vrha komada sa -1
(možda prekoračenjem). Ovo osigurava da malloc neće koristiti mmap za bilo koju alokaciju jer će Vrh komada uvek imati dovoljno prostora.
Zatim, izračunajte udaljenost između adrese vrha komada i ciljnog prostora za alokaciju. Ovo je zato što će se malloc sa tom veličinom izvršiti kako bi se premestio vrh komada na tu poziciju. Na ovaj način razlika/veličina se može lako izračunati:
Dakle, dodeljivanje veličine cilj - stari_vrh - 4*sizeof(long)
(4 long-a su zbog metapodataka vrhunskog bloka i novog bloka kada je alociran) će premestiti vrhunski blok na adresu koju želimo da prepisujemo.
Zatim, uradite još jedan malloc da biste dobili blok na ciljanoj adresi.
Cilj ovog scenarija je ret2win gde treba izmeniti adresu funkcije koja će biti pozvana adresom funkcije ret2win
Binarni fajl ima prelivanje koje se može zloupotrebiti za izmenu veličine vrhunskog bloka, koji je izmenjen na -1 ili p64(0xffffffffffffffff)
Zatim se izračunava adresa mesta gde postoji pokazivač za prepisivanje, i razlika od trenutne pozicije vrhunskog bloka do tamo se alocira sa malloc
Na kraju se alocira novi blok koji će sadržati ovu željenu metu unutar koje će biti prepisana funkcija ret2win
U Unesite svoje ime:
postoji početna ranjivost koja omogućava otkrivanje adrese sa hipa
Zatim u funkcionalnosti Org:
i Host:
moguće je popuniti 64B pokazivača kada se traži org ime, koji na steku sledi adresa v2, koja se zatim prati navedenim host imenom. Kako će strcpy kopirati sadržaj s u blok veličine 64B, moguće je prepisanje veličine vrhunskog bloka podacima unetim unutar host imena.
Sada kada je moguće proizvoljno pisanje, GOT atoi
je prepisan na adresu printf-a. tada je moguće otkriti adresu IO_2_1_stderr
sa %24$p
. I sa ovim curenjem libc-a bilo je moguće ponovo prepisati GOT atoi
sa adresom system
i pozvati je prosleđujući kao parametar /bin/sh
Alternativna metoda predložena u ovom drugom writeup-u, je prepisati free
sa puts
, a zatim dodati adresu atoi@got
, u pokazivač koji će kasnije biti oslobođen tako da se curenje i ovim curenjem ponovo prepisuje atoi@got
sa system
i poziva se sa /bin/sh
.
Postoji UAF koji omogućava ponovnu upotrebu bloka koji je oslobođen bez brisanja pokazivača. Zbog nekih metoda čitanja, moguće je otkriti libc adresu upisivanjem pokazivača na funkciju free u GOT ovde, a zatim pozivanjem funkcije za čitanje.
Zatim je korišćen House of force (zloupotreba UAF-a) da se prepisuje veličina preostalog prostora sa -1, alocira blok dovoljno velik da se dođe do slobodnog kuka, a zatim alocira još jedan blok koji će sadržati slobodni kuk. Zatim, u kuk upisati adresu system
, upisati u blok "/bin/sh"
i na kraju osloboditi blok sa tim sadržajem stringa.