《黑客攻防-系统实战》--格式化串漏洞
这个也是比较经典的问题,在这里需要多花点时间研究透彻。出现格式化串漏洞的原因是在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\n"); 15 printf("=====================\n"); 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 \n", c, c); 27 break; 28 default: 29 printf(" %03d %02x %c \n", 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\n"); 15 return 1; 16 } 17 18 printf(argv[1]); 19 printf("\n"); 20 21 return 0; 22 }
执行
1 ./test "%x %x %x %x" 2 94481678 94481690 0 5cf87e80
待续.....