I buffer overflow non vengono rilevati al momento della compilazione. Ci sono strumenti di analisi del codice, come href="http://kernelnewbies.org/Sparse"> Sparse o Lint ( cpplint , pc-lint ) che eseguirà ulteriori analisi su entrambi i file di codice sorgente o binari compilati. Ogni strumento di analisi ha i propri algoritmi per determinare un overflow del buffer, ma si tratta di istruzioni note comuni che portano a buffer overflow.
È inoltre possibile aggiungere il controllo dei limiti al momento della compilazione che inserisce le informazioni sui limiti per ciascun blocco di memoria allocato. Queste informazioni sui limiti vengono quindi verificate in fase di esecuzione per garantire che i buffer rientrino nei loro limiti. Un'implementazione comune è usare i puntatori "grassi". Che contengono sia l'indirizzo del puntatore reale ai dati, sia ulteriori dati che descrivono la regione in cui si trova. Credo che Firefox lo faccia per le loro allocazioni di memoria, ma potrei sbagliarmi.
Le canarie vengono inserite in fase di compilazione per aiutare a rilevare i buffer overflow inserendo una word
di dati tra un buffer e i dati di controllo nello stack. Ad un certo punto, prima del ritorno della funzione, il canarino viene verificato come intatto.
ASLR non ha nulla a che fare con la protezione dello stack. Rende casuale l'indirizzo che il tuo programma esegue in memoria. Ciò significa che non è possibile fare affidamento sulle funzioni per essere allo stesso indirizzo ogni volta che si esegue il programma. Ciò impedisce l'hardcoding degli indirizzi di librerie e funzioni. Rendere necessario lo stack o l'heap (o qualsiasi pezzo di memoria che si sta tentando di eseguire) eseguibile, ma ASLR causerà comunque problemi. Se stai solo sperimentando e cercando di capire il codice di exploit, farei quanto segue:
- Disabilita ASLR
- Disabilita le protezioni dello stack
- Attacca ogni problema individualmente e riattivalo uno alla volta finché l'exploit non sarà in grado di gestirlo entrambi.
Se hai un file binario che va in crash a causa di ... beh, qualsiasi cosa (non solo un buffer overflow) esegue il programma in un debugger. Il debugger prenderà l'arresto nel punto esatto in cui il programma fallisce. Probabilmente dovresti capire che questa potrebbe non essere la posizione esatta dell'overflow, ma una traccia dello stack dovrebbe aiutare a determinare la causa principale. Suggerirei di leggere questi post se non hai familiarità con gli strumenti di reverse engineering o con l'architettura del computer x86.
Perché i buffer di overflow eseguito nella direzione sono
Strumenti di progettazione inversa