First Fit

Support HackTricks

Kwanza Kupangwa

Unapofuta kumbukumbu katika programu ukitumia glibc, "bins" tofauti hutumiwa kusimamia vipande vya kumbukumbu. Hapa kuna maelezo rahisi ya hali mbili za kawaida: unsorted bins na fastbins.

Unsorted Bins

Unapofuta kipande cha kumbukumbu ambacho sio kipande cha haraka, kinaenda kwenye bin isiyopangwa. Bin hii inafanya kazi kama orodha ambapo vipande vipya vilivyofutwa huongezwa mbele (kwenye "kichwa"). Unapohitaji kipande kipya cha kumbukumbu, mpangishaji huchunguza bin isiyopangwa kutoka nyuma (kwenye "mkia") ili kupata kipande kinachotosha. Ikiwa kipande kutoka kwenye bin isiyopangwa ni kikubwa kuliko unachohitaji, kinagawanywa, sehemu ya mbele ikirudishwa na sehemu iliyobaki ikibaki kwenye bin.

Mfano:

  • Unatenga bayti 300 (a), kisha bayti 250 (b), kisha unafuta a na kuomba tena bayti 250 (c).

  • Unapofuta a, inaenda kwenye bin isiyopangwa.

  • Ikiwa kisha unahitaji tena bayti 250, mpangishaji anapata a kwenye mkia na kugawanya, kurudisha sehemu inayotosha ombi lako na kuiweka iliyobaki kwenye bin.

  • c itakuwa inaelekeza kwa a ya awali na kujazwa na a's.

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

Fastbins

Fastbins hutumiwa kwa vipande vidogo vya kumbukumbu. Tofauti na vifungu visivyopangwa, fastbins huongeza vipande vipya kichwani, kujenga tabia ya mwisho-mwanzo (LIFO). Ikiwa unahitaji kipande kidogo cha kumbukumbu, mpangishaji atachukua kutoka kichwani mwa fastbin.

Mfano:

  • Unatenga vipande vinne vya baiti 20 kila moja (a, b, c, d).

  • Unapofungua kwa mpangilio wowote, vipande vilivyofunguliwa huongezwa kichwani mwa fastbin.

  • Ikiwa baadaye unahitaji kipande cha baiti 20, mpangishaji atarudisha kipande kilichofunguliwa hivi karibuni zaidi kutoka kichwani mwa fastbin.

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

Marejeo Mengine & Mifano

  • ARM64. Matumizi baada ya kuachilia: Unda kitu cha mtumiaji, acha, unda kitu ambacho kinapata kipande kilichoachiliwa na kuruhusu kuandika kwake, kubadilisha nafasi ya nywila ya mtumiaji kutoka ile iliyotangulia. Tumia mtumiaji tena ili kipuuze ukaguzi wa nywila

  • Programu inaruhusu kuunda maelezo. Maelezo yatakuwa na habari ya maelezo katika malloc(8) (na pointer kwa kazi inayoweza kuitwa) na pointer kwa malloc nyingine(<size>) na maudhui ya maelezo.

  • Shambulio litakuwa kuunda maelezo 2 (maelezo0 na maelezo1) na maudhui makubwa ya malloc kuliko ukubwa wa habari ya maelezo na kisha kuziachilia ili zipate kwenye sanduku la haraka (au tcache).

  • Kisha, unda maelezo mengine (maelezo2) yenye ukubwa wa maudhui 8. Maudhui yatakuwa kwenye maelezo1 kwani kipande kitatumika tena, ambapo tunaweza kubadilisha pointer ya kazi ili ielekee kwenye kazi ya ushindi na kisha Tumia-Baada-ya-Kuachilia maelezo1 kuita pointer ya kazi mpya.

  • Inawezekana kutenga kumbukumbu fulani, andika thamani inayotakiwa, acha, realloc it na kwa kuwa data ya awali bado iko hapo, itashughulikiwa kulingana na muundo mpya uliotarajiwa katika kipande hicho, ikifanya iwezekane kuweka thamani au kupata bendera.

  • Katika kesi hii ni lazima kuandika 4 ndani ya kipande maalum ambacho ni cha kwanza kuwa allocated (hata baada ya kufuta kwa nguvu vyote). Kwenye kila kipande kipya kilichoombwa namba yake katika indeksi ya safu inahifadhiwa. Kisha, tenga vipande 4 (+ cha kwanza kilichoombwa), cha mwisho kitakuwa na 4 ndani yake, ziache na kulazimisha upya wa kipande cha kwanza, ambacho kitatumia kipande kilichofutwa mwisho ambacho ni kile kilicho na 4 ndani yake.

Last updated