GOT overwrite: dirottare le chiamate a libreria
Con il linking dinamico, printf non è chiamata direttamente: passa dalla PLT, che salta all'indirizzo memorizzato nella GOT. Con lazy binding, la GOT è scrivibile.
L'attacco
Se hai una primitiva di scrittura arbitraria (format string, overflow di un puntatore), sovrascrivi free@got con l'indirizzo di system. La prossima free(ptr) esegue system(ptr); se ptr contiene "/bin/sh", hai una shell.
write(free_got, addr_of_system)
free("/bin/sh") -> system("/bin/sh")Difesa
Full RELRO (-Wl,-z,relro,-z,now): risolve tutti i simboli al load e rende la GOT sola lettura. Combinato con ASLR e PIE, toglie questo bersaglio comodo.