目次
2. バッファ アンダーフローの危険性
ホームページ 運用・保守 安全性 C/C++ プログラムにおけるバッファ アンダーフローとは何を意味しますか?

C/C++ プログラムにおけるバッファ アンダーフローとは何を意味しますか?

May 29, 2023 pm 12:22 PM
C言語 c++

1、バッファ アンダーフロー

この記事では、別のバッファ オーバーフロー状況、つまりバッファ アンダーフローについて説明します。バッファ オーバーフローについては、前のトピックで分析しました (問題 7 を参照)。同じ理由がバッファ アンダーフローにも当てはまるため、この記事ではバッファ オーバーフローを引き起こす要因については繰り返しません。簡単に言うと、バッファ アンダーフローとは、充填データがオーバーフローしたときに次のレベルのバッファが上書きされる状況を指します。この記事では、バッファ アンダーフローの危険性、ソース コードにおけるその兆候、および問題の解決方法について説明します。

2. バッファ アンダーフローの危険性

C/C プログラムにおいて、バッファ アンダーフローはプログラムのクラッシュや実行などの結果を引き起こす可能性がある深刻な脆弱性です。悪質なコード。 2018 年 1 月から 10 月までに、合計 494 件の CVE 脆弱性情報が関係していました。脆弱性の一部は次のとおりです。

#CVE脆弱性の概要CVE-2018-1000001Libc Realpath バッファ アンダーフローの脆弱性 この脆弱性は、GNU C ライブラリが getcwd() システム コールによって返される相対パスを正しく処理しないために発生します。 . その他の図書館 こちらも影響を受ける可能性があります。影響を受けるシステムでは、SUID バイナリを介して root 権限を取得できます。 CVE-2018-1000637 zutils は、圧縮ファイル処理ユーティリティ パッケージです。このプログラムは、圧縮/解凍、圧縮ファイルの比較、圧縮ファイルの整合性検証をサポートします。 zcat は解凍ユーティリティの 1 つです。 zutils 1.8-pre2 より前のバージョンの zcat にはバッファ オーバーフローの脆弱性が存在します。攻撃者はこの脆弱性を悪用してサービス妨害を引き起こしたり、特別に細工した圧縮ファイルを使用して任意のコードを実行したりする可能性があります。 CVE-2018-5388strongSwan 5.6.3 より前のバージョンには、実装にバッファ アンダーフローの脆弱性があり、攻撃者はこの脆弱性を悪用してリソースを使い果たす可能性があり、その結果、サービス拒否で。

3. サンプル コード

この例は、Samate Juliet Test Suite for C/C v1.3 (https:/) からのものです。 /samate.nist.gov/SARD/testsuite.php)、ソースファイル名: CWE121_Stack_Based_Buffer_Overflow__CWE193_char_alloca_cpy_01.c。

3.1 欠陥コード

C/C++ 程序中的缓冲区下溢指的是什么

#上記のコード例では、ポインタ

data がオンラインで実行されます。 36 代入、代入操作により、ポインタ datadataBadBuffer を指していることがわかります。41 行目でメモリコピーに strcpy() を使用すると、 、ソース バッファ長が宛先バッファ長より大きいため、バッファ長がオーバーフローし、オーバーフロー部分が dataBadBuffer の下限を超えて、バッファ アンダーフローの問題が発生します。

360 コード ガードを使用して上記のサンプル コードを検出すると、「バッファ アンダーフロー」の欠陥を検出でき、表示レベルが高くなります。図 1 に示すように:

C/C++ 程序中的缓冲区下溢指的是什么#図 1: バッファ アンダーフロー検出の例


3.2 修復コード

#上記の修復コードで、Samate が指定した修復方法は次のとおりです。 37 行目のポインタ C/C++ 程序中的缓冲区下溢指的是什么data

に値を代入し、

data## を置き換えます。 #dataGoodBuffer を指します。このとき、data の長さは source と一致します。コピーに strcpy() を使用した場合行 42 の操作。ソース バッファは宛先バッファと同じ長さであるため、バッファ アンダーフローの問題が回避されます。この問題は、境界チェックなどの他の方法でも回避できます。 360 コード ガードを使用して修復されたコードを検出すると、「バッファ アンダーフロー」欠陥が存在しないことがわかります。図 2 に示すように:

図 2: 修復後の検出結果

C/C++ 程序中的缓冲区下溢指的是什么

4. バッファ アンダーフローを回避する方法

バッファアンダーフローを回避するには、次の点に注意する必要があります。

(1) 安全でないメモリ操作関数の使用は避けるようにしてください。

(2) 戻り値が明確に示されているメモリ操作関数の場合、関数の戻り値を効果的に判断して、操作が成功したかどうかを判断する必要があります。


(3) バッファにデータを埋めるときに境界チェックを実行する必要があります。

以上がC/C++ プログラムにおけるバッファ アンダーフローとは何を意味しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語データ構造:ツリーとグラフのデータ表現と操作 C言語データ構造:ツリーとグラフのデータ表現と操作 Apr 04, 2025 am 11:18 AM

C言語データ構造:ツリーとグラフのデータ表現は、ノードからなる階層データ構造です。各ノードには、データ要素と子ノードへのポインターが含まれています。バイナリツリーは特別なタイプの木です。各ノードには、最大2つの子ノードがあります。データは、structreenode {intdata; structreenode*left; structreenode*右;}を表します。操作は、ツリートラバーサルツリー(前向き、順序、および後期)を作成します。検索ツリー挿入ノード削除ノードグラフは、要素が頂点であるデータ構造のコレクションであり、近隣を表す右または未照明のデータを持つエッジを介して接続できます。

C言語ファイルの操作問題の背後にある真実 C言語ファイルの操作問題の背後にある真実 Apr 04, 2025 am 11:24 AM

ファイルの操作の問題に関する真実:ファイルの開きが失敗しました:不十分な権限、間違ったパス、およびファイルが占有されます。データの書き込みが失敗しました:バッファーがいっぱいで、ファイルは書き込みできず、ディスクスペースが不十分です。その他のFAQ:遅いファイルトラバーサル、誤ったテキストファイルエンコード、およびバイナリファイルの読み取りエラー。

Debian Readdirが他のツールと統合する方法 Debian Readdirが他のツールと統合する方法 Apr 13, 2025 am 09:42 AM

DebianシステムのReadDir関数は、ディレクトリコンテンツの読み取りに使用されるシステムコールであり、Cプログラミングでよく使用されます。この記事では、ReadDirを他のツールと統合して機能を強化する方法について説明します。方法1:C言語プログラムを最初にパイプラインと組み合わせて、cプログラムを作成してreaddir関数を呼び出して結果をinclude#include#include inctargc、char*argv []){dir*dir; structdireant*entry; if(argc!= 2){(argc!= 2){

C言語データ構造:人工知能におけるデータ構造の重要な役割 C言語データ構造:人工知能におけるデータ構造の重要な役割 Apr 04, 2025 am 10:45 AM

C言語データ構造:人工知能の分野における人工知能におけるデータ構造の重要な役割の概要、データ構造は、大量のデータを処理するために重要です。データ構造は、データを整理および管理し、アルゴリズムを最適化し、プログラムの効率を改善するための効果的な方法を提供します。一般的に使用されるC言語で一般的に使用されるデータ構造には、次のものが含まれます。配列:同じタイプの連続して保存されたデータ項目のセット。構造:さまざまな種類のデータを一緒に整理し、名前を付けるデータ型。リンクリスト:データ項目がポインターによって接続される線形データ構造。スタック:最後のファーストアウト(LIFO)原理に続くデータ構造。キュー:ファーストインファーストアウト(FIFO)原則に続くデータ構造。実用的なケース:グラフ理論の隣接するテーブルは人工知能です

C言語でファイルを処理するためのヒントのトラブルシューティング C言語でファイルを処理するためのヒントのトラブルシューティング Apr 04, 2025 am 11:15 AM

C言語処理ファイルのヒントのトラブルシューティングファイルをC言語で処理するとき、さまざまな問題に遭遇する可能性があります。以下は一般的な問題であり、対応するソリューション:問題1:ファイルコードを開くことができません:ファイル*fp = fpen( "myfile.txt"、 "r"); if(fp == null){//ファイルの開く}理由:ファイルパスエラーファイルは存在しません。 Charbuffer [100]; size_tread_bytes = fread(buffer、1、siz

Cおよびシステムプログラミング:低レベルのコントロールとハードウェアの相互作用 Cおよびシステムプログラミング:低レベルのコントロールとハードウェアの相互作用 Apr 06, 2025 am 12:06 AM

Cは、ハードウェアに近い制御機能とオブジェクト指向プログラミングの強力な機能を提供するため、システムプログラミングとハードウェアの相互作用に適しています。 1)cポインター、メモリ管理、ビット操作などの低レベルの機能、効率的なシステムレベル操作を実現できます。 2)ハードウェアの相互作用はデバイスドライバーを介して実装され、Cはこれらのドライバーを書き込み、ハードウェアデバイスとの通信を処理できます。

c言語ファイルの操作:ファイルの読み方は? c言語ファイルの操作:ファイルの読み方は? Apr 04, 2025 am 10:42 AM

C言語ファイルの操作:ファイルは序論の読み取りファイル処理はC言語プログラミングの重要な部分であり、プログラムがディスクやフラッシュドライブなどの外部ストレージデバイスと対話できるようにします。この記事では、C言語でファイルを読み取る方法について説明します。ファイルを読み取る手順ファイルを開きます。FOPEN関数を使用してファイルを開きます。この関数には、ファイル名とオープンモードの2つのパラメーターが必要です。ファイルが開いているかどうかを確認します。FOPEN関数によって返されるポインターがnullかどうかを確認します。 nullの場合、ファイルを開くことができません。ファイルの読み取り:Fread関数を使用して、ファイルからバッファーまでデータを読み取ります。この関数には、バッファーアドレス、バッファ要素サイズ、読み取る要素の数、およびファイルポインターの4つのパラメーターが必要です。ファイルを閉じます:fを使用します

c言語条件付き編集:初心者向けの詳細なガイドへの実践的なアプリケーション c言語条件付き編集:初心者向けの詳細なガイドへの実践的なアプリケーション Apr 04, 2025 am 10:48 AM

c言語条件付きコンパイルは、コンパイル時間条件に基づいてコードブロックを選択的にコンパイルするメカニズムです。導入方法には、#IFおよび#ELSEディレクティブを使用して、条件に基づいてコードブロックを選択します。一般的に使用される条件付き式には、STDC、_WIN32、Linuxが含まれます。実用的なケース:オペレーティングシステムに従って異なるメッセージを印刷します。システムの数字数に応じて異なるデータ型を使用します。コンパイラに応じて、異なるヘッダーファイルがサポートされています。条件付きコンパイルにより、コードの移植性と柔軟性が向上し、コンパイラ、オペレーティングシステム、CPUアーキテクチャの変更に適応できます。

See all articles