バッファオーバーランの危険性検出について
下に示す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 }