[解決済み] なぜこのコードはバッファオーバーフロー攻撃に対して脆弱なのでしょうか?
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);
関連
-
initializer element is not constant "というエラーが表示されるのですが?
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
[解決済み] C言語で%sを正しく使う - 超基本レベル
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
[解決済み] ⑭と⑯は何のためにあるのですか?
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] char *とchar[]の違い [重複]
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する