下に示すmsg_file.txtの内容を読み込んで表示するプログラムを使ってバッファオーバーランの危険性を検出するプログラムを作りたいのですが、どのように書き換えたら良いでしょうか。
プログラムソース
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #define FILEPATH "msg_file.txt"
6
7 int main();
8 void vuln(const char* line);
9 void stack_dump(void* ptr, int counts);
10 void hello();
11
12 int main()
13 {
14 char linebuf[1024];
15 FILE *fp;
16 long mark1 = 0x11111111;
17 memset(linebuf, 0, sizeof(linebuf));
18
19 fp = fopen(FILEPATH, "r");
20 fgets(linebuf, sizeof(linebuf)-1, fp);
21 fclose(fp);
22
23 vuln(linebuf);
24
25 printf("------------- end of main() -------------\n");
26 }
27
28 void vuln(const char* line)
29 {
30 char msg[20];
31 long mark2 = 0x22222222;
32 memset(msg, 0, sizeof(msg));
33
34 strcpy(msg, line);
35
36 stack_dump(&mark2, 13);
37
38 printf("INPUT[%s]\n", msg);
39 }
40
41 void stack_dump(void* ptr, int counts)
42 {
43 int i;
44 unsigned long *ulong_ptr = (unsigned long *)ptr;
45 unsigned char uchar_buf[4];
46
47 printf("-----------------------------------------\n");
48 printf(" address | long var | +0 +1 +2 +3 | 0123\n");
49 printf("-----------------------------------------\n");
50 for(i=0; i<counts; i++) {
51 printf(" %08x| %08x", &ulong_ptr[i], ulong_ptr[i]);
52 memcpy(uchar_buf, &ulong_ptr[i], sizeof(uchar_buf));
53 printf(" | %02x %02x %02x %02x",
54 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]);
55 if(uchar_buf[0]<32 || uchar_buf[0]>126) uchar_buf[0] = '.';
56 if(uchar_buf[1]<32 || uchar_buf[1]>126) uchar_buf[1] = '.';
57 if(uchar_buf[2]<32 || uchar_buf[2]>126) uchar_buf[2] = '.';
58 if(uchar_buf[3]<32 || uchar_buf[3]>126) uchar_buf[3] = '.';
59 printf(" | %c%c%c%c\n",
60 uchar_buf[0], uchar_buf[1], uchar_buf[2], uchar_buf[3]);
61 }
62 printf("-----------------------------------------\n");
63 }
64
65 void hello()
66 {
67 printf("+----------+\n");
68 printf("| HELLO! |\n");
69 printf("+----------+\n");
70 exit(0);
71 }
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
14 char linebuf[1024];
15 FILE *fp;
16 long mark1 = 0x11111111;
と
30 char msg[20];
31 long mark2 = 0x22222222;
普通の変数の場合'linebuf'と'mark1'はどちらが先になるか分かりません。構造体にまとめましょう。
>printf(" %08x| %08x", &ulong_ptr[i], ulong_ptr[i]);
ポインタの表示にxを使っていますがK&R第2版のころから使えなくなっています。下記のようにしましょう。
printf("%p",ポインタ型の式);またはprintf("%x",(int)(ポインタ型の式));
No.1
- 回答日時:
何をどう検出したいのか判りませんが…。
msg_file.txtが20バイト以上あれば、
>34 strcpy(msg, line);
の時点でめでたくバッファオーバーランしていますが…。
その後コールされるstack_dump()で、vuln()のローカル変数mark2の値が破壊されていることが確認できる…かも知れません。
# 実際にメモリ上にどのように配置されるか…で、破壊が確認できない場合もあります。
ぶち壊した後で壊れたことを検出したところで…手遅れですけどね。
# 生卵を叩きつけて割れてぐちゃぐちゃになったのを確認した後で、割れていない状態には戻せませんし。卵焼きは作れません。
で…vuln()のリターンアドレスも幸いにして破壊されているでしょうから、
その後の動作は保証できない。ということになります。
# HDDの中身ぶっ壊そうがリセットされようが不思議はない…ということに。
# まぁ、最近の普通のOSならプロセスがOSによって殺されるだけで済むはずですが。
## 割れた生卵を掃除して片付ける…みたいな。残念ながら卵焼きは諦めて頂くことに。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
Cでファイルの行数をカウントす...
-
構造体メンバの初期化
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
C言語で複数列のデータを1列の...
-
fread(),fwrite()等について
-
[C]セグメンテーションエラー:...
-
#defineが使用するメモリ領域に...
-
C++で指定文字列のカウント方法...
-
printf による16進表示について
-
fscanfの使い方
-
マイナスからプラスへ転じた時...
-
「指定されたキャストは有効で...
-
数字以外が入力されたらエラー...
-
C言語で簡単なパックマンゲーム...
-
比較回数と交換回数表示について
-
C言語での引数の省略方法
-
2÷3などの余りについて
-
4の倍数を論理演算で表す。。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
char型2つを結合し、short型に...
-
C言語でのCSVファイルの読み出...
-
矢印キーを押下してコンソール...
-
【C言語】全角文字の配列を、全...
-
エラーについて質問です。
-
リストの作成と出力(C言語)
-
バイナリファイル(画像)のよみ...
-
[C]セグメンテーションエラー:...
-
WinInetのInternetOpenUrl関数...
-
VC++でSQLへSELECT文を送ったの...
-
受信データから必要な部分のみ...
-
c言語で文書を読み込み、単語の...
-
reallocでエラー
おすすめ情報