Relro
Reading time: 3 minutes
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
Relro
RELRO sta per Relocation Read-Only ed è una funzione di sicurezza utilizzata nei binari per mitigare i rischi associati con le sovrascritture della GOT (Global Offset Table). Ci sono due tipi di protezioni RELRO: (1) Partial RELRO e (2) Full RELRO. Entrambi riordinano la GOT e la BSS dai file ELF, ma con risultati e implicazioni diverse. Specificamente, pongono la sezione GOT prima della BSS. Cioè, GOT si trova a indirizzi più bassi rispetto alla BSS, rendendo quindi impossibile sovrascrivere le voci della GOT sovrascrivendo le variabili nella BSS (ricorda che la scrittura in memoria avviene da indirizzi più bassi verso indirizzi più alti).
Analizziamo il concetto nei suoi due tipi distinti per chiarezza.
Partial RELRO
Partial RELRO adotta un approccio più semplice per migliorare la sicurezza senza influire significativamente sulle prestazioni del binario. Partial RELRO rende la .got di sola lettura (la parte non-PLT della sezione GOT). Tieni presente che il resto della sezione (come la .got.plt) è ancora scrivibile e, quindi, soggetto ad attacchi. Questo non impedisce alla GOT di essere abusata da vulnerabilità di scrittura arbitraria.
Nota: Per impostazione predefinita, GCC compila i binari con Partial RELRO.
Full RELRO
Full RELRO aumenta la protezione rendendo l'intera GOT (sia .got che .got.plt) e la sezione .fini_array completamente di sola lettura. Una volta che il binario inizia, tutti gli indirizzi delle funzioni vengono risolti e caricati nella GOT, quindi, la GOT viene contrassegnata come di sola lettura, prevenendo efficacemente qualsiasi modifica durante l'esecuzione.
Tuttavia, il compromesso con Full RELRO è in termini di prestazioni e tempo di avvio. Poiché deve risolvere tutti i simboli dinamici all'avvio prima di contrassegnare la GOT come di sola lettura, i binari con Full RELRO abilitato potrebbero sperimentare tempi di caricamento più lunghi. Questo sovraccarico aggiuntivo all'avvio è il motivo per cui Full RELRO non è abilitato per impostazione predefinita in tutti i binari.
È possibile vedere se Full RELRO è abilitato in un binario con:
readelf -l /proc/ID_PROC/exe | grep BIND_NOW
Bypass
Se il Full RELRO è abilitato, l'unico modo per bypassarlo è trovare un altro modo che non richieda di scrivere nella tabella GOT per ottenere un'esecuzione arbitraria.
Nota che il GOT di LIBC è solitamente Partial RELRO, quindi può essere modificato con una scrittura arbitraria. Maggiori informazioni in Targetting libc GOT entries.
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.