28 NİSAN 2015, Salı
Neden bu hafıza taşması atakları açık kod mu?
int func(char* str)
{
char buffer[100];
unsigned short len = strlen(str);
if(len >= 100)
{
return (-1);
}
strncpy(buffer,str,strlen(str));
return 0;
}
Bu kod taşması saldırılarına karşı savunmasız olduğunu ve neden olduğunu anlamaya çalışıyorum. len
* *5, ama gerçekten emin değilim bir yerine short
bildirilmiş ilgisi var diye düşünüyorum.
Herhangi bir fikir?
CEVAP
28 NİSAN 2015, Salı
Çoğu derleyici unsigned short
bir maksimum değer 65535'tir.
65536 0, 65600 olur sarılı, alacağı her türlü değerin üzerinde 65 olur.
Bu doğru uzunluğu (ör: 65600) uzun dizeleri denetiminden geçen ve taşma tampon anlamına gelir.
size_t
strlen()
, unsigned short
değil, sonucu depolamak için kullanın ve doğrudan buffer
boyutu kodlar ifadesi len
karşılaştırın. Örneğin:
char buffer[100];
size_t len = strlen(str);
if (len >= sizeof(buffer) / sizeof(buffer[0])) return -1;
memcpy(buffer, str, len 1);
Bunu Paylaş:
Neden Haskell's "hiçbir şey ...
Neden GCC ile x 86 tamsayı taşması son...
Neden imzasız taşma tanımlanan davranı...
arrayfun matlab açık bir döngü daha ön...
Neden görünümünde hazırda açık oturum ...