First Fit

Ondersteun HackTricks

Eerste Pas

Wanneer jy geheue in 'n program vrymaak wat glibc gebruik, word verskillende "bins" gebruik om die geheueblokke te bestuur. Hier is 'n vereenvoudigde verduideliking van twee algemene scenarios: ongesorteerde bins en vinnigebins.

Ongesorteerde Bins

Wanneer jy 'n geheueblok vrymaak wat nie 'n vinnige blok is nie, gaan dit na die ongesorteerde bin. Hierdie bin tree op soos 'n lys waar nuwe vrygemaakte blokke aan die voorkant (die "kop") bygevoeg word. Wanneer jy 'n nuwe blok geheue aanvra, kyk die toewysingsprogram na die ongesorteerde bin van agter (die "stert") om 'n blok te vind wat groot genoeg is. As 'n blok van die ongesorteerde bin groter is as wat jy nodig het, word dit verdeel, met die voorkant wat teruggegee word en die oorblywende deel wat in die bin bly.

Voorbeeld:

  • Jy ken 300 byte toe (a), dan 250 byte (b), vrymaak dan a en vra weer 250 byte (c).

  • Wanneer jy a vrymaak, gaan dit na die ongesorteerde bin.

  • As jy dan weer 250 byte aanvra, vind die toewysingsprogram a aan die stert en verdeel dit, waar die deel wat aan jou versoek voldoen teruggegee word en die res in die bin bly.

  • c sal na die vorige a wys en met die a's gevul wees.

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

Fastbins

Fastbins word gebruik vir klein geheueblokke. In teenstelling met ongesorteerde blokke, voeg fastbins nuwe blokke by die kop, wat 'n laaste-in-eerste-uit (LIFO) gedrag skep. As jy 'n klein blokkie geheue aanvra, sal die toewysingsprogram van die fastbin se kop trek.

Voorbeeld:

  • Jy ken vier blokke van 20 byte elk toe (a, b, c, d).

  • Wanneer jy hulle in enige volgorde vrymaak, word die vrygemaakte blokke by die kop van die fastbin gevoeg.

  • As jy dan 'n 20-byte blokkie aanvra, sal die toewysingsprogram die mees onlangs vrygemaakte blokkie van die kop van die fastbin teruggee.

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

Ander Verwysings & Voorbeelde

  • ARM64. Gebruik na vrylating: Skep 'n gebruiker-objek, vry dit, skep 'n objek wat die vrygemaakte blok kry en toelaat om daaraan te skryf, om die posisie van die gebruiker se wagwoord te oorskryf van die vorige een. Hergebruik die gebruiker om die wagwoordkontrole te vermy

  • Die program maak dit moontlik om notas te skep. 'n Nota sal die nota-inligting hê in 'n malloc(8) (met 'n verwysing na 'n funksie wat opgeroep kan word) en 'n verwysing na 'n ander malloc(<grootte>) met die inhoud van die nota.

  • Die aanval sou wees om 2 notas te skep (nota0 en nota1) met groter malloc-inhoud as die grootte van die nota-inligting en hulle dan vry te stel sodat hulle in die vinnige blok (of tcache) beland.

  • Skep dan 'n ander nota (nota2) met inhoudsgrootte 8. Die inhoud gaan in nota1 wees aangesien die blok hergebruik gaan word, waar ons die funksie-aanwysers kan wysig om na die wen-funksie te wys en dan Gebruik-Na-Vrylating die nota1 om die nuwe funksie-aanwyser te roep.

  • Dit is moontlik om 'n bietjie geheue toe te ken, die gewenste waarde te skryf, dit vry te stel, dit weer toe te ken en aangesien die vorige data nog daar is, sal dit hanteer word volgens die nuwe verwagte struktuur in die blok wat dit moontlik maak om die waarde in te stel of die vlag te kry.

  • In hierdie geval is dit nodig om 4 binne 'n spesifieke blok te skryf wat die eerste een is wat toegewys word (selfs nadat almal van hulle gedwing vrygestel is). Op elke nuwe toegewysde blok word sy nommer in die reeksindeks gestoor. Toe, ken 4 blokke toe (+ die aanvanklik toegewysde), die laaste een sal 4 binne dit hê, stel hulle vry en dwing die herkenning van die eerste een af, wat die laaste blok wat vrygestel is, sal gebruik wat die een met 4 binne dit is.

Last updated