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?