Buffer Overflow non ha spazio sufficiente per l'exploit dopo essere stato arrestato

2

Quindi sto provando a scrivere un buffer overflow per un'applicazione server vulnerabile consapevolmente, voglio imparare come farlo da solo e voglio solo un po 'di direzione.

Lo sto guardando in un debugger di immunità sul server e ho il controllo su ECX, EBP e, soprattutto, sul registro EIP. L'invio del mio buffer dalla macchina attaccante causa l'arresto anomalo del programma, ma in seguito non ho abbastanza spazio per posizionare la mia shell inversa, ho abbastanza spazio nella prima parte del mio buffer. Ho solo pochi byte per capirlo e oltre questo punto sono bloccato. È possibile posizionare un set di istruzioni in una parte precedente del mio buffer e usare quei pochi byte per tornare ad esso? Dove posso leggere come fare questo?

    
posta Hadoken 17.11.2017 - 08:15
fonte

2 risposte

1

Ci sono vari modi per farlo. Sei in grado di ottenere un punto fisso nel codice per impostare il tuo EIP? Non ci stai dicendo se hai qualche restrizione ASLR, ma se lo fai, sei in grado di ottenere comunque una posizione fissa a cui fare riferimento? Cerca in:

link

link

Sono un'ottima lettura e dovresti trovare delle risposte lì.

    
risposta data 17.11.2017 - 09:57
fonte
3

Supponendo che tu stia parlando di una sovrascrittura EIP vanigliata e non di qualcosa come SEH, hai due opzioni a tua disposizione. Nessuna di queste è quella che considererei una tecnica "principiante" in quanto richiedono un po 'di conoscenza dell'Assemblea, anche se ci sono alcuni grandi siti Web che possono aiutarti.

1. Impiegare un Cacciatore di uova . Un egg hunter prevede di attaccare un piccolo bit di codice shell in uno spazio buffer limitato e quindi anteporre un uovo da 8 byte (ad esempio n00bn00b) prima del codice shell. L'egg hunter cercherà nella memoria il tuo uovo unico e poi salterà al codice shell che lo segue. Esempio di variabile del buffer

buffer = "\x41" *100 + "n00bn00b" + shellcode + "\x90" * 50 + egghunter + offset + jmpback

Dove sopra "offset" potrebbe essere un semplice JMP ESP in una DLL e "jmpback" sarebbe un'istruzione di assemblaggio per tornare nel buffer da qualche parte nel nopslide.

Anche se sembra un po 'confuso il flusso di esecuzione è il seguente

  1. La variabile offset viene posizionata dove si trova la sovrascrittura EIP. Questa variabile mantiene semplicemente l'indirizzo a un'istruzione JMP ESP che punta quindi alla variabile jmpback

  2. La variabile jmpback contiene un'istruzione di assemblaggio (ad esempio \xeb\xc4 ) che salta indietro nel nopsled.

  3. Il codice shell egghunter viene eseguito e inizia la ricerca della stringa n00bn00b.

  4. Quando viene trovata la stringa n00bn00b, salta allo shellcode che viene eseguito.

L'Egghunter è un ottimo modo per concederti un po 'più di spazio buffer.

2. Saltare all'indietro nel buffer : la seconda opzione, se lo spazio del buffer è disponibile, è di emettere alcune istruzioni di assemblaggio per tornare indietro nel buffer per eseguire il codice shell. Sembra la più semplice tra le due opzioni, tuttavia è possibile eliminare lo stack se non si fa attenzione a riallineare lo stack dopo l'esecuzione del codice shell.

Se hai una sovrascrittura pulita di un altro registro, come ECX, potrebbe anche essere possibile solo JMP ECX per attivare il tuo codice shell.

Nota che questa risposta presuppone che cose come DEP e ASLR non siano abilitate sulla macchina che stai tentando di sfruttare.

    
risposta data 17.11.2017 - 19:07
fonte