Overflow buffer: perché il registro ESP cambia il suo valore dopo la violazione di accesso

1

Sfondo: Attualmente tenta di sfruttare una vulnerabilità BoF. Dopo aver configurato l'ambiente, eseguendo un programma C compilato che contiene la funzione strcpy, ho disassemblato il programma mentre è in esecuzione in Immunity Debugger, quindi i dati nello stack del programma durante il momento del crash possono essere analizzati e sfruttati.

Problema: Quindi, in base ai video tutorial e ai post del blog ricercati, il passaggio successivo consiste nel trovare l'offset nella stringa danneggiata che contiene i dati sovrascritti nei valori dei registri ESP ed EIP. Questo è fatto in modo che possiamo trovare un'istruzione JMP ESP nel exe e sovrascrivere l'indirizzo di ritorno (valore EIP) utilizzando la posizione di memoria (senza caratteri errati) di detta istruzione.

Domanda: Tutto quanto sopra è stato fatto supponendo che il puntatore dello stack (ESP) stia puntando sul blocco di memoria che contiene il carico utile subito dopo la violazione sovrascritta e quella di accesso. Quindi tl dr la mia domanda è: Come può ESP puntare sul payload se deve sempre puntare in cima allo stack?

Immagini, ti preghiamo di spiegare: Ci scusiamo per l'immagine di dimensioni più ridotte. Ma l'immagine è venuta dal grande professor Vivek della classe SPSE di securitytube.net.

InoltresequalcunopuòaiutareaspiegarechecosaerailvaloreESPprimaedopol'incidente,eperchéilvalorediESPdovrebbeesserecambiatoperpuntareilnostrocaricoutile?èacausadellafunzionecreazione/mortedistrcpy,eseloè,comegiocaunruolonelvaloreESPcambiato?Ilcodicesorgenteèimpostatocometale:

#include<stdio.h>#include<string.h>voidvuln_func(char*inputstring){char*buf[100];strcpy(buf,inputstring)}intmain(){//getsinput_stringvuln_func(input_string);return0;}

Aggiornamento:Ilcommentodi@gameOvernellasuarispostahachiestoqualefosseil4141nell'immaginevisualizzata.Eccounaspiegazionemigliore:41èesadecimaleperilcarattereasciidiA.Checosacontienelastringacorrotta.Eciòchelastringacorrottacontienefinoall'offsetEIP(indirizzorestituito)ècompletamentearbitrario,inquestocasoeraunastringadi"A", quindi l'offset dell'indirizzo di ritorno è scritto con la posizione di memoria di JMP ESP, e dopo quello corrotto la stringa contiene il carico utile da eseguire. (Qual è il punto in cui l'ESP punta durante l'arresto) Di seguito la mia domanda: perché l'ESP punta al payload quando doveva puntare in cima allo stack?

    
posta Rennitbaby 28.03.2018 - 08:23
fonte

1 risposta

1

Come hai correttamente sottolineato ESP punta sempre in cima alla pila. Anche gli overflow stack si verificano a causa di un overflow di un buffer nello stack ( non a causa di un overflow di diciamo un buffer malloc-allocato ) . Quindi quando lo fai:

char* buf[100];

in effetti stai allocando uno spazio nello stack per il tuo buffer. Per illustrare questo:

Lostato/icontenutiinizialidiquestobuffer,primachevenganosovrascritticonilnostroinput,sonosconosciutiepossonoessereosservatiusandoundebugger,come gdb . Quindi, se vai e overflow che buffer con il tuo input, sovrascrivi tutto ciò che esiste nello stack (controlla l'immagine sopra per vedere in che direzione si verificherà l'overflow), quindi sovrascrivi EIP punta a ciò che vuoi che indichi. Ora, quando una funzione restituisce ( la maggior parte delle volte usando RET istruzione ) viene visualizzato EIP e viene eseguito anche: add esp, 4 . In questo modo ESP punta all'ultimo parametro inserito nello stack quando la funzione è stata chiamata, nel tuo esempio / immagine questo parametro è Arg 1 ( poiché gli argomenti vengono inseriti nello stack in ordine inverso ). Quindi l'immagine che hai postato è corretta e mostra lo stato dell'ESP quando la funzione ritorna. Quindi se trovi un'istruzione come jmp esp ecc ... puoi saltare direttamente alla posizione del tuo payload.

Ma non è l'unico caso sfruttabile. Quindi, è una buona pratica usare un debugger e osservare se qualche registro punta al payload e se cerca un'istruzione jmp reg . Ad esempio, in questo post , puoi vedere che entrambi ESP e EDI puntano al payload.

    
risposta data 28.03.2018 - 14:42
fonte

Leggi altre domande sui tag