Stavo testando un buffer overflow e la seguente cosa strana è accaduta:
L'indirizzodiritornoèa0xbffff7bc
chehoscopertodaltest.L'hosostituitoconilvalorechevolevo0xbffff636
.
Quandovienechiamatoreturnsembradirigereversounindirizzodiversodaquellochehoaggiunto.Dallatracciaposterioresipuòvederechehatestatotuttigliindirizziaccantoaquello.
Tuttavia,hasostituito0xbffff636
con0xbffff71b
.Chiaramentenonhacambiatoglialtriindirizzichehaprovatoatornarenellabacktraceda1a6,ma0nonècorretto.Sembrache#0avrebbedovutoessere0xbffff636
maèstatomodificato,cometuttiglialtriindirizzidopoiltest.
Qualèunapossibileragionepercuil'indirizzoècambiato?
Modifica/UPDATE
Questomostral'indirizzo0xbffff636
chesitrovanelmezzodiunaslittaNOP.Ilbufferè500byte,l'indirizzodiritornoè540offset.
Sono attualmente in un punto di rottura nell'istruzione return, e ciò che è strano è che fare un backtrace al punto mostra che 0xbffff636
è stato provato come punto di ritorno, ma non ho ancora restituito. Quando continuo e restituisco il backtrace si trasforma in backtrace che ho postato originariamente con '0xbff636' diventando '0xbffff71b'. Ho pensato di aggiungere questo.
UPDATE2 Ecco la parte rilevante del codice del libro:
Invecedicontinuare,continuoa"passare" al programma finché non ho abbandonato la funzione recv_line
che copiava i dati in un buffer (chiamata richiesta). Questa funzione è tornata a buon fine poiché non ho toccato il suo indirizzo. Ora ho continuato con la funzione di gestore di sopra fino a quando sono arrivato alla fine e questo è quello che ho visto:
Sembra che non trovi 0xbfff636
valido quando lo vede per la prima volta. Ho già fatto overflow in questo ambiente, quindi sono abbastanza sicuro che non ci siano protezioni.
Nota : sto compilando con -g il flag di debug. Corro il processo come sudo. Quindi collegalo al processo in esecuzione con gdb