mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/binary-exploitation/libc-heap/use-after-free/first-fit.
This commit is contained in:
parent
0cce6abc96
commit
211cb8bc1d
@ -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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -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(<size>) 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: <https://ctftime.org/writeup/39355>
|
||||
- Angstrom CTF 2024 *heapify* izveštaj – zloupotreba deljenja nesortirane kante za curenje libc i dobijanje preklapanja: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
- 2024 HITCON Quals Setjmp write-up (Quarkslab) – praktičan first-fit / nesortirano-preklapanje napad: <https://ctftime.org/writeup/39355>
|
||||
- Angstrom CTF 2024 *heapify* write-up – zloupotreba nesortiranog deljenja za curenje libc i dobijanje preklapanja: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user