SORU
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ş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BiGSH0TROB

    BiGSH0TROB

    7 NİSAN 2011
  • SelmerSaxMan

    SelmerSaxMan

    24 HAZİRAN 2006
  • Shantanu Sood

    Shantanu Soo

    3 Kasım 2008