Perché dobbiamo rimuovere i byte null dal codice shell?

2

Sto studiando le basi per creare codici shell. Ho una domanda al riguardo.

Nel mio libro di testo, l'autore memorizza il suo codice shell in una variabile di ambiente e inietta l'indirizzo di esso usando strcpy() in un programma.
Quando crea il suo codice shell, rimuove i byte nulli. Dice che questo è dovuto al fatto che strcpy() si fermerà a byte nulli.

Tuttavia, penso, poiché strcpy() ottiene solo l'indirizzo della variabile d'ambiente (memorizzando il suo codice shell), se il suo codice shell ha byte null, non importa. Penso che il suo obiettivo sia quello di cambiare l'indirizzo di ritorno nel percorso della variabile d'ambiente.
Nel libro di testo, un codice shell con byte null non funziona in questa situazione, ma un codice shell privo di null.

Non riesco a capire il motivo per cui dobbiamo rimuovere i byte null in questa situazione.

    
posta John Smith 30.04.2018 - 03:18
fonte

2 risposte

2

Hai ragione in questa situazione; strcpy infatti smetterà di leggere quando raggiunge un byte null, ma questo deve essere fatto solo per lo shellcode che viene passato direttamente a una funzione di stringa che si aspetta stringhe con terminazione nulla. Ovviamente, i byte null sono codici macchina validi.

Poiché stai iniettando solo l'indirizzo nel tuo payload e non il carico utile vero e proprio, strcpy non leggerà il carico utile, come hai ipotizzato.

Forse l'autore ha fatto un semplice mix; ci possono certamente essere scenari in cui è preferibile passare l'intero payload attraverso qualcosa come strcpy , nel qual caso dovresti effettivamente occuparti dei byte null.

Vedi questa risposta per un po 'di storia.

    
risposta data 30.04.2018 - 04:23
fonte
0

Un terminatore null è un metodo di codifica "sicuro" perché si presume che la stringa sia terminata quando viene letto un byte null. Questo presumibilmente aiuta a prevenire buffer overflow e altri problemi simili. Nel caso di copia stringa, la funzione andrà all'indirizzo di memoria specificato, leggerà un byte di dati e lo scriverà nella nuova posizione. Aumenterà gli indirizzi di memoria e copierà i valori finché non leggerà null e la funzione verrà chiusa.

Se hai un valore nullo nel tuo codice shell, quando passa attraverso strcpy() la funzione assumerà che il nullo nel tuo codice shell sia la fine della stringa e l'uscita, lasciando incompleta la copia del codice shell.

    
risposta data 30.04.2018 - 03:39
fonte

Leggi altre domande sui tag