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
何か案は?
ベストアンサー1
ほとんどのコンパイラでは、の最大値は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);