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
f46a59f374
commit
aa3c18c5ad
@ -8,7 +8,7 @@ Quando você libera memória em um programa usando glibc, diferentes "bins" são
|
||||
|
||||
### Bins Não Ordenados
|
||||
|
||||
Quando você libera um bloco de memória que não é um bloco rápido, ele vai para o bin não ordenado. Este bin atua como uma lista onde novos blocos liberados são adicionados à frente (a "cabeça"). Quando você solicita um novo bloco de memória, o alocador olha para o bin não ordenado de trás para frente (a "cauda") para encontrar um bloco que seja grande o suficiente. Se um bloco do bin não ordenado for maior do que o que você precisa, ele é dividido, com a parte da frente sendo retornada e a parte restante permanecendo no bin.
|
||||
Quando você libera um bloco de memória que não é um bloco rápido, ele vai para o bin não ordenado. Este bin atua como uma lista onde novos blocos liberados são adicionados à frente (o "cabeça"). Quando você solicita um novo bloco de memória, o alocador olha para o bin não ordenado de trás para frente (o "cauda") para encontrar um bloco que seja grande o suficiente. Se um bloco do bin não ordenado for maior do que o que você precisa, ele é dividido, com a parte da frente sendo retornada e a parte restante permanecendo no bin.
|
||||
|
||||
Exemplo:
|
||||
|
||||
@ -55,7 +55,7 @@ Em exploits reais, você geralmente adicionará uma rotina auxiliar como:
|
||||
for(int i = 0; i < 7; i++) pool[i] = malloc(0x100);
|
||||
for(int i = 0; i < 7; i++) free(pool[i]);
|
||||
```
|
||||
Uma vez que o tcache está esgotado, liberações subsequentes vão para o bin não ordenado e o comportamento clássico de first-fit (busca na cauda, inserção na cabeça) pode ser acionado novamente.
|
||||
Uma vez que o tcache está esgotado, liberações subsequentes vão para o bin não ordenado e o comportamento clássico de first-fit (busca no final, inserção no início) pode ser acionado novamente.
|
||||
|
||||
---
|
||||
### 🚩 Criando um UAF de chunk sobreposto com first-fit
|
||||
@ -98,15 +98,13 @@ Receita de exploração (comum em CTFs recentes):
|
||||
4. **Alocar** novamente – a parte restante se sobrepõe a um chunk existente em uso → UAF.
|
||||
5. Sobrescrever campos sensíveis (ponteiros de função, vtable de FILE, etc.)
|
||||
|
||||
Uma aplicação prática pode ser encontrada no desafio *Setjmp* das Quals HITCON 2024, onde este exato primitivo é usado para pivotar de um UAF para controle total de `__free_hook`.{{#ref}}
|
||||
../../../../references/2024_setjmp_firstfit.md
|
||||
{{#endref}}
|
||||
Uma aplicação prática pode ser encontrada no desafio *Setjmp* das Quals HITCON 2024, onde este exato primitivo é usado para pivotar de um UAF para controle total de `__free_hook`.
|
||||
|
||||
---
|
||||
### 🛡️ Mitigações & Fortalecimento
|
||||
### 🛡️ Mitigações & Dureza
|
||||
|
||||
* **Safe-linking (glibc ≥ 2.32)** protege apenas as listas *tcache*/**fastbin** ligadas singularmente. Os bins não ordenados/pequenos/grandes ainda armazenam ponteiros brutos, então sobreposições baseadas em first-fit permanecem viáveis se você conseguir obter um leak de heap.
|
||||
* **Criptografia de ponteiro de heap & MTE** (ARM64) ainda não afetam glibc x86-64, mas flags de endurecimento de distribuições como `GLIBC_TUNABLES=glibc.malloc.check=3` abortarão em metadados inconsistentes e podem quebrar PoCs ingênuas.
|
||||
* **Safe-linking (glibc ≥ 2.32)** protege apenas as listas *tcache*/**fastbin** encadeadas. Os bins não ordenados/pequenos/grandes ainda armazenam ponteiros brutos, então sobreposições baseadas em primeiro ajuste permanecem viáveis se você conseguir obter um leak de heap.
|
||||
* **Criptografia de ponteiro de heap & MTE** (ARM64) ainda não afetam a glibc x86-64, mas flags de endurecimento de distribuições como `GLIBC_TUNABLES=glibc.malloc.check=3` abortarão em metadados inconsistentes e podem quebrar PoCs ingênuas.
|
||||
* **Preenchendo tcache ao liberar** (proposto em 2024 para glibc 2.41) reduziria ainda mais o uso não ordenado; monitore lançamentos futuros ao desenvolver exploits genéricos.
|
||||
|
||||
---
|
||||
@ -122,8 +120,8 @@ Uma aplicação prática pode ser encontrada no desafio *Setjmp* das Quals HITCO
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html)
|
||||
- É possível alocar alguma memória, escrever o valor desejado, liberá-la, realocá-la e, como os dados anteriores ainda estão lá, serão tratados de acordo com a nova estrutura esperada no chunk, tornando possível definir o valor para obter a flag.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
|
||||
- Neste caso, é necessário escrever 4 dentro de um chunk específico que é o primeiro a ser alocado (mesmo após forçar a liberação de todos eles). Em cada novo chunk alocado, seu número no índice do array é armazenado. Então, aloque 4 chunks (+ o inicialmente alocado), o último terá 4 dentro dele, libere-os e force a realocação do primeiro, que usará o último chunk liberado, que é o que tem 4 dentro dele.
|
||||
- 2024 HITCON Quals Setjmp write-up (Quarkslab) – ataque prático de sobreposição first-fit / unsorted-split: <https://ctftime.org/writeup/39355>
|
||||
- Neste caso, é necessário escrever 4 dentro de um chunk específico que é o primeiro a ser alocado (mesmo após forçar a liberação de todos eles). Em cada novo chunk alocado, seu número no índice do array é armazenado. Em seguida, aloque 4 chunks (+ o inicialmente alocado), o último terá 4 dentro dele, libere-os e force a realocação do primeiro, que usará o último chunk liberado, que é o que tem 4 dentro dele.
|
||||
- 2024 HITCON Quals Setjmp write-up (Quarkslab) – ataque prático de sobreposição de primeiro ajuste / divisão não ordenada: <https://ctftime.org/writeup/39355>
|
||||
- Angstrom CTF 2024 *heapify* write-up – abusando da divisão de bin não ordenado para vazar libc e ganhar sobreposição: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user