Translated ['binary-exploitation/heap/bins-and-memory-allocations.md', '

This commit is contained in:
Translator 2024-06-13 00:49:10 +00:00
parent ce2a0f607a
commit 47bb309719
5 changed files with 166 additions and 60 deletions

View file

@ -731,6 +731,7 @@
* [Use After Free](binary-exploitation/heap/use-after-free/README.md)
* [First Fit](binary-exploitation/heap/use-after-free/first-fit.md)
* [Double Free](binary-exploitation/heap/double-free.md)
* [Overwriting a freed chunk](binary-exploitation/heap/overwriting-a-freed-chunk.md)
* [Heap Overflow](binary-exploitation/heap/heap-overflow.md)
* [Unlink Attack](binary-exploitation/heap/unlink-attack.md)
* [Fast Bin Attack](binary-exploitation/heap/fast-bin-attack.md)

View file

@ -6,7 +6,7 @@
Drugi načini podrške HackTricks-u:
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
@ -16,24 +16,24 @@ Drugi načini podrške HackTricks-u:
## Osnovne informacije
Kako bi se poboljšala efikasnost skladištenja blokova, svaki blok nije samo u jednoj povezanoj listi, već postoje različite vrste. To su alokacije memorije i postoji 5 vrsta alokacija: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) male alokacije, 63 velike alokacije, 1 nesortirana alokacija, 10 brzih alokacija i 64 tcache alokacije po niti.
Kako bi se poboljšala efikasnost načina na koji su delovi memorije smešteni, svaki deo memorije nije samo u jednoj povezanoj listi, već postoji nekoliko tipova. To su alokacije memorije i postoji 5 tipova alokacija: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) male alokacije, 63 velike alokacije, 1 nesortirana alokacija, 10 brzih alokacija i 64 tcache alokacije po niti.
Početna adresa za svaku nesortiranu, malu i veliku alokaciju je unutar istog niza. Indeks 0 nije korišćen, 1 je nesortirana alokacija, alokacije 2-64 su male alokacije, a alokacije 65-127 su velike alokacije.
### Tcache (Keš po niti) Alokacije
Iako niti pokušavaju da imaju svoj sopstveni stek (videti [Arene](bins-and-memory-allocations.md#arenas) i [Podstekove](bins-and-memory-allocations.md#subheaps)), postoji mogućnost da će proces sa puno niti (kao što je veb server) **završiti deljenjem steka sa drugim nitima**. U tom slučaju, glavno rešenje je korišćenje **brava**, koje mogu **znatno usporiti niti**.
Iako niti pokušavaju da imaju svoj sopstveni stek (videti [Arenas](bins-and-memory-allocations.md#arenas) i [Subheaps](bins-and-memory-allocations.md#subheaps)), postoji mogućnost da će proces sa puno niti (kao što je veb server) **završiti deljenjem steka sa drugim nitima**. U ovom slučaju, glavno rešenje je korišćenje **brava**, koje mogu **znatno usporiti niti**.
Stoga, tcache je sličan brzoj alokaciji po niti na način da je to **jednostruko povezana lista** koja ne spaja blokove. Svaka nit ima **64 jednostruko povezane tcache alokacije**. Svaka alokacija može imati maksimalno [7 blokova iste veličine](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323) u rasponu od [24 do 1032B na 64-bitnim sistemima i 12 do 516B na 32-bitnim sistemima](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315).
Stoga, tcache je sličan brzoj alokaciji po niti na način da je to **jednostruko povezana lista** koja ne spaja delove. Svaka nit ima **64 jednostruko povezane tcache alokacije**. Svaka alokacija može imati maksimalno [7 delova iste veličine](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323) u rasponu od [24 do 1032B na 64-bitnim sistemima i 12 do 516B na 32-bitnim sistemima](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315).
Kada nit oslobodi blok, ako nije prevelik da bi bio alokovan u tcache i odgovarajuća tcache alokacija **nije puna** (već 7 blokova), **biće alokovan tamo**. Ako ne može ići u tcache, moraće da sačeka da se stek otključa kako bi mogao da izvrši globalnu operaciju oslobađanja.
Kada nit oslobodi deo memorije, ako nije prevelik da bi bio alociran u tcache i odgovarajuća tcache alokacija **nije puna** (već 7 delova), **biće alociran tamo**. Ako ne može ići u tcache, moraće da sačeka da se stek otključa kako bi mogao da izvrši globalnu operaciju oslobađanja.
Kada se **blok alokira**, ako postoji slobodan blok potrebne veličine u **Tcache-u, koristiće ga**, ako ne, moraće da sačeka da se stek otključa kako bi pronašao jedan u globalnim alokacijama ili kreirao novi.\
Postoji i optimizacija, u ovom slučaju, dok ima otključan stek, nit **će popuniti svoj Tcache sa stek blokovima (7) tražene veličine**, tako da ako mu je potrebno više, moći će da ih pronađe u Tcache-u.
Kada se **deo memorije alocira**, ako postoji slobodan deo potrebne veličine u **tcache-u, biće korišćen**, ako ne, moraće da sačeka da se stek otključa kako bi pronašao jedan u globalnim alokacijama ili kreirao novi.\
Postoji i optimizacija, u ovom slučaju, dok ima otključan stek, nit **će popuniti svoj tcache sa delovima steka (7) tražene veličine**, tako da ako mu je potrebno više, moći će da ih pronađe u tcache-u.
<details>
<summary>Dodaj primer tcache bloka</summary>
<summary>Dodaj primer tcache dela</summary>
```c
#include <stdlib.h>
#include <stdio.h>
@ -48,7 +48,7 @@ free(chunk);
return 0;
}
```
Kompajlirajte ga i debagujte sa prekidnom tačkom na ret opcode-u iz glavne funkcije. Zatim, pomoću gef-a možete videti tcache bin u upotrebi:
Kompajlirajte ga i debagujte sa prekidnom tačkom u ret opcode-u iz glavne funkcije. Zatim, pomoću gef-a možete videti tcache bin u upotrebi:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -56,7 +56,9 @@ Tcachebins[idx=0, size=0x20, count=1] ← Chunk(addr=0xaaaaaaac12a0, size=0x20,
```
#### Tcache Strukture i Funkcije
U sledećem kodu je moguće videti **maksimalne binove** i **delove po indeksu**, **`tcache_entry`** strukturu kreiranu kako bi se izbegle duple oslobađanja i **`tcache_perthread_struct`**, strukturu koju svaka nit koristi za čuvanje adresa za svaki indeks bin-a.
U sledećem kodu je moguće videti **max bins** i **chunks per index**, **`tcache_entry`** strukturu kreiranu kako bi se izbeglo duplo oslobađanje i **`tcache_perthread_struct`**, strukturu koju svaka nit koristi da sačuva adrese za svaki indeks bin-a.
</details>
```c
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c
@ -149,21 +151,25 @@ memset (tcache, 0, sizeof (tcache_perthread_struct));
```
</details>
### Brze kante
#### Tcache Indeksi
Brze kante su dizajnirane da **ubrzaju dodelu memorije za male delove** tako što čuvaju nedavno oslobođene delove u strukturi sa brzim pristupom. Ove kante koriste pristup poslednji unutra, prvi napolje (LIFO), što znači da je **najskorije oslobođeni deo prvi** koji će biti ponovo korišćen kada postoji nova zahtev za alokacijom. Ovo ponašanje je korisno za brzinu, jer je brže ubaciti i ukloniti sa vrha steka (LIFO) u poređenju sa redom (FIFO).
Tcache ima nekoliko korpi u zavisnosti od veličine, a početni pokazivači na **prvi blok svakog indeksa i količina blokova po indeksu se nalaze unutar bloka**. To znači da je moguće pronaći sve početne tačke tcache-a i količinu Tcache blokova lociranjem bloka sa ovim informacijama (obično prvi).
Dodatno, **brze kante koriste jednostruko povezane liste**, a ne dvostruko povezane, što dodatno poboljšava brzinu. Budući da se delovi u brzim kantama ne spajaju sa susedima, nema potrebe za složenom strukturom koja omogućava uklanjanje iz sredine. Jednostruko povezana lista je jednostavnija i brža za ove operacije.
### Brze korpe
U osnovi, ono što se dešava ovde je da zaglavlje (pokazivač na prvi deo koji treba proveriti) uvek pokazuje na poslednji oslobođeni deo te veličine. Dakle:
Brze korpe su dizajnirane da **ubrzaju dodelu memorije za male blokove** čuvanjem nedavno oslobođenih blokova u strukturi sa brzim pristupom. Ove korpe koriste pristup poslednji unutra, prvi napolje (LIFO), što znači da je **najskorije oslobođeni blok prvi** koji će biti ponovo korišćen kada postoji zahtev za novom alokacijom. Ovo ponašanje je korisno za brzinu, jer je brže ubaciti i ukloniti sa vrha steka (LIFO) u poređenju sa redom (FIFO).
* Kada se alocira novi deo te veličine, zaglavlje pokazuje na slobodan deo za korišćenje. Pošto ovaj slobodan deo pokazuje na sledeći deo za korišćenje, ova adresa se čuva u zaglavlju tako da sledeća alokacija zna gde da dobije dostupan deo.
* Kada se deo oslobodi, slobodan deo će sačuvati adresu trenutno dostupnog dela i adresa ovog novootvorenog dela će biti stavljena u zaglavlje.
Dodatno, **brze korpe koriste jednostruko povezane liste**, a ne dvostruko povezane, što dodatno poboljšava brzinu. Budući da se blokovi u brzim korpicama ne spajaju sa susedima, nema potrebe za složenom strukturom koja omogućava uklanjanje iz sredine. Jednostruko povezana lista je jednostavnija i brža za ove operacije.
Maksimalna veličina povezane liste je `0x80` i organizovane su tako da deo veličine `0x20-0x2f` bude u indeksu `0`, deo veličine `0x30-0x3f` bi bio u indeksu `1`...
U osnovi, ono što se dešava ovde je da je zaglavlje (pokazivač na prvi blok za proveru) uvek usmereno ka poslednjem oslobođenom bloku te veličine. Dakle:
* Kada se alocira novi blok te veličine, zaglavlje pokazuje na slobodan blok za korišćenje. Pošto ovaj slobodan blok pokazuje na sledeći koji treba koristiti, ova adresa se čuva u zaglavlju kako bi sledeća alokacija znala gde da dobije dostupan blok.
* Kada se blok oslobodi, slobodan blok će sačuvati adresu trenutno dostupnog bloka, a adresa ovog novo oslobođenog bloka će biti stavljena u zaglavlje.
Maksimalna veličina povezane liste je `0x80` i organizovane su tako da će blok veličine `0x20-0x2f` biti u indeksu `0`, blok veličine `0x30-0x3f` bi bio u `idx` `1`...
{% hint style="danger" %}
Delovi u brzim kantama nisu označeni kao dostupni tako da se čuvaju kao delovi brzih kanti neko vreme umesto da mogu da se spoje sa drugim slobodnim delovima koji ih okružuju.
Blokovi u brzim korpicama nisu označeni kao dostupni, tako da se čuvaju kao blokovi brzih korpi neko vreme umesto da mogu da se spoje sa drugim slobodnim blokovima oko njih.
{% endhint %}
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
@ -230,7 +236,7 @@ return 0;
```
Zabeležite kako alociramo i oslobađamo 8 blokova iste veličine tako da popunjavaju tcache, a osmi je smešten u brzom bloku.
Kompajlirajte ga i debagujte sa prekidnom tačkom u ret opcode-u glavne funkcije. Zatim, pomoću gef-a možete videti popunjavanje tcache bin-a i jedan blok u brzom binu:
Kompajlirajte ga i debagujte sa prekidnom tačkom u ret opcode-u glavne funkcije. Zatim, pomoću gef-a možete videti popunjen tcache bin i jedan blok u brzom binu:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -241,21 +247,21 @@ Fastbins[idx=1, size=0x30] 0x00
```
### Neuređena kanta
Neuređena kanta je **keš** koji koristi menadžer hipa kako bi ubrzao dodelu memorije. Evo kako funkcioniše: Kada program oslobodi deo, i ako taj deo ne može biti dodeljen u tcache ili brzoj kanti i ne sudara se sa vršnim delom, menadžer hipa ga ne stavlja odmah u određenu malu ili veliku kantu. Umesto toga, prvo pokušava da ga **spoji sa bilo kojim susednim slobodnim delovima** kako bi stvorio veći blok slobodne memorije. Zatim, smešta ovaj novi deo u opštu kantu nazvanu "neuređena kanta".
Neuređena kanta je **keš** koji koristi menadžer hipa kako bi ubrzao dodelu memorije. Evo kako funkcioniše: Kada program oslobodi komad, i ako taj komad ne može biti dodeljen u tcache ili brzoj kanti i ne sudara se sa vršnim komadom, menadžer hipa ga ne stavlja odmah u određenu malu ili veliku kantu. Umesto toga, prvo pokušava da ga **spoji sa bilo kojim susednim slobodnim komadima** kako bi stvorio veći blok slobodne memorije. Zatim, smešta ovaj novi komad u opštu kantu nazvanu "neuređena kanta".
Kada program **zatraži memoriju**, menadžer hipa **proverava neuređenu kantu** da vidi da li postoji deo dovoljne veličine. Ako pronađe jedan, odmah ga koristi. Ako ne pronađe odgovarajući deo u neuređenoj kanti, premesti sve delove sa ove liste u njihove odgovarajuće kante, bilo male ili velike, na osnovu njihove veličine.
Kada program **zatraži memoriju**, menadžer hipa **proverava neuređenu kantu** da vidi da li postoji dovoljno veliki komad. Ako pronađe jedan, odmah ga koristi. Ako ne pronađe odgovarajući komad u neuređenoj kanti, premestiće sve komade sa ove liste u njihove odgovarajuće kante, bilo male ili velike, na osnovu njihove veličine.
Imajte na umu da ako se veći deo podeli na 2 polovine i ako je preostali deo veći od MINSIZE, biće vraćen nazad u neuređenu kantu.&#x20;
Imajte na umu da ako se veći komad podeli na 2 polovine i ako je preostali deo veći od MINSIZE, biće vraćen nazad u neuređenu kantu.
Dakle, neuređena kanta je način ubrzanja dodele memorije tako što brzo ponovno koristi nedavno oslobođenu memoriju i smanjuje potrebu za dugotrajnim pretragama i spajanjima.
Dakle, neuređena kanta je način da se ubrza dodela memorije tako što se brzo ponovno koristi nedavno oslobođena memorija i smanjuje potreba za dugotrajnim pretragama i spajanjima.
{% hint style="danger" %}
Imajte na umu da čak i ako su delovi različitih kategorija, ako dostupan deo sudara sa drugim dostupnim delom (čak i ako su originalno pripadali različitim kantama), biće spojeni.
Imajte na umu da čak i ako su komadi različitih kategorija, ako dostupan komad sudara sa drugim dostupnim komadom (čak i ako su originalno pripadali različitim kantama), biće spojeni.
{% endhint %}
<details>
<summary>Dodajte primer neuređenog dela</summary>
<summary>Dodajte primer neuređenog komada</summary>
```c
#include <stdlib.h>
#include <stdio.h>
@ -283,7 +289,7 @@ free(chunks[i]);
return 0;
}
```
Primetite kako alociramo i oslobađamo 9 blokova iste veličine tako da **popunjavaju tcache**, a osmi je smešten u unsorted bin jer je **prevelik za fastbin**, dok deveti nije oslobođen tako da deveti i osmi **ne budu spojeni sa vršnim blokom**.
Primetite kako alociramo i oslobađamo 9 blokova iste veličine tako da **popunjavaju tcache**, a osmi je smešten u unsorted bin jer je **prevelik za fastbin**, dok deveti nije oslobođen pa deveti i osmi **neće biti spojeni sa vršnim blokom**.
Kompajlirajte i debagujte sa prekidnom tačkom u ret opcode-u iz glavne funkcije. Zatim pomoću gef-a možete videti popunjen tcache bin i jedan blok u unsorted binu:
```bash
@ -309,7 +315,7 @@ Fastbins[idx=6, size=0x80] 0x00
Mali binovi su brži od velikih binova, ali sporiji od brzih binova.
Svaki bin od 62 će imati **delove iste veličine**: 16, 24, ... (sa maksimalnom veličinom od 504 bajta u 32 bitnom i 1024 u 64 bitnom režimu). Ovo pomaže u brzini pronalaženja binova gde treba alocirati prostor i ubacivanju i uklanjanju unosa sa ovih lista.
Svaki bin od 62 će imati **blokove iste veličine**: 16, 24, ... (sa maksimalnom veličinom od 504 bajta u 32 bitnom i 1024 u 64 bitnom režimu). Ovo pomaže u brzini pronalaženja binova gde treba alocirati prostor i ubacivanju i uklanjanju unosa sa ovih lista.
Ovako se računa veličina malog bina prema indeksu bina:
@ -368,7 +374,7 @@ return 0;
```
Primetite kako alociramo i oslobađamo 9 blokova iste veličine tako da **popunjavaju tcache**, a osmi je smešten u unsorted bin jer je **prevelik za fastbin**, dok deveti nije oslobođen pa deveti i osmi **neće biti spojeni sa vršnim blokom**. Zatim alociramo veći blok od 0x110 što dovodi do toga da **blok u unsorted binu pređe u small bin**.
Kompajlirajte i debagujte sa prekidnom tačkom u ret opcode-u glavne funkcije. Zatim, pomoću gef-a, možete videti popunjen tcache bin i jedan blok u small binu:
Kompajlirajte i debagujte sa prekidnom tačkom na ret opcode iz glavne funkcije. Zatim, pomoću gef-a, možete videti popunjenost tcache binova i jedan blok u small binu:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -388,11 +394,13 @@ Fastbins[idx=6, size=0x80] 0x00
→ Chunk(addr=0xaaaaaaac1e20, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
[+] Found 1 chunks in 1 small non-empty bins.
```
</details>
### Velike kante
Za razliku od malih kanti, koje upravljaju komadićima fiksnih veličina, **svaka velika kanta obrađuje opseg veličina komadića**. Ovo je fleksibilnije, omogućavajući sistemu da se prilagodi **različitim veličinama** bez potrebe za posebnom kantom za svaku veličinu.
U alokatoru memorije, velike kante počinju tamo gde se završavaju male kante. Opsezi za velike kante postaju sve veći, što znači da prva kanta može pokrivati komadiće od 512 do 576 bajtova, dok sledeća pokriva od 576 do 640 bajtova. Ovaj obrazac se nastavlja, pri čemu najveća kanta sadrži sve komadiće iznad 1MB.
U alokatoru memorije, velike kante počinju tamo gde se završavaju male kante. Opsezi za velike kante postaju progresivno veći, što znači da prva kanta može pokrivati komadiće od 512 do 576 bajtova, dok sledeća pokriva od 576 do 640 bajtova. Ovaj obrazac se nastavlja, pri čemu najveća kanta sadrži sve komadiće veće od 1MB.
Velike kante sporije rade u poređenju sa malim kantama jer moraju **sortirati i pretraživati listu različitih veličina komadića kako bi pronašle najbolje odgovarajuće** za alokaciju. Kada se komadić ubaci u veliku kantu, mora biti sortiran, a prilikom alokacije memorije, sistem mora pronaći odgovarajući komadić. Ovaj dodatni rad ih čini **sporijim**, ali budući da su velike alokacije manje uobičajene od malih, to je prihvatljiva trgovina.
@ -466,7 +474,7 @@ return 0;
```
Dve velike alokacije se vrše, zatim jedna se oslobađa (stavlja se u unsorted bin) i vrši se veća alokacija (premeštanje oslobođene u nesortirani bin u veliki bin).
Kompajlirajte to i debagujte sa prekidnom tačkom u ret opcode-u glavne funkcije. Zatim, pomoću gef-a možete videti popunjenost tcache bina i jedan chunk u velikom binu:
Kompajlirajte to i debagujte sa prekidnom tačkom u ret opcode-u iz glavne funkcije. Zatim, pomoću gef-a možete videti popunjavanje tcache bina i jedan chunk u velikom binu:
```bash
gef➤ heap bin
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -490,7 +498,7 @@ Fastbins[idx=6, size=0x80] 0x00
```
</details>
### Vrhunski komad
### Vrhunski isečak
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
@ -515,9 +523,9 @@ the 2 preceding words to be zero during this interval as well.)
/* Conveniently, the unsorted bin can be used as dummy top on first call */
#define initial_top(M) (unsorted_chunks (M))
```
Osnovno, ovo je deo koji sadrži sav trenutno dostupan heap. Kada se izvrši malloc, ako nema dostupnog slobodnog chunk-a za korišćenje, ovaj top chunk će smanjiti svoju veličinu pružajući potreban prostor. Pokazivač na Top Chunk se čuva u strukturi `malloc_state`.
Osnovno, ovo je deo koji sadrži sav trenutno dostupan heap. Kada se izvrši malloc, ako nema dostupnog slobodnog chunk-a za korišćenje, ovaj top chunk će smanjiti svoju veličinu pružajući potreban prostor. Pokazivač na Top Chunk je smešten u strukturi `malloc_state`.
Štaviše, na početku, moguće je koristiti nesortirani chunk kao top chunk.
Osim toga, na početku je moguće koristiti nesortirani chunk kao top chunk.
<details>
@ -559,7 +567,7 @@ gef➤ x/8wx 0xaaaaaaac1ae0 - 16
### Poslednje podsećanje
Kada se koristi malloc i deo je podeljen (na primer, iz nevezane liste ili iz vršnog bloka), deo koji je kreiran od ostatka podeljenog dela naziva se Poslednje podsećanje i njegov pokazivač se čuva u strukturi `malloc_state`.
Kada se koristi malloc i deo je podeljen (iz nevezane liste ili na primer iz vršnog bloka), deo koji je kreiran od ostatka podeljenog dela naziva se Poslednje podsećanje i njegov pokazivač se čuva u strukturi `malloc_state`.
## Tok dodele
@ -579,7 +587,7 @@ Pogledajte:
## Provere bezbednosti funkcija hipa
Proverite provere bezbednosti koje se vrše od strane često korišćenih funkcija u hipu u:
Proverite provere bezbednosti koje vrše često korišćene funkcije u hipu u:
{% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %}
[heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md)

View file

@ -0,0 +1,47 @@
# Prepisivanje oslobođenog bloka
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>
Nekoliko predloženih tehnika eksploatacije hipa zahteva mogućnost prepisivanja pokazivača unutar oslobođenih blokova. Cilj ove stranice je da sumira potencijalne ranjivosti koje bi mogle omogućiti ovaj pristup:
### Jednostavno korišćenje nakon oslobođenja
Ako je napadaču moguće **upisati informacije u oslobođeni blok**, mogao bi to iskoristiti da prepisuje potrebne pokazivače.
### Dvostruko oslobođenje
Ako napadač može **`osloboditi` dva puta isti blok** (osloboditi druge blokove između potencijalno) i učiniti da bude **2 puta u istom binu**, bilo bi moguće za korisnika da **dodeli blok kasnije**, **prepise potrebne pokazivače** i zatim ga **ponovo dodeli** pokrećući akcije dodele bloka (npr. napad na brzi bin, napad na tcache...)
### Preplavljenje hipa
Moguće je **preplaviti dodeljeni blok koji ima oslobođeni blok pored** i izmeniti neke zaglavlja/pokazivače.
### Preplavljenje za 1
U ovom slučaju bilo bi moguće **izmeniti veličinu** sledećeg bloka u memoriji. Napadač bi mogao to iskoristiti da **napravi dodeljeni blok veće veličine**, zatim ga **`oslobodi`**, čineći da blok bude **dodat u bin drugačije** veličine (veće), zatim dodeli **lažnu veličinu**, i napad će imati pristup **bloku sa veličinom koja je veća** nego što zaista jeste, **omogućavajući stoga preplavljenje hipa** (proverite prethodni odeljak).
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>

View file

@ -6,9 +6,9 @@
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
@ -26,4 +26,35 @@ Prvo, napomenimo da je Tcache uveden u glibc verziji 2.26.
**Tcache** napad predložen na [**guyinatuxido stranici**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) veoma je sličan napadu na fast bin gde je cilj prepisati pokazivač na sledeći blok u binu unutar oslobođenog bloka na proizvoljnu adresu kako bi kasnije bilo moguće **dodeliti tu specifičnu adresu i potencijalno prepisati pokazivače**.
Međutim, danas, ako pokrenete pomenuti kod dobićete grešku: **`malloc(): unaligned tcache chunk detected`**. Dakle, potrebno je upisati kao adresu u novi pokazivač poravnanu adresu (ili dovoljno puta izvršiti binarni fajl kako bi upisana adresa bila zaista poravnata).
Međutim, danas, ako pokrenete pomenuti kod dobićete grešku: **`malloc(): unaligned tcache chunk detected`**. Dakle, potrebno je upisati kao adresu u novi pokazivač poravnanu adresu (ili dovoljno puta izvršiti binarni fajl kako bi upisana adresa zapravo bila poravnata).
### Napad na tcache indekse
Obično je moguće naći na početku hipa blok koji sadrži **broj blokova po indeksu** unutar tcache i adresu **glavnog bloka svakog indeksa tcache**. Ako iz nekog razloga bude moguće izmeniti ove informacije, bilo bi moguće **naterati glavni blok nekog indeksa da pokazuje ka željenoj adresi** (kao što je malloc hook) kako bi se zatim dodelio blok veličine indeksa i prepisali sadržaji malloc hook-a u ovom slučaju.
## Primeri
* CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html)
* **Libc info leak**: Moguće je popuniti tcache-ove, dodati blok u nesortiranu listu, isprazniti tcache i **ponovo dodeliti blok iz nesortirane liste** samo prepisujući prvih 8B, ostavljajući **drugu adresu libc-a iz bloka netaknutom tako da je možemo pročitati**.
* **Tcache napad**: Binarni fajl je ranjiv na 1B prelivanje hipa. Ovo će biti iskorišćeno da se promeni **veličina zaglavlja** dodeljenog bloka čineći ga većim. Zatim, ovaj blok će biti **oslobođen**, dodajući ga u tcache blokova lažne veličine. Zatim, dodelićemo blok sa lažiranom veličinom, a prethodni blok će biti **vraćen znajući da je ovaj blok zapravo bio manji** i to pruža mogućnost da se **prepise sledeći blok u memoriji**.\
Iskoristićemo ovo da **prepšemo pokazivač FD sledećeg bloka** da pokazuje na **`malloc_hook`**, tako da je moguće alocirati 2 pokazivača: prvo legitimni pokazivač koji smo upravo izmenili, a zatim će druga alokacija vratiti blok u **`malloc_hook`** koji je moguće iskoristiti za pisanje **one gadget-a**.
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
* **Libc info leak**: Postoji upotreba nakon oslobođenja i dvostruko oslobođenje. U ovom writeup-u autor je procurio adresu libc-a čitajući adresu bloka smeštenog u malom binu (kao što je procurio iz nesortiranog bina ali iz malog).
* **Tcache napad**: Tcache je izvršen putem **dvostrukog oslobođenja**. Isti blok je oslobođen dva puta, tako da će unutar Tcache-a blok pokazivati na sebe. Zatim, on se dodeljuje, njegov FD pokazivač se menja da pokazuje na **free hook** i zatim se ponovo dodeljuje tako da će sledeći blok na listi biti u free hook-u. Zatim, i ovaj je dodeljen i moguće je upisati adresu `system` ovde tako da kada se dodeli malloc koji sadrži `"/bin/sh"` dobijemo shell.
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html)
* **Napad na tcache indekse**: Moguće je alocirati i osloboditi blok određene veličine koji će kada se čuva u tcache informacijama generisati **poziciju sa vrednošću 0x100** (zbog toga što bajt koji označava koliko blokova u tom indeksu su smešteni). Zatim, zloupotrebom ove vrednosti moguće je `osloboditi` ovu adresu jer izgleda kao da je to blok veličine 0x100. Ovo će dodati tu adresu u indeks blokova veličine 0x100 u tcache-u.\
Zatim, alociranjem bloka veličine 0x100, moguće je prepisati početnu adresu bloka drugih tcache indeksa. Na primer, postavljanjem adrese malloc hook-a u jednom od njih i alociranjem bloka veličine tog indeksa omogućiće dobijanje bloka u calloc hook-u, što omogućava pisanje one gadget-a za dobijanje shell-a.
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>

View file

@ -1,4 +1,4 @@
# Napad na nesortiranu binu
# Napad na nesortiranu binarnu hrpu
<details>
@ -6,7 +6,7 @@
Drugi načini podrške HackTricks-u:
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
@ -16,45 +16,50 @@ Drugi načini podrške HackTricks-u:
## Osnovne informacije
Za više informacija o tome šta je nesortirana bina, pogledajte ovu stranicu:
Za više informacija o tome šta je nesortirana binarna hrpa pogledajte ovu stranicu:
{% content-ref url="bins-and-memory-allocations.md" %}
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
{% endcontent-ref %}
Nesortirane liste mogu upisati adresu u `unsorted_chunks (av)` u adresu `bk` bloka. Dakle, ako napadač može **izmeniti adresu pokazivača bk** u bloku unutar nesortirane bine, mogao bi **upisati tu adresu na proizvoljnu adresu** što bi moglo biti korisno za otkrivanje libc adresa ili zaobići neku odbranu.
Nesortirane liste mogu upisati adresu u `unsorted_chunks (av)` u adresu `bk` dela bloka. Dakle, ako napadač može **izmeniti adresu pokazivača bk** u bloku unutar nesortirane hrpe, mogao bi **upisati tu adresu na proizvoljnu adresu** što bi moglo biti korisno za otkrivanje libc adresa ili zaobići neku odbranu.
Dakle, u osnovi, ovaj napad omogućava da se **prepiše neka proizvoljna adresa velikim brojem** (adresa koja bi mogla biti adresa hipa ili libc adresa) poput neke adrese steka koja bi mogla biti otkrivena ili nekog ograničenja poput globalne promenljive **`global_max_fast`** kako bi se omogućilo kreiranje brzih bin bina većih veličina (i preći sa napada na nesortiranu binu na napad na brzu binu).
Dakle, u osnovi, ovaj napad omogućava da se **prepiše neka proizvoljna adresa velikim brojem** (adresa koja može biti adresa hrpe ili libc adresa) poput neke adrese steka koja može biti otkrivena ili nekog ograničenja poput globalne promenljive **`global_max_fast`** kako bi se omogućilo kreiranje brzih binova sa većim veličinama (i preći sa napada na nesortiranu binu na napad na brzi bin).
{% hint style="success" %}
Pogledajte primer koji je dat na [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle) i koristeći 0x4000 i 0x5000 umesto 0x400 i 0x500 kao veličine blokova (kako bi se izbegli tcache-ovi), moguće je videti da se **danas** pokreće greška **`malloc(): unsorted double linked list corrupted`**.
Pogledajte primer koji je dat na [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle) i koristeći 0x4000 i 0x5000 umesto 0x400 i 0x500 kao veličine blokova (kako bi se izbegli tcache-ovi) moguće je videti da se **danas** aktivira greška **`malloc(): unsorted double linked list corrupted`**.
Stoga, ovaj napad na nesortiranu binu sada (pored ostalih provera) takođe zahteva mogućnost popravljanja duplirane liste tako da se zaobiđe `victim->bck->fd == victim` ili ne `victim->fd == av (arena)`. Što znači da adresa na koju želimo da pišemo mora imati adresu lažnog bloka na svojoj poziciji `fd` i da lažni blok `fd` pokazuje na arenu.
{% endhint %}
{% hint style="danger" %}
Imajte na umu da ovaj napad korumpira nesortiranu binu (takođe male i velike). Zato sada možemo **koristiti alokacije iz brze bine** (neki složeniji program može vršiti druge alokacije i rušiti se), i da bismo pokrenuli ovo moramo **alocirati istu veličinu ili će program pasti**.
Imajte na umu da ovaj napad korumpira nesortiranu binu (takođe male i velike). Tako da sada možemo **koristiti alokacije iz brzih binova** (neki složeniji program može vršiti druge alokacije i rušiti se), i da bismo aktivirali ovo moramo **alocirati istu veličinu ili će program pasti**.
Imajte na umu da bi pravljenje **`global_max_fast`** moglo pomoći u ovom slučaju verujući da će brza bina biti sposobna da se brine o svim ostalim alokacijama dok se eksploatacija ne završi.
Imajte na umu da bi pravljenje **`global_max_fast`** moglo pomoći u ovom slučaju verujući da će brzi bin biti u mogućnosti da se brine o svim ostalim alokacijama dok se eksploatacija ne završi.
{% endhint %}
Kod sa [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) objašnjava to veoma dobro, iako ako modifikujete alokacije da alociraju memoriju dovoljno veliku da ne završe u tcache-u, možete videti da se pomenuta greška pojavljuje sprečavajući ovu tehniku: **`malloc(): unsorted double linked list corrupted`**
## Napad na nesortiranu binu za curenje informacija
Ovo je zapravo veoma osnovan koncept. Blokovi u nesortiranoj bini će imati pokazivače dvostruke pokazivače za kreiranje bine. Prvi blok u nesortiranoj bini će zapravo imati **FD** i **BK** linkove **koji pokazuju na deo glavne arene (libc)**.\
Stoga, ako možete **ubaciti blok unutar nesortirane bine i pročitati ga** (korišćenje nakon oslobađanja) ili **ponovo ga alocirati bez prepisivanja bar 1 od pokazivača** da biste ga zatim **pročitali**, možete imati **curenje libc informacija**.
## Reference i drugi primeri
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap)
* Cilj je prepisati globalnu promenljivu sa vrednošću većom od 4869 kako bi bilo moguće dobiti zastavu, a PIE nije omogućen.
* Moguće je generisati blokove proizvoljnih veličina i postoji prelivanje hipa sa željenom veličinom.
* Napad počinje kreiranjem 3 bloka: blok0 za zloupotrebu preliva, blok1 za prelivanje i blok2 kako vrhunski blok ne bi konsolidovao prethodne.
* Cilj je prepisati globalnu promenljivu sa vrednošću većom od 4869 kako bi se mogla dobiti zastava, a PIE nije omogućen.
* Moguće je generisati blokove proizvoljnih veličina i postoji prelivanje hrpe sa željenom veličinom.
* Napad počinje kreiranjem 3 bloka: blok0 za zloupotrebu preliva, blok1 za prelivanje i blok2 kako vrh bloka ne bi konsolidovao prethodne.
* Zatim, blok1 se oslobađa i blok0 se preliva tako da pokazivač bk bloka1 pokazuje na: `bk = magic - 0x10`
* Zatim, blok3 se alocira iste veličine kao blok1, što će pokrenuti napad na nesortiranu binu i izmeniti vrednost globalne promenljive, omogućavajući dobijanje zastave.
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html)
* Funkcija spajanja je ranjiva jer ako su oba prosleđena indeksa isti, ponovo će alocirati na njemu, a zatim ga osloboditi, ali će vratiti pokazivač na tu oslobođenu regiju koja može biti korišćena.
* Stoga, **kreiraju se 2 bloka**: **blok0** koji će biti spojen sa samim sobom i blok1 kako se ne bi konsolidovao sa vrhunskim blokom. Zatim se **poziva funkcija spajanja sa blokom0** dva puta što će izazvati upotrebu nakon oslobođenja.
* Zatim se **poziva funkcija `view` sa indeksom 2** (koji je indeks bloka nakon oslobođenja) što će **procureti libc adresu**.
* Pošto binarni fajl ima zaštitu da alocira samo veličine veće od **`global_max_fast`** tako da se ne koristi fastbin, napad na nesortiranu binu će biti korišćen za prepisivanje globalne promenljive `global_max_fast`.
* Zatim je moguće pozvati funkciju edit sa indeksom 2 (pokazivač nakon oslobođenja) i prepisati pokazivač `bk` da pokazuje na `p64(global_max_fast-0x10)`. Zatim, kreiranje novog bloka će koristiti prethodno kompromitovanu adresu oslobođenja (0x20) će **pokrenuti napad na nesortiranu binu** prepisivanjem `global_max_fast` sa veoma velikom vrednošću, omogućavajući sada kreiranje blokova u brzim binama.
* Sada se vrši **napad na brzu binu**:
* Funkcija spajanja je ranjiva jer ako su oba prosleđena indeksa isti, ponovo će alocirati na njemu, a zatim ga osloboditi ali će vratiti pokazivač na tu oslobođenu regiju koja može biti korišćena.
* Stoga, **kreiraju se 2 bloka**: **blok0** koji će biti spojen sa samim sobom i blok1 kako se ne bi konsolidovao sa vrhom bloka. Zatim se **funkcija spajanja poziva sa blokom0** dva puta što će izazvati korišćenje nakon oslobađanja.
* Zatim se **`view`** funkcija poziva sa indeksom 2 (koji je indeks bloka korišćenja nakon oslobađanja), što će **procureti libc adresu**.
* Pošto binarni fajl ima zaštitu da alocira samo veličine veće od **`global_max_fast`** tako da nema korišćenja fastbin-a, napad na nesortiranu binu će biti korišćen za prepisivanje globalne promenljive `global_max_fast`.
* Zatim je moguće pozvati funkciju edit sa indeksom 2 (pokazivač korišćenja nakon oslobađanja) i prepisati pokazivač `bk` da pokazuje na `p64(global_max_fast-0x10)`. Zatim, kreiranje novog bloka će koristiti prethodno kompromitovanu adresu oslobođenog bloka (0x20) će **pokrenuti napad na nesortiranu binu** prepisivanjem `global_max_fast` sa veoma velikom vrednošću, omogućavajući sada kreiranje blokova u brzim binovima.
* Sada se vrši **napad na brze binove**:
* Prvo je otkriveno da je moguće raditi sa brzim **blokovima veličine 200** na lokaciji **`__free_hook`**:
* <pre class="language-c"><code class="lang-c">gef➤ p &#x26;__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 &#x3C;__free_hook>
@ -64,8 +69,22 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6076f &#x3C;list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f &#x3C;_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
</code></pre>
* Ako uspemo da dobijemo brzi blok veličine 0x200 na ovoj lokaciji, biće moguće prepisati pokazivač funkcije koji će biti izvršen
* Za to, kreiran je novi blok veličine `0xfc` i pozvana je funkcija spajanja sa tim pokazivačem dva puta, na ovaj način dobijamo pokazivač na oslobođeni blok veličine `0xfc*2 = 0x1f8` u brzoj bini.
* Zatim se poziva funkcija edit na ovom bloku da modifikuje **`fd`** adresu ove brze bine da pokazuje na prethodnu **`__free_hook`** funkciju.
* Zatim se kreira blok veličine `0x1f8` kako bi se preuzela prethodno beskorisna traka iz brze trake, pa se zatim kreira još jedan blok veličine `0x1f8` kako bi se dobio blok iz brze trake u **`__free_hook`** koji je prepisan adresom funkcije **`system`**.
* Na kraju se oslobađa blok koji sadrži string `/bin/sh\x00` pozivajući funkciju brisanja, pokrećući funkciju **`__free_hook`** koja pokazuje na sistem sa `/bin/sh\x00` kao parametrom.
* Ako uspemo da dobijemo brzi blok veličine 0x200 na ovoj lokaciji, biće moguće prebrisati pokazivač funkcije koji će biti izvršen
* Za ovo, kreira se novi blok veličine `0xfc` i poziva se spojena funkcija sa tim pokazivačem dva puta, na taj način dobijamo pokazivač na oslobođeni blok veličine `0xfc*2 = 0x1f8` u brzom binu.
* Zatim se poziva funkcija za uređivanje u ovom bloku kako bi se izmenila adresa **`fd`** ovog brzog bina da pokazuje na prethodnu funkciju **`__free_hook`**.
* Zatim se kreira blok veličine `0x1f8` kako bi se iz brzog bina povukao prethodni beskorisni blok, tako da se kreira još jedan blok veličine `0x1f8` kako bi se dobio brzi blok u **`__free_hook`** koji je prebrisan adresom funkcije **`system`**.
* Na kraju se oslobođava blok koji sadrži string `/bin/sh\x00` pozivom funkcije za brisanje, pokrećući funkciju **`__free_hook`** koja pokazuje na sistem sa `/bin/sh\x00` kao parametrom.
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>