2013-10-03 7 views
7

Sto leggendo e sto cercando di imparare le vulnerabilità delle stringhe di formato. Ho una funzione vulnerabile e capisco il succo di ciò che devo fare con la mia stringa di formato.Formattare le stringhe e utilizzare% n per sovrascrivere l'indirizzo di memoria con un valore specifico

Fondamentalmente, questo è quello che voglio fare. Passa nella mia stringa di formato che contiene alcuni shellcode come parte di esso. Ho anche bisogno di formattare la mia stringa in modo che l'indirizzo di ritorno della funzione vulnerabile venga sostituito in modo che punti al mio shellcode nello stack. Quindi, quando la funzione ritorna, salterà al mio shellcode nello stack e aprirà una shell.

Attualmente, sono al punto in cui posso vedere il mio shellcode in pila e sono in grado di scrivere sull'indirizzo di ritorno per cambiarlo. Il problema è che sto usando% n come metodo per sovrascrivere l'indirizzo di ritorno e non sono sicuro di come ottenere% n da sovrascrivere con un valore specifico. Ovviamente,% n stampa semplicemente il numero di byte scritti finora nell'indirizzo specificato nello stack. Ho letto un paio di cose su come puoi manipolare% n per scrivere l'indirizzo esatto/il valore che vuoi, ma sono perso su come farlo.

Qualcuno può far luce?

Modifica: Ho provato a riempire la mia stringa di formato con elementi come "% 500d" e "% .500d" e "% nu" per alcuni valori n. (Ho provato valori molto più piccoli come . bene), ma che porta solo di un errore di segmentazione

per chiarire una certa confusione, ecco un esempio veloce che ho scritto in risposta a un commento:

Va bene, cercherò di essere un po 'più Ho un programma vulnerabile Il punto vulnerabile è "printf (input);" Voglio sfruttarlo passando una stringa di formato Ora, ad esempio, ho una stringa di formato

"\x0c\xde\xbf\xff%08x.%08x.%08x.%08x.%08x.%08x.%n" 

Questa stringa di formato, quando viene passata nella funzione vulnerabile, sovrascrive l'indirizzo di memoria di 0xffbfde0c con il numero di byte scritti. Sto cercando di scoprire come posso modificare quella stringa di formato in modo che possa rendere% n sovrascrivere con un valore specifico in qualche modo riempendo il numero di byte scritti prima di% n.

+2

Qual è la tua domanda? – ouah

+0

La mia domanda è come utilizzerei% n (nella mia stringa di formato) per stampare qualsiasi valore (leggi: indirizzo) che voglio. – Tesla

+0

'% n' è usato negli exploit stringa di formato per sovrascrivere la memoria non per leggere la memoria. Usa '% x' per scaricare la memoria. – ouah

risposta

3

L'unico modo per ottenere %n per scrivere un numero consiste nel rendere printf stampare questo numero di caratteri. Per ottenere il valore di qualsiasi puntatore, dovrai stampare molti molti byte.

Il modo più semplice è qualcosa come %999999s.

Inoltre, potrebbe essere più semplice provare a indirizzare il valore di ritorno ad una funzione (AKA "return to libc"), poiché il codice risiede in genere in indirizzi relativamente bassi.

+1

Forse '% 999d' è migliore di'% 999s', per evitare di leggere una stringa da un indirizzo casuale – anatolyg

+0

Sembra che ottenga un errore di segmentazione se provo ad aggiungere% nd alla fine della mia stringa di formato, indipendentemente dal valore di n è. – Tesla

Problemi correlati