problemi col buffer overflow

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
lordlothar
00martedì 30 dicembre 2003 00:16
Scusate,
ho un problema con il buffer overflow dello stack...
allora se prendete in considerazione il programma:

#include

void funz(char *s)
{
char buffer[5]; // in memoria 8 bytes
strcpy(buffer,s);
}

int main()
{
funz("AAAAAAAASSSSRRRR");
return 0;
}

Nel parametro di funz() ho messo apposta una S per i bytes dello SFP e una R per quelli di RET.
Perchè teoricamente la situazione in memoria dovrebbe essere questa:

buffer sfp ret
[||||||||][||||][||||]

le pipe sono i bytes...

Il problema è che il messaggio di Segmentation Fault viene solo se aggiungo al parametro altri 8 bytes, infatti vedo Segmentation Fault con il parametro "AAAAAAAASSSSRRRR12345678". Ma quegli 8 bytes da dove vengono? Il Segmentation Fault è causato da '\0' alla fine della stringa, che sovrascrive il primo byte di RET o da 5678? E se fosse la seconda 1234 cosa diavolo sono? lo SFP? e allora SSSS e RRRR???

insomma ho bisogno di chiarimenti...


lordlothar
00venerdì 2 gennaio 2004 14:22
penso di aver capito.

T-Dragon
00venerdì 2 gennaio 2004 20:19
Ovvero?
lordlothar
00lunedì 5 gennaio 2004 13:13
unicode

X-Treem
00martedì 6 gennaio 2004 18:14
ovvio che ti servono + byte

void funz(char *s)
{
char buffer[5]; // in memoria 8 bytes
strcpy(buffer,s);
}


in assembler viene na cosa del genere

PUSH EBP |Imposto lo stack frame
MOV EBP, ESP |
SUB ESP,5 |Creo la var locale di 5 byte buffer
PUSH S |Infilo nello stack il ptr s
PUSH Buffer |Infilo nello stack il ptr buffer
CALL strcpy
LEAVE
RET

Ora creando la variabile buffer nello stack hai
[RET FROM strcpy] | 4 bytes
[PTR Buffer] | 4 bytes
[PTS S] | 4 Bytes
[LOCAL VAR] | 5 Bytes

(spero sappiate perchè sembrano girati al contrario)

siccome la strcpy inizia a scrivere dalla local var, per andare a sovrascrivere il RET dalla strcpy devi avere una stringa lunga

5+4+4+4=17bytes
in questo modo riesci a sovrascrivere completamente l'indirizzo di ritorno dalla strcpy.
Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 11:39.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com