O que escrita-arbitraria-para-rce faz?
Manual de como transformar uma primitiva de escrita arbitrária em execução remota de código. Use quando você tem uma escrita arbitrária (por exploração de heap, format string ou escrita fora dos limites) e precisa convertê-la em execução de código atacando GOT, hooks, vtables de _IO_FILE, exit_funcs, TLS_dtor_list, modprobe_path, .fini_array ou vtables de C++.
Alvos comuns
- GOT (tabela de deslocamento global)
- Hooks (como
__free_hook,__malloc_hook) _IO_FILEvtableexit_funcsTLS_dtor_listmodprobe_path.fini_array- vtables de C++
Pré-requisitos
- Um binário ELF (Linux)
- Primitiva de escrita arbitrária (por exemplo, em heap, format string ou OOB)
- Conhecimento básico sobre as proteções do binário (ASLR, PIE, RELRO)
Passos
- Identificar o alvo: Escolha o alvo com base nas proteções disponíveis e no contexto do programa.
- Preparar a escrita: Use a primitiva para escrever o endereço desejado no local do alvo.
- Verificar a integridade: Garanta que a escrita não corrompa outros dados necessários.
- Executar o exploit: Acione o código injetado (por exemplo, chamando a função que usa o ponteiro alterado).
Técnicas
1. Ataque a GOT
- Útil em binários com RELRO parcial.
- Escreva o endereço da função desejada no slot da GOT.
2. Ataque a hooks (glibc < 2.34)
- Alvos comuns:
__free_hook,__malloc_hook. - Escreva o endereço de
systemou outro gadget.
3. _IO_FILE vtable
- Modifique o ponteiro vtable em uma estrutura
_IO_FILE. - Use
_IO_str_overflowou_IO_wstr_overflow.
4. exit_funcs
- Sobrescreva
__exit_funcspara apontar para seu código. - Ativado quando o programa chama
exit().
5. TLS_dtor_list
- Modifique a lista de destruidores de thread local.
- Útil em binários com thread.
6. modprobe_path
- Escreva um caminho para um script malicioso.
- Ativado ao executar um arquivo com formato binário desconhecido.
7. .fini_array
- Sobrescreva entradas em
.fini_array. - Executado antes do encerramento do programa.
8. vtables de C++
- Modifique o ponteiro vtable de um objeto.
- Útil em binários C++ sem CFI.
Considerações
- Verifique o estado da memória antes e depois da escrita.
- Ajuste offsets conforme necessário (por exemplo, devido a ASLR).
- Teste em ambiente controlado antes de usar em produção.
- Para glibc >= 2.34, hooks foram removidos; use outras técnicas como
_IO_FILEvtable.
Exemplo (esquemático)
# Supondo primitiva: write(addr, data)
# Ataque a __free_hook com system
target = &__free_hook
write(target, system_addr)
# Agora free(ptr) executará system(ptr)
Referências
- Documentação oficial do yaklang.
- Artigos sobre exploração de heap e escrita arbitrária.
- CVE relacionadas (ex: CVE-2023-...).