0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バッファオーバーフローについて自分的ふんわりまとめ

Last updated at Posted at 2024-09-27

はじめに

百聞は一見に如かず。
脆弱性の中でわりと聞くバッファオーバーフローについて実際に引き起こしてみて、知った事、思った事をまとめてみた。

バッファオーバーフローについて

割り当てられているバッファサイズを超えた値に上書きされた状態をバッファオーバーフロー状態というらしい。上書きされるメモリ(バッファ)の領域の場所により「何とかベースのバッファオーバーフロー」という名称で呼ばれるらしい。
JVNでも新着リストをざっと見るとバッファオーバーフロー関連の脆弱性情報を見かける印象。

バッファオーバーフローを試しに引き起こしてみた

試す前に環境準備。
バッファオーバーフローを引き起こす為にはバッファサイズを指定できるC言語を使用したいのでVS CodeでC言語の環境を準備する。
準備の手順は調べると色々なサイトがあるけれど、今回はこちらを参照した。

バッファオーバーフローのコード例

参考にしたコードが載っているサイトはこちら。(他のカテゴリの脆弱性についても色々載っているので今回以降も参考にしたいサイトだと思った。)

コード例
#define BUFSIZE 256
int main(int argc, char **argv) {
char buf[BUFSIZE];
strcpy(buf, argv[1]);
}

読んでみると、1行目はバッファサイズを256と指定している。
3行目でbufのバッファサイズを256に設定している。
4行目のstrcpyでバッファサイズ256のbufargv[1]の文字列をコピーしている。

strcpy自体についてはこちらのサイトを参照した。

https://marycore.jp/prog/c-lang/string-strcpy-strncpy/

記事中にある通り、文字列の終わりを示すナル文字('\0')に1バイト必要なところもポイントっぽそう。

実際にVS Codeに書いたコードはこちら(ほぼ例のままではある)。

実際に書いたコード
#include <string.h>

#define BUFSIZE 256

int main(int argc, char **argv) {
char buf[BUFSIZE];
strcpy(buf, argv[1]);
}

デバッグしてみると以下のメッセージ(抜粋)が表示される。

デバッグメッセージ
Thread 1 hit Breakpoint 1, main (argc=1, argv=0x21c827614b0) at C:\C_file_2409\test_cwe_121.c:7
7	strcpy(buf, argv[1]);

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00007ffaac4af04a in strcpy () from C:\Windows\System32\msvcrt.dll

メッセージを読んでみると7行目のstrcpyで停まっていることが分かる。
SIGSEGVはセグメント不正のメッセージで、使用可能なメモリー範囲外のメモリーアドレスを参照したことを示しているらしいので、確かにバッファオーバーフローが引き起こされている事が分かる。

参照しているのはargv[1]のメモリーで、今回、配列argvの長さは1なのでargv[1]には値が存在しない。(printfで見てみるとnull)
argv[1]のメモリーを参照しようとしたのでSIGSEGVが出ていることが分かる。

他にも書いたコード

bufのバッファサイズを超えた値を書き込もうとしてSIGSEGVが出るパターン。

他にも書いたコード
#include <string.h>

#define BUFSIZE 5
int main(char *abcd) {
char buf[BUFSIZE];
strcpy(buf, abcd);
}

そのデバッグのメッセージ(抜粋)。

デバッグメッセージ
Thread 1 hit Breakpoint 1, main (abcd=0x1 <error: Cannot access memory at address 0x1>) at C:\C_file_2409\test_cwe_121_2.c:6
6	strcpy(buf, abcd);

Thread 1 received signal SIGSEGV, Segmentation fault.
0x00007ff90b44f02b in strcpy () from C:\Windows\System32\msvcrt.dll

まとめ

C言語にはあまり馴染みがなかったのでウッ…となったけれどコードの中身を見てみると、うっかり書きかねないなと思った。
それとC言語と違ってメモリ管理の事を考えなくて良い言語もある点、C言語ベースの言語も潜在的にバッファオーバーフローが発生する可能性がある点も、今回調べる中で知れたので良かった。

参考リンク

(むしろこれ読んだ方がいい)

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?