質問するログイン新規登録

回答編集履歴

3

推敲

2019/07/24 19:45

投稿

set0gut1
set0gut1

スコア2413

answer CHANGED
@@ -25,7 +25,6 @@
25
25
  ```
26
26
 
27
27
  上のコードではbarにstrcpyした文字列が入り切らないためfooまで侵食してて挙動が壊れてます。
28
- こういうのが脆弱性を生むことがあるので怖いです。
29
28
 
30
29
  質問者さんの遭遇した状況でいうと
31
30
 

2

推敲

2019/07/24 19:45

投稿

set0gut1
set0gut1

スコア2413

answer CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  このときにbirdの末尾のヌル文字がcatの0文字目を侵食して、空文字列として認識されるようになっているという挙動です。
38
38
 
39
- tmpをchar*型変数にして
39
+ 質問者さんのコードへの変更としては、tmpをchar*型変数にして
40
40
 
41
41
  ```
42
42
  char str[100], *ch, *s[1000], *tmp;

1

推敲

2019/07/24 19:29

投稿

set0gut1
set0gut1

スコア2413

answer CHANGED
@@ -1,31 +1,31 @@
1
1
  strcpyのオーバーフローですね。
2
+
2
3
  再現コード
3
4
 
4
5
  ```c
5
6
  #include <stdio.h>
6
7
  #include <string.h>
7
- #include <stdlib.h>
8
8
 
9
9
  int main(void){
10
- char foo[] = "foo";
10
+ char foo[] = "foo"; // メモリ上の連続した領域に何個か作る
11
11
  char bar[] = "bar";
12
12
  char baz[] = "baz";
13
- char *s[] = { foo, bar, baz };
14
- char onetwothree[] = "123456789";
13
+ char xxx[] = "123456";
15
- strcpy(s[1], onetwothree);
14
+ strcpy(bar, xxx);
16
- printf("0: %s\n1: %s\n2: %s\n", s[0], s[1], s[2]);
15
+ printf("foo: %s\nbar: %s\nbaz: %s\n", foo, bar, baz);
17
16
  return 0;
18
17
  }
19
18
  ```
20
19
 
21
20
  出力
22
21
  ```
23
- 0: 56789
22
+ foo: 56
24
- 1: 123456789
23
+ bar: 123456
25
- 2: baz
24
+ baz: baz
26
25
  ```
27
26
 
28
- 上のコードでは s[1] strcpy した文字列が入り切らないため s[0] まで(更にその外側まで)侵食してて挙動が壊れてます。
27
+ 上のコードではbarにstrcpyした文字列が入り切らないためfooまで侵食してて挙動が壊れてます。
28
+ こういうのが脆弱性を生むことがあるので怖いです。
29
29
 
30
30
  質問者さんの遭遇した状況でいうと
31
31
 
@@ -34,12 +34,12 @@
34
34
  >
35
35
  > dog
36
36
 
37
- このときに bird の末尾のヌル文字が cat の0文字目を侵食して、空文字列として認識されるようになっているという挙動です。
37
+ このときにbirdの末尾のヌル文字がcatの0文字目を侵食して、空文字列として認識されるようになっているという挙動です。
38
38
 
39
- tmpをポインタ型にして
39
+ tmpをchar*変数にして
40
40
 
41
41
  ```
42
- *tmp="unkooooooo";
42
+ char str[100], *ch, *s[1000], *tmp;
43
43
  ```
44
44
 
45
45
  スワップをstrcpyではなくポインタの代入で済ませれば
@@ -50,5 +50,4 @@
50
50
  s[j] = tmp;
51
51
  ```
52
52
 
53
- この課題については正しい出力をするようになります。
53
+ この課題については正しい出力をするようになります。
54
- こういうのが脆弱性の元になるので怖いですね。