First Fit

Podržite HackTricks

Prva Fit

Kada oslobodite memoriju u programu koristeći glibc, različite "bins" se koriste za upravljanje memorijskim blokovima. Evo pojednostavljena objašnjenja dva uobičajena scenarija: unsorted bins i fastbins.

Unsorted Bins

Kada oslobodite memorijski blok koji nije brzi blok, on ide u unsorted bin. Ovaj bin deluje kao lista gde se novi oslobođeni blokovi dodaju na početak („head“). Kada zatražite novi blok memorije, alokator gleda unsorted bin sa zadnje strane („tail“) da pronađe blok dovoljno velik. Ako je blok iz unsorted bina veći od onoga što vam je potrebno, on se deli, pri čemu se prednji deo vraća, a preostali deo ostaje u binu.

Primer:

  • Alokujete 300 bajtova (a), zatim 250 bajtova (b), oslobodite a i ponovo zatražite 250 bajtova (c).

  • Kada oslobodite a, ide u unsorted bin.

  • Ako zatim ponovo zatražite 250 bajtova, alokator pronalazi a na repu i deli ga, vraćajući deo koji odgovara vašem zahtevu i zadržavajući ostatak u binu.

  • c će pokazivati na prethodni a i biti popunjen sa a-ima.

char *a = malloc(300);
char *b = malloc(250);
free(a);
char *c = malloc(250);

Fastbins

Fastbins se koriste za male memorijske blokove. Za razliku od nesortiranih kanti, fastbins dodaju nove blokove na početak, stvarajući ponašanje poslednji unutra - prvi napolje (LIFO). Ako zatražite mali blok memorije, alokator će uzeti blok sa početka fastbina.

Primer:

  • Alokujete četiri bloka od po 20 bajtova svaki (a, b, c, d).

  • Kada ih oslobodite u bilo kom redosledu, oslobođeni blokovi se dodaju na početak fastbina.

  • Ako zatim zatražite blok od 20 bajtova, alokator će vratiti najskorije oslobođeni blok sa početka fastbina.

char *a = malloc(20);
char *b = malloc(20);
char *c = malloc(20);
char *d = malloc(20);
free(a);
free(b);
free(c);
free(d);
a = malloc(20);   // d
b = malloc(20);   // c
c = malloc(20);   // b
d = malloc(20);   // a

Ostale reference i primeri

  • ARM64. Korišćenje nakon oslobađanja: Generisanje korisničkog objekta, oslobađanje istog, generisanje objekta koji dobija oslobođeni blok i omogućava pisanje u njega, prepisivanje pozicije korisnikovog->šifra iz prethodnog. Ponovno korišćenje korisnika da zaobiđe proveru šifre

  • Program omogućava kreiranje beleški. Beleška će imati informacije o belešci u malloc(8) (sa pokazivačem na funkciju koja može biti pozvana) i pokazivač na drugi malloc(<size>) sa sadržajem beleške.

  • Napad bi bio da se kreiraju 2 beleške (beleška0 i beleška1) sa većim malloc sadržajem od veličine informacija o belešci, a zatim ih oslobode kako bi bile smeštene u brzi bin (ili tcache).

  • Zatim, kreirajte još jednu belešku (beleška2) sa veličinom sadržaja 8. Sadržaj će biti u belešci1 jer će se blok ponovo koristiti, gde bismo mogli izmeniti pokazivač funkcije da pokazuje na funkciju za pobedu, a zatim koristiti Nakon-Oslobađanja belešku1 da pozove novi pokazivač funkcije.

  • Moguće je alocirati nešto memorije, upisati željenu vrednost, osloboditi je, ponovo alocirati i pošto su prethodni podaci i dalje tu, biće tretirani prema novoj očekivanoj strukturi u bloku što omogućava postavljanje vrednosti ili dobijanje zastave.

  • U ovom slučaju je potrebno upisati 4 unutar specifičnog bloka koji je prvi alociran (čak i nakon prinudnog oslobađanja svih njih). Na svakom novom alociranom bloku čuva se njegov broj u nizu indeksa. Zatim, alocirajte 4 bloka (+ prvobitno alociran), poslednji će imati unutar sebe 4, oslobodite ih i prinudno ponovo alocirajte prvi, koji će koristiti poslednji oslobođeni blok koji ima unutar sebe 4.

Last updated