2010-03-03 11 views
6

Il mio programma si è bloccato in modo anomalo quando ho aggiunto l'opzione -fstack-check e -fstack-protector. __stack_chk_fail viene chiamato nella traccia posteriore.Come funziona esattamente l'opzione gcc -fstack-check?

Quindi, come ho potuto sapere dove si trova il problema? Cosa controlla veramente -fstack-check? Le informazioni su gcc sembrano troppo grandi per trovare la risposta.

risposta

5

Dopo verificato il programma di montaggio. Penso che -fstack-check, aggiungerà il codice write 0 a un offset del puntatore dello stack, quindi per verificare se il programma visita un indirizzo di violazione, il programma si è bloccato se lo ha fatto. ad es. mov $ 0x0, -0x928 (% esp)

+0

puoi elaborare con alcuni esempi di codice e output? –

+0

Questo non ha nulla a che fare con il tuo errore. Vedi la mia risposta qui sotto – rurban

2

"` -fstack-protettore' emette codice aggiuntivo per controllare buffer overflow, come pila attacchi formidabili. Questo viene fatto aggiungendo una variabile guardia per funzioni con oggetti vulnerabili. Ciò include funzioni che chiamata alloca, e funzioni con tamponi superiori a 8 byte. i guardie vengono inizializzati quando viene inserita una funzione e poi controllato quando la funzione termina. Se un controllo guardia fallisce, un messaggio di errore viene stampato e si termina il programma"

GCC Options That Control Optimization

GCC extension for protecting applications from stack-smashing attacks

Smashing The Stack For Fun And Profit

Spero che questo vi darà qualche indizio ..

+0

Questo è di grande aiuto, grazie. – stcatz

+4

Si noti che '-fstack-protector' e' -fstack-check' sono diverse opzioni. (per gli altri googler) – Offirmo

1

-fstack-check: Se due funzionalità macro STACK_CHECK_BUILTIN e STACK_CHECK_STATIC_BUILTIN sono lasciati al default 0, semplicemente inserisce un byte NULL ogni 4 KB (pagina) quando lo stack cresce. Per impostazione predefinita solo uno, ma quando lo stack può far crescere più di una pagina, che è il caso più pericoloso, ogni 4KB. linux> 2.6 ha solo una piccola lacuna tra lo stack e l'heap, che può portare ad attacchi stack-gap, noti dal 2005. Vedere What exception is raised in C by GCC -fstack-check option per il montaggio. È abilitato in gcc almeno dal 2.95.3, in clang dal 3.6.

__stack_chk_fail è il codice -fstack-protector inserito che verifica un valore canarino di stack inserito che potrebbe essere sovrascritto da un overflow di stack semplice, ad es. per ricorsione.

Problemi correlati