mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 22:52:06 +00:00
139 lines
5.9 KiB
Markdown
139 lines
5.9 KiB
Markdown
|
# Doppia Liberazione
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary><strong>Impara l'hacking su AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Esperto Red Team AWS di HackTricks)</strong></a><strong>!</strong></summary>
|
||
|
|
||
|
Altri modi per supportare HackTricks:
|
||
|
|
||
|
* Se desideri vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||
|
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
|
||
|
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
|
||
|
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
|
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
|
||
|
|
||
|
</details>
|
||
|
|
||
|
## Informazioni di Base
|
||
|
|
||
|
Se liberi un blocco di memoria più di una volta, può compromettere i dati dell'allocatore e aprire la porta agli attacchi. Ecco come avviene: quando liberi un blocco di memoria, ritorna in una lista di chunk liberi (ad esempio il "fastbin"). Se liberi lo stesso blocco due volte di seguito, l'allocatore rileva questo e genera un errore. Ma se **liberi un altro chunk nel mezzo, il controllo di doppia liberazione viene eluso**, causando corruzione.
|
||
|
|
||
|
Ora, quando richiedi nuova memoria (usando `malloc`), l'allocatore potrebbe darti un **blocco che è stato liberato due volte**. Ciò può portare a due puntatori diversi che puntano alla stessa posizione di memoria. Se un attaccante controlla uno di quei puntatori, può modificare il contenuto di quella memoria, il che può causare problemi di sicurezza o addirittura consentire l'esecuzione di codice.
|
||
|
|
||
|
Esempio:
|
||
|
```c
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
int main() {
|
||
|
// Allocate memory for three chunks
|
||
|
char *a = (char *)malloc(10);
|
||
|
char *b = (char *)malloc(10);
|
||
|
char *c = (char *)malloc(10);
|
||
|
char *d = (char *)malloc(10);
|
||
|
char *e = (char *)malloc(10);
|
||
|
char *f = (char *)malloc(10);
|
||
|
char *g = (char *)malloc(10);
|
||
|
char *h = (char *)malloc(10);
|
||
|
char *i = (char *)malloc(10);
|
||
|
|
||
|
// Print initial memory addresses
|
||
|
printf("Initial allocations:\n");
|
||
|
printf("a: %p\n", (void *)a);
|
||
|
printf("b: %p\n", (void *)b);
|
||
|
printf("c: %p\n", (void *)c);
|
||
|
printf("d: %p\n", (void *)d);
|
||
|
printf("e: %p\n", (void *)e);
|
||
|
printf("f: %p\n", (void *)f);
|
||
|
printf("g: %p\n", (void *)g);
|
||
|
printf("h: %p\n", (void *)h);
|
||
|
printf("i: %p\n", (void *)i);
|
||
|
|
||
|
// Fill tcache
|
||
|
free(a);
|
||
|
free(b);
|
||
|
free(c);
|
||
|
free(d);
|
||
|
free(e);
|
||
|
free(f);
|
||
|
free(g);
|
||
|
|
||
|
// Introduce double-free vulnerability in fast bin
|
||
|
free(h);
|
||
|
free(i);
|
||
|
free(h);
|
||
|
|
||
|
|
||
|
// Reallocate memory and print the addresses
|
||
|
char *a1 = (char *)malloc(10);
|
||
|
char *b1 = (char *)malloc(10);
|
||
|
char *c1 = (char *)malloc(10);
|
||
|
char *d1 = (char *)malloc(10);
|
||
|
char *e1 = (char *)malloc(10);
|
||
|
char *f1 = (char *)malloc(10);
|
||
|
char *g1 = (char *)malloc(10);
|
||
|
char *h1 = (char *)malloc(10);
|
||
|
char *i1 = (char *)malloc(10);
|
||
|
char *i2 = (char *)malloc(10);
|
||
|
|
||
|
// Print initial memory addresses
|
||
|
printf("After reallocations:\n");
|
||
|
printf("a1: %p\n", (void *)a1);
|
||
|
printf("b1: %p\n", (void *)b1);
|
||
|
printf("c1: %p\n", (void *)c1);
|
||
|
printf("d1: %p\n", (void *)d1);
|
||
|
printf("e1: %p\n", (void *)e1);
|
||
|
printf("f1: %p\n", (void *)f1);
|
||
|
printf("g1: %p\n", (void *)g1);
|
||
|
printf("h1: %p\n", (void *)h1);
|
||
|
printf("i1: %p\n", (void *)i1);
|
||
|
printf("i2: %p\n", (void *)i1);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
```
|
||
|
In questo esempio, dopo aver riempito la tcache con diversi chunk liberati, il codice **libera il chunk `h`, poi il chunk `i`, e poi di nuovo `h`, causando un errore di double-free**. Questo apre la possibilità di ricevere sovrapposizioni di indirizzi di memoria durante il riallocazione, il che significa che due o più puntatori possono puntare alla stessa posizione di memoria. Manipolare i dati attraverso un puntatore può quindi influenzare l'altro, creando un rischio critico per la sicurezza e un potenziale per l'exploit.
|
||
|
|
||
|
Eseguendolo, nota come **`i1` e `i2` abbiano lo stesso indirizzo**:
|
||
|
|
||
|
<pre><code>Assegnazioni iniziali:
|
||
|
a: 0xaaab0f0c22a0
|
||
|
b: 0xaaab0f0c22c0
|
||
|
c: 0xaaab0f0c22e0
|
||
|
d: 0xaaab0f0c2300
|
||
|
e: 0xaaab0f0c2320
|
||
|
f: 0xaaab0f0c2340
|
||
|
g: 0xaaab0f0c2360
|
||
|
h: 0xaaab0f0c2380
|
||
|
i: 0xaaab0f0c23a0
|
||
|
Dopo le riallocazioni:
|
||
|
a1: 0xaaab0f0c2360
|
||
|
b1: 0xaaab0f0c2340
|
||
|
c1: 0xaaab0f0c2320
|
||
|
d1: 0xaaab0f0c2300
|
||
|
e1: 0xaaab0f0c22e0
|
||
|
f1: 0xaaab0f0c22c0
|
||
|
g1: 0xaaab0f0c22a0
|
||
|
h1: 0xaaab0f0c2380
|
||
|
<strong>i1: 0xaaab0f0c23a0
|
||
|
</strong><strong>i2: 0xaaab0f0c23a0
|
||
|
</strong></code></pre>
|
||
|
|
||
|
## Riferimenti
|
||
|
|
||
|
* [https://heap-exploitation.dhavalkapil.com/attacks/double\_free](https://heap-exploitation.dhavalkapil.com/attacks/double\_free)
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary><strong>Impara l'hacking su AWS da zero a esperto con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
|
||
|
Altri modi per supportare HackTricks:
|
||
|
|
||
|
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||
|
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
|
||
|
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
|
||
|
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
|
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
|
||
|
|
||
|
</details>
|