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.