Come disattivare la funzione di ottimizzazione del compilatore gcc per attivare il buffer overflow
-
22-09-2019 - |
Domanda
Sto lavorando su un compiti problema che richiede la disattivazione di ottimizzazione del compilatore di protezione per farlo funzionare.Sto usando gcc 4.4.1 su ubuntu linux, ma non riesco a capire che le bandiere sono quelle giuste.Mi rendo conto che l'architettura di dipendente - la mia macchina w/ 32-bit processore Intel.
Grazie.
Soluzione
Che un buon problema.Per risolvere questo problema si avrà anche a disabilitare ASLR in caso contrario l'indirizzo di g() saranno imprevedibili.
Disattivare ASLR:
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
Disattivare canarie:
gcc overflow.c -o overflow -fno-stack-protector
Dopo canarie e ASLR sono disabili dovrebbe essere un dritto in avanti di attacco, come quelli descritti in Smashing the Stack per Divertimento e Profitto
Ecco una lista di caratteristiche di sicurezza utilizzato in ubuntu: https://wiki.ubuntu.com/Security/Features Non è necessario preoccuparsi di NX bit, l'indirizzo di g() sarà sempre in un eseguibile regione di memoria, perché è all'interno il TESTO del segmento di memoria.NX bit entrano in gioco solo se si sta tentando di eseguire shellcode in pila o heap, che non è richiesto per questo incarico.
Ora vai e clobber che EIP!
Altri suggerimenti
Urm, tutti delle risposte finora sono stati male con la risposta di Rook essere corretta.
Immissione:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
A seguire:
gcc -fno-stack-protector -z execstack -o bug bug.c
Disattiva ASLR, SSP / Propolice e di Ubuntu NoneXec (che è stato posto in 9.10, e abbastanza semplice da aggirare vedere la mprotect (2) tecnica per mappare le pagine come eseguibile e JMP) dovrebbe aiutare un po ', ma queste 'caratteristiche di sicurezza' non sono affatto infallibili. Senza il flag `execstack -z', le pagine hanno marcature di stack non eseguibili.
On distro più recenti (come del 2016), sembra che PIE è abilitato di default in modo avrete bisogno di disattivare in modo esplicito durante la compilazione.
Ecco un piccolo riassunto di comandi che può essere utile quando si gioca a livello locale con esercizi di tipo buffer overflow in generale:
Disattiva canarino:
gcc vuln.c -o vuln_disable_canary -fno-stack-protector
Disattiva DEP:
gcc vuln.c -o vuln_disable_dep -z execstack
Disattiva PIE:
gcc vuln.c -o vuln_disable_pie -no-pie
Disattiva tutti i meccanismi di protezione di cui sopra (attenzione: per la prova locale):
gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie
Per le macchine a 32 bit, è necessario aggiungere il parametro -m32
pure.
Prova la bandiera -fno-stack-protector
.
Lo so che è un vecchio thread, ma voglio sottolineare che non è necessario disabilitare ASLR al fine di fare un buffer overflow! Anche se ASLR è abilitato (kernel_randomize_va_space = 2) esso non ha effetto a meno che l'eseguibile compilato è PIE, quindi a meno che u compilato il file con la bandiera -fPIC -pie, ASLR non avrà effetto.
io soltanto disabilitando i canarini con -fno-stack-protector è sufficiente. Se si vuole verificare se ASLR funziona o non (codice indipendente di posizione deve essere impostata), uso: indurimento-check executable_name
Non voglio citare l'intera pagina, ma l'intero manuale di ottimizzazione è disponibile qui: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-Options
Dai suoni di esso che si desidera, almeno -O0
, il default, e:
-fmudflap -fmudflapth -fmudflapir
Per front-end che lo supportano (C e C ++), strumento tutti rischioso puntatore / array dereferenziazione operazioni, qualche libreria standard stringa / funzioni di heap e un certo altro costrutti associati con test gamma / validità. moduli così strumentato dovrebbe essere immune buffer overflow, uso mucchio valido, e alcune altre classi di C / C ++ errori di programmazione. Il strumentazione si basa su un separato libreria di runtime (libmudflap), che saranno collegati in un programma se -fmudflap viene dato in fase di collegamento. comportamento in fase di esecuzione del strumentato programma è controllata dal variabile d'ambiente MUDFLAP_OPTIONS. Vedere ENV MUDFLAP_OPTIONS = -help a.out per le sue possibilità.