《黑客攻防-系统实战》--格式化串漏洞

  这个也是比较经典的问题,在这里需要多花点时间研究透彻。出现格式化串漏洞的原因是在C语言中没有处理带有可变参数的函数。因为用C语言编写的程序都可能有格式化串的漏洞,所以它影响所有的带C编译器的操作系统

  一. 什么是格式化串?为什么用格式化串

  举个简单的栗子,我们在写程序的时候会输出字符串,里面包含数字还有字符,为了方便组装成字符串,就将字符串格式化输出

 1 /*************************************************************************
 2     > File Name: test.c
 3     > Author: fly
 4     > Mail:fly@163.com 
 5     > Created Time: 2019年07月04日 22时46分44秒
 6  ************************************************************************/
 7 
 8 #include<stdio.h>
 9 #include<stdlib.h>
10 int main()
11 {
12     int c;
13 
14     printf("Decimal Hex Character
");
15     printf("=====================
");
16 
17     for (c = 0x20; c < 256; c++)
18     {
19         switch(c)
20         {
21             case 0x0a:
22             case 0x0b:
23             case 0x0c:
24             case 0x0d:
25             case 0x1b:
26                 printf(" %03d %02x 
", c, c);
27                 break;
28             default:
29                 printf(" %03d %02x %c 
", c, c, c);
30                 break;
31         }
32     }
33     return 1;
34 }


运行结果:

 1 Decimal Hex Character
 2 =====================
 3  032 20   
 4  033 21 ! 
 5  034 22 " 
 6  035 23 # 
 7  036 24 $ 
 8  037 25 % 
 9  038 26 & 
10  039 27 ' 
11  040 28 ( 
12  041 29 ) 
13  042 2a * 
14  043 2b + 
15  044 2c , 
16  045 2d - 
17  046 2e . 
18  047 2f / 
19  048 30 0 
20  049 31 1 
21  050 32 2 
22  051 33 3 
23  052 34 4 
24  053 35 5 
25  054 36 6 
26  055 37 7 
27  056 38 8 
28  057 39 9 
29  058 3a : 
30  059 3b ; 
31  060 3c < 
32  061 3d = 
33  062 3e > 
34  063 3f ? 
35  064 40 @ 
36  065 41 A 
37  066 42 B 
38  067 43 C 
39  068 44 D 
40  069 45 E 
41  070 46 F 
42  071 47 G 
43  072 48 H 
44  073 49 I 
45  074 4a J 
46  075 4b K 
47  076 4c L 
48  077 4d M 
49  078 4e N 
50  079 4f O 
51  080 50 P 
52  081 51 Q 
53  082 52 R 
54  083 53 S 
55  084 54 T 
56  085 55 U 
57  086 56 V 
58  087 57 W 
59  088 58 X 
60  089 59 Y 
61  090 5a Z 
62  091 5b [ 
63  092 5c  
64  093 5d ] 
65  094 5e ^ 
66  095 5f _ 
67  096 60 ` 
68  097 61 a 
69  098 62 b 
70  099 63 c 
71  100 64 d 
72  101 65 e 
73  102 66 f 
74  103 67 g 
75  104 68 h 
76  105 69 i 
77  106 6a j 
78  107 6b k 
79  108 6c l 
80  109 6d m 
81  110 6e n 
82  111 6f o 
83  112 70 p 
84  113 71 q 
85  114 72 r 
86  115 73 s 
87  116 74 t 
88  117 75 u 
89  118 76 v 
90  119 77 w 
91  120 78 x 
92  121 79 y 
93  122 7a z 
94  123 7b { 
95  124 7c | 
96  125 7d } 
97  126 7e ~ 
98  127 7f  
99  128 80

  二.  什么是格式化漏洞

  攻击者提交许多格式的字符,栈上就没有和格式符相对应的参数,系统用栈上其他数据代替这些参数,从而导致信息泄漏和执行任意代码

 1 /*************************************************************************
 2     > File Name: test.c
 3     > Author: fly
 4     > Mail:fly@163.com 
 5     > Created Time: 2019年07月04日 22时46分44秒
 6  ************************************************************************/
 7 
 8 #include<stdio.h>
 9 #include<stdlib.h>
10 int main(int argc, char *argv[])
11 {
12     if (argc != 2)
13     {
14         printf("Error - supply a format string please
");
15         return 1;
16     }
17 
18     printf(argv[1]);
19     printf("
");
20 
21     return 0;
22 }

执行

1 ./test "%x %x %x %x"
2 94481678 94481690 0 5cf87e80

待续.....

原文地址:https://www.cnblogs.com/mysky007/p/11135922.html