zoukankan      html  css  js  c++  java
  • 《黑客攻防-系统实战》--格式化串漏洞

      这个也是比较经典的问题,在这里需要多花点时间研究透彻。出现格式化串漏洞的原因是在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

    待续.....

  • 相关阅读:
    java初学者之java语言主要知识点三
    C++类的对象和类的指针的区别
    win32多线程: 线程创建与结束等待
    多线程学习:win32多线程编程基本概念(转)
    C++常用数据类型和Windows常见数据类型
    VC++2017关于项目出现"const char *" 类型的实参与 "char *" 类型的形参不兼容错误的解决方法
    Linux环境下vi/vim编辑器常用命令
    c++学习笔记之类模板
    c++学习笔记之函数重载和模板理解
    c++学习笔记之多态和虚函数
  • 原文地址:https://www.cnblogs.com/mysky007/p/11135922.html
Copyright © 2011-2022 走看看