1. ホーム
  2. c

[解決済み] なぜこのコードはバッファオーバーフロー攻撃に対して脆弱なのでしょうか?

2022-05-06 08:12:07

質問

int func(char* str)
{
   char buffer[100];
   unsigned short len = strlen(str);

   if(len >= 100)
   {
        return (-1);
   }

   strncpy(buffer,str,strlen(str));
   return 0;
}

このコードはバッファオーバーフロー攻撃に対して脆弱であり、私はその原因を探っています。私はそれが len と宣言されています。 short ではなく int が、よくわからない。

何かアイデアはありますか?

解決方法は?

ほとんどのコンパイラで unsigned short は65535です。

それ以上の値は折り返されるので、65536は0になり、65600は65になります。

つまり、正しい長さの長い文字列(例えば65600)はチェックを通過し、バッファをオーバーフローしてしまうのです。


使用方法 size_t の結果を格納するために strlen() ではなく unsigned short と比較し len の大きさを直接コード化した式に変換する。 buffer . だから例えば

char buffer[100];
size_t len = strlen(str);
if (len >= sizeof(buffer) / sizeof(buffer[0]))  return -1;
memcpy(buffer, str, len + 1);