Posso leggere / scrivere valori canarino dal registro% gs?

0

Vorrei sapere se è possibile leggere (o scrivere) i valori canarino dal registro% gs.

Se "si" , come; e se "no" , perché?

Inoltre, ho letto da qualche parte che i valori delle canarie sono memorizzati in una sorta di TLS (suppongo che sia "Thread Local Storage" ).

Qualcuno può far luce su di esso?

    
posta Jaydeep 08.10.2013 - 04:09
fonte

2 risposte

3

I thread condividono lo stesso spazio e codice di indirizzo. Tuttavia, per una variabile nella memoria locale del thread, ogni thread deve avere il proprio valore; quindi la variabile non può essere semplicemente memorizzata su un indirizzo fisso. Ci deve essere qualche riferimento indiretto.

Sulla CPU x86 a 32 bit, con Linux, le variabili locali del thread sono accessibili tramite il registro del segmento %gs , che fino ad allora non era utilizzato dal codice dell'applicazione. I segmenti sono un residuo dei vecchi tempi; Linux ha sempre definito tutti i segmenti che iniziano all'indirizzo 0 e si estendono su quattro gigabyte, consentendo al codice di dimenticarli completamente. Tuttavia, sono ancora presenti e uno di essi ( %gs ) è stato ripristinato per supportare l'archiviazione locale dei thread. Infatti, tutti i thread condividono la stessa memoria , ma ogni thread ha il proprio set di valori di registro.

Il canarino è uno slot in pila. Il suo scopo è quello di essere sovrascritto quando si verifica un overflow e l'overflow ha probabilmente un impatto sull'indirizzo di ritorno: il valore che è scritto nello slot deve essere riletto invariato alla fine della funzione. Questo valore specifico viene scelto casualmente all'inizio di ogni thread e ogni thread ha il suo; questo significa memoria locale thread, quindi il valore canarino di un thread può essere letto da quel thread in un determinato punto relativamente a %gs , come noto da quel thread.

    
risposta data 08.10.2013 - 13:55
fonte
1

Se il tuo obiettivo finale è quello di sconfiggere la difesa del canary stack, ci sono altri modi per cambiare il flusso del controllo del programma senza nemmeno sovrascrivere il valore del canary nello stack.

Un modo per farlo è sfruttando la vulnerabilità della stringa di formato nel programma. Il vantaggio dell'utilizzo di un exploit per stringhe di formato è che (i) non è necessario distruggere lo stack e (ii) evita la difesa come i canarini dello stack!

Puoi fare di più su sfruttare le vulnerabilità della stringa di formato qui .

    
risposta data 14.10.2013 - 20:59
fonte

Leggi altre domande sui tag