3

脆弱性をよりよく理解するために、以下のコードを使用してバッファ オーバーフローをトリガーしようとしています。

特定のフィールドがあり、オーバーフローを防ぐために幅が指定されているフィールドもありますが、オーバーフローを可能にするために 1 つのケース (firstName) でそれを省略しました:

char firstName[21], surName[31], job[16];

printf("Enter first name: ");
scanf("%s", firstName);
printf("Enter surname: ");
scanf("%30s", surName);
printf("Enter job name : ");
scanf("%15s", job);

したがって、次のように入力すると:

UmbertoTestingOverflow
Example
Janitor

記録された変数は次のように表示されます。

UmbertoTestingOverfoExample
Example
Janitor

バッファ オーバーフローに関する私の理解によれば、firstname の余分な文字は別のフィールドに実行されているはずですが、この場合は別の変数からユーザー入力を取得し、それを名に追加しています。それで、このバッファオーバーフローの動作ですか、それとも他の何かがこれを引き起こしているのですか?

4

3 に答える 3

3

はい、これはスタック上のバ​​ッファのオーバーフローです。

firstName入力にオーバーフローしましたsurName。しかし、それsurNameを入力すると変更され、文字が で上書きされましたExample

オーバーフローしたため、文字列に null ターミネータがないため、実際よりも長くfirstName見えます。firstName次に、その「最後」が上書きされました(これらのバイトは別の変数に属していたため)。

これは実際には未定義の動作です。コンパイラがバッファをスタックのどこに置くかはわかりません。

バッファのオーバーフローを防ぐにはfgets、 ではなく文字列の読み取りに使用する必要がありscanfます。

fgets( firstName, 21, stdin );
于 2013-09-19T03:59:54.300 に答える
1

はい、これはバッファ オーバーフローの動作です。

4 行目の firstnamescanfで、実際にバッファ オーバーフローが発生しました。firstNameで始まり、によって占有されているスペースに続く長い名前を保存しましたsurName。もちろん、ゼロターミネーターで終了しました。

次に、6 行目で、長い名前を新しい姓「Example」で上書きsurNameします。また、ゼロターミネーターで終了しました。

printf of firstNamethen は、 の先頭から始まり、intofirstNameの終わりを過ぎて、ゼロ ターミネータが見つかるまで続きます。firstNamesurName

バッファ オーバーフローがエクスプロイトとして使用される場合、通常は surName の後に firstName がスキャンされるため、書き込まれたオーバーフロー自体は上書きされません。

于 2013-09-19T04:00:35.043 に答える
1

はい、最初の配列を 2 番目の配列にオーバーフローさせました。

最初の割り当てでは、firstName含まれUmbertoTestingOverfloており、 の最初の文字はsurNameに設定されていましたw。2 番目の課題では、surNameが に設定されましたExample

印刷すると、 の最後にある文字firstNameに遭遇するまで文字を印刷し続けました。関連する記憶は変更されませんでした。\0surNamejob

于 2013-09-19T04:02:52.303 に答える