arrow_backフィールドノートに戻る
WEB SECURITY 公開日 9 Aug 2026

バッファオーバーフローとは?実践的なウォークスルー

実際のC言語の例、スタック図、そして自分で動作を確認するツールを使って、バッファオーバーフローがどのように機能するかを学びます。

バッファオーバーフローは、プログラムが固定サイズのメモリ領域に、その領域が保持できる以上のデータを書き込むときに発生します。余ったバイトが隣接するメモリに流れ込み、そのバッファの隣に何があるかによって、変数を破損させたり、プログラムをクラッシュさせたり、実行フローを完全に乗っ取ったりすることができます。これはソフトウェアセキュリティにおける最古のバグクラスの1つであり、今日でもCTF、CVE、組み込みファームウェアに現れます。

脆弱なパターン

C言語の典型的な例です。

#include <string.h>

void greet(char *name) {
    char buffer[64];
    strcpy(buffer, name);
}

int main(int argc, char **argv) {
    greet(argv[1]);
    return 0;
}

strcpyは渡した文字列をbufferにコピーしますが、境界チェックはありません。argv[1]が64バイトより長い場合、コピーは配列の終端を超えて続きます。スタック上では、bufferは他のローカル変数、保存されたレジスタ、そして最終的にgreet()終了後にCPUがどこにジャンプするかを示すリターンアドレスの下に位置します。そのリターンアドレスを制御できるアドレスで上書きすれば、次に何が実行されるかを制御できます。

これがなぜコンパイルされて実行されるのか

CとC++は生の配列に対する自動境界チェックを行いません。strcpygetssprintfstrcatのような関数は、宛先の実際のサイズについて考えず、ヌル終端子か送信元の長さについてのみ考えるため、バッファの終端を超えて書き込むことをいといません。これを、明示的なサイズ引数を取ってそこで停止するstrncpysnprintfと比較してください。脆弱性は実際には

この記事は AI の支援を受けて執筆し、Korra Studio の Michal Pilch(CISSP)が確認のうえ公開しました。

さらに先へ進む準備はできていますか?

これは Korra Studio ナレッジベースの 1 つのノートです。プラットフォームはすべてのトピックと 1 対 1 メンタリングをペアで提供します。

無料で始めるarrow_forward