From 211cb8bc1d5cf98d6f9ad9f9375de7171697731f Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 20 Aug 2025 09:38:09 +0000 Subject: [PATCH] Translated ['src/binary-exploitation/libc-heap/use-after-free/first-fit. --- .../libc-heap/use-after-free/first-fit.md | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/binary-exploitation/libc-heap/use-after-free/first-fit.md b/src/binary-exploitation/libc-heap/use-after-free/first-fit.md index e8e8281ac..c1cad98ce 100644 --- a/src/binary-exploitation/libc-heap/use-after-free/first-fit.md +++ b/src/binary-exploitation/libc-heap/use-after-free/first-fit.md @@ -15,7 +15,7 @@ Primer: - Alocirate 300 bajtova (`a`), zatim 250 bajtova (`b`), zatim oslobodite `a` i ponovo zatražite 250 bajtova (`c`). - Kada oslobodite `a`, on ide u neusortirani 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 ispunjen sadržajem `a`. +- `c` će pokazivati na prethodni `a` i biće ispunjen sadržajem `a`. ```c char *a = malloc(300); char *b = malloc(250); @@ -42,12 +42,12 @@ c = malloc(20); // b d = malloc(20); // a ``` --- -### 🔥 Savremena razmatranja glibc (tcache ≥ 2.26) +### 🔥 Savremena glibc razmatranja (tcache ≥ 2.26) -Od glibc 2.26 svaki nit čuva svoj vlastiti **tcache** koji se pretražuje *pre* nesortirane kante. Stoga će se scenarij prvog pogodka **dostići samo ako**: +Od glibc 2.26 svaki nit čuva svoj vlastiti **tcache** koji se pretražuje *pre* nesortiranog bin-a. Stoga će se scenarij prvog pogodka **dostići samo ako**: 1. Tražena veličina je **veća od `tcache_max`** (0x420 na 64-bitnom sistemu po defaultu), *ili* -2. Odgovarajuća tcache kanta je **već puna ili ručno ispražnjena** (alokacijom 7 elemenata i njihovim zadržavanjem u upotrebi). +2. Odgovarajući tcache bin je **već pun ili ručno ispraznjen** (alokacijom 7 elemenata i njihovim zadržavanjem u upotrebi). U pravim eksploatacijama obično ćete dodati pomoćnu rutinu kao što je: ```c @@ -55,12 +55,12 @@ U pravim eksploatacijama obično ćete dodati pomoćnu rutinu kao što je: for(int i = 0; i < 7; i++) pool[i] = malloc(0x100); for(int i = 0; i < 7; i++) free(pool[i]); ``` -Once the tcache is exhausted, subsequent frees go to the unsorted bin and classic first-fit behaviour (tail search, head insertion) can be triggered again. +Jednom kada je tcache iscrpljen, naredni oslobađanja idu u nesortiranu kantu i klasično ponašanje prvog odgovora (pretraga od repa, umetanje na glavu) može ponovo biti aktivirano. --- -### 🚩 Kreiranje UAF-a sa preklapajućim delovima koristeći first-fit +### 🚩 Kreiranje UAF-a sa preklapajućim delovima koristeći prvi odgovor -Fragment ispod (testiran na glibc 2.38) pokazuje kako se splitter u nesortiranom binu može iskoristiti za kreiranje 2 **preklapajuća pokazivača** – moćne primitivne operacije koja pretvara jedno oslobađanje u pisanje nakon oslobađanja. +Fragment ispod (testiran na glibc 2.38) pokazuje kako se razdavač u nesortiranoj kanti može zloupotrebiti da se kreiraju 2 **preklapajuće pokazivače** – moćna primitiva koja pretvara jedno oslobađanje u pisanje nakon oslobađanja. ```c #include #include @@ -96,34 +96,32 @@ Exploitation recipe (common in recent CTFs): 2. **Oslobodite** deo tako da završi u nesortiranoj kanti. 3. **Alocirajte** malo manju veličinu – alokator deli nesortirani deo. 4. **Alocirajte** ponovo – preostali deo se preklapa sa postojećim korišćenim delom → UAF. -5. Prepišite osetljive polja (pokazivače funkcija, FILE vtable, itd.) +5. Prepišite osetljive polja (pokazivače na funkcije, FILE vtable, itd.) -Praktična primena može se naći u 2024 HITCON Quals *Setjmp* izazovu gde se ova tačno primitivna tehnika koristi za prebacivanje sa UAF na potpunu kontrolu nad `__free_hook`.{{#ref}} -../../../../references/2024_setjmp_firstfit.md -{{#endref}} +Praktična primena može se naći u 2024 HITCON Quals *Setjmp* izazovu gde se ova tačno primitivna tehnika koristi za prebacivanje sa UAF na potpunu kontrolu nad `__free_hook`. --- -### 🛡️ Mogućnosti zaštite i učvršćivanja +### 🛡️ Mite i Ojačavanje -* **Sigurno povezivanje (glibc ≥ 2.32)** štiti samo jednostruko povezane *tcache*/**fastbin** liste. Nesortirane/male/velike kante i dalje čuvaju sirove pokazivače, tako da preklapanja zasnovana na prvom odgovoru ostaju moguća ako možete dobiti curenje iz heap-a. -* **Enkripcija pokazivača na heap i MTE** (ARM64) još uvek ne utiču na x86-64 glibc, ali oznake za učvršćivanje distribucije kao što su `GLIBC_TUNABLES=glibc.malloc.check=3` će prekinuti rad na nekonzistentnim metapodacima i mogu prekinuti naivne PoC-ove. +* **Sigurno povezivanje (glibc ≥ 2.32)** štiti samo jednostruko povezane *tcache*/**fastbin** liste. Nesortirane/male/velike kante i dalje čuvaju sirove pokazivače, tako da preklapanja zasnovana na prvom odgovarajućem ostaju moguća ako možete dobiti heap leak. +* **Enkripcija pokazivača na heap i MTE** (ARM64) još uvek ne utiču na x86-64 glibc, ali oznake za ojačavanje distribucije kao što su `GLIBC_TUNABLES=glibc.malloc.check=3` će prekinuti rad na nekonzistentnim metapodacima i mogu prekinuti naivne PoC-ove. * **Popunjavanje tcache prilikom oslobađanja** (predloženo 2024. za glibc 2.41) dodatno bi smanjilo korišćenje nesortiranih; pratite buduće verzije prilikom razvijanja generičkih eksploata. --- -## Ostale reference i primeri +## Ostale Reference i Primeri - [**https://heap-exploitation.dhavalkapil.com/attacks/first_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first_fit) - [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/) -- ARM64. Upotreba nakon oslobađanja: Generišite korisnički objekat, oslobodite ga, generišite objekat koji dobija oslobođeni deo i omogućite pisanje u njega, **prepisujući poziciju user->password** iz prethodnog. Ponovo upotrebite korisnika da **obiđete proveru lozinke** +- ARM64. Use after free: Generišite korisnički objekat, oslobodite ga, generišite objekat koji dobija oslobođeni deo i omogućite pisanje u njega, **prepisujući poziciju user->password** iz prethodnog. Ponovo upotrebite korisnika da **obiđete proveru lozinke** - [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example) - Program omogućava kreiranje beleški. Beleška će imati informacije o belešci u malloc(8) (sa pokazivačem na funkciju koja bi mogla biti pozvana) i pokazivač na drugi malloc() sa sadržajem beleške. -- Napad bi bio da se kreiraju 2 beleške (note0 i note1) sa većim malloc sadržajem od veličine informacija o belešci i zatim ih osloboditi kako bi ušle u brzu kantu (ili tcache). -- Zatim, kreirajte još jednu belešku (note2) sa veličinom sadržaja 8. Sadržaj će biti u note1 jer će se deo ponovo koristiti, gde bismo mogli da modifikujemo pokazivač funkcije da upućuje na win funkciju i zatim Upotreba-Nakon-Oslobađanja note1 da pozove novi pokazivač funkcije. +- Napad bi bio da se kreiraju 2 beleške (note0 i note1) sa većim malloc sadržajem od veličine informacija o belešci i zatim ih osloboditi kako bi završile u fast bin (ili tcache). +- Zatim, kreirajte još jednu belešku (note2) sa veličinom sadržaja 8. Sadržaj će biti u note1 jer će se deo ponovo koristiti, gde bismo mogli modifikovati pokazivač na funkciju da pokazuje na win funkciju i zatim Use-After-Free note1 da pozove novi pokazivač na funkciju. - [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html) - Moguće je alocirati neku memoriju, napisati željenu vrednost, osloboditi je, ponovo alocirati i pošto su prethodni podaci još uvek tu, biće tretirani prema novoj očekivanoj strukturi u delu, što omogućava postavljanje vrednosti za dobijanje zastavice. - [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html) - U ovom slučaju potrebno je napisati 4 unutar specifičnog dela koji je prvi koji se alocira (čak i nakon prisilnog oslobađanja svih njih). Na svakom novom alociranom delu njegovo broj u indeksu niza se čuva. Zatim, alocirajte 4 dela (+ inicijalno alocirani), poslednji će imati 4 unutar njega, oslobodite ih i prisilite ponovnu alokaciju prvog, koji će koristiti poslednji oslobođeni deo koji je onaj sa 4 unutar njega. -- 2024 HITCON Quals Setjmp izveštaj (Quarkslab) – praktičan napad preklapanja prvog odgovora / nesortiranog dela: -- Angstrom CTF 2024 *heapify* izveštaj – zloupotreba deljenja nesortirane kante za curenje libc i dobijanje preklapanja: +- 2024 HITCON Quals Setjmp write-up (Quarkslab) – praktičan first-fit / nesortirano-preklapanje napad: +- Angstrom CTF 2024 *heapify* write-up – zloupotreba nesortiranog deljenja za curenje libc i dobijanje preklapanja: {{#include ../../../banners/hacktricks-training.md}}