È possibile codificare i byte in un exploit di overflow del buffer che bypassano le funzioni di stringa?

10

Disclaimer : questo exploit è puramente per uso didattico. In questo exploit interpreto il ruolo della vittima e il software sfruttato è scritto da me da solo.

Ho un semplice server HTTP che voglio sfruttare con un attacco di overflow del buffer. Sto inviando una richiesta HTTP pericolosa che trabocca il buffer di una variabile di richiesta tramite la funzione strcpy - lo scenario è che lo sviluppatore ha dimenticato di usare strncpy.

Tuttavia, ci sono due sfide con la sovrascrittura dell'indirizzo di ritorno in questo programma che non so come risolvere:

  1. Strcpy interromperà la copia quando incontra un byte NULL nella stringa di origine. Pertanto, è possibile sovrascrivere l'indirizzo di ritorno con un indirizzo di destinazione che contiene il byte NULL 0x00? Ad esempio, se l'indirizzo di destinazione è 0x407200, dobbiamo scrivere \ x00 \ x72 \ x40. Tuttavia, strcpy restituirà il primo \ x00 e non copierà \ x72 \ x40. Pertanto, è possibile codificare \ x00 in modo tale che non faccia in modo che strcpy ritorni prematuramente?

  2. Allo stesso modo, il parser HTTP nel mio server HTTP divide la richiesta HTTP in token con lo spazio character \ x20 come delimitatore. Pertanto, è possibile sfuggire questo carattere, come il terminatore NULL qui sopra, in modo tale che un indirizzo che contiene \ x20 non venga diviso in due token separati da strtok?

In caso contrario, si tratta solo di una limitazione degli attacchi di buffer overflow, in quanto, a causa della costruzione del programma in questione, non è sempre possibile sovrascrivere l'indirizzo di ritorno con un indirizzo di destinazione di propria scelta?

    
posta George Robinson 25.07.2015 - 14:00
fonte

2 risposte

4

I byte nulli nel tuo indirizzo di ritorno sono difficili da battere. Dal momento che è un indirizzo in contrasto con il codice non è possibile utilizzare uno stub di codifica. Esistono tuttavia alcuni modi per aggirare questo problema:

1) Trova l'indirizzo perfetto. A volte l'applicazione copia il codice nello stack o in altre aree in memoria. Se sei fortunato puoi trovare una posizione statica che contiene un codice op adatto come jmp esp.

2) Controlla il supporto Unicode, Unicode a più byte ti permetterà di includere byte null nel tuo payload.

3) Potrebbe essere possibile spruzzare l'heap e rendere sempre più probabile che un indirizzo predeterminato contenga il proprio carico utile. Questo indirizzo predeterminato può essere scelto per non contenere byte null.

Buona fortuna

    
risposta data 26.07.2015 - 03:02
fonte
3

Quando stai sfruttando un overflow del buffer, il tuo attacco è possibile a causa di un misschecking sottostante sul codice asm. Nel tuo caso, l'uso di strcpy è in difetto quindi hai alcune limitazioni. In effetti, strcpy è una funzione di stringa.

Come hai detto, non puoi avere \ x00 byte. Puoi trovare altri casi (non fare affidamento su stcpy) quando \ x00 può essere consentito ma non in questo caso. A volte viene eseguito un ulteriore "trattamento" prima di chiamare strcpy e si avranno dei byte limitati come \ x20 nel protocollo HTTP.

Dovrai lavorare sull'exploit per sovrascrivere l'indirizzo di ritorno ed eseguire il payload senza usare quei caratteri. Potresti riuscire a utilizzare una Nop-slide prima del tuo carico utile; questo ti permetterà di spostare il tuo indirizzo shellcode.

Puoi anche usare Ritorna a lib C , o altri ROP tecnica.

    
risposta data 25.07.2015 - 17:31
fonte

Leggi altre domande sui tag