WEB开发网
开发学院网络安全黑客技术 利用格式化字符串漏洞对系统发起攻击 阅读

利用格式化字符串漏洞对系统发起攻击

 2007-07-15 16:45:29 来源:WEB开发网   
核心提示: int pos, x = 235, y = 93;printf("%d %n%d", x, &pos, y);printf("The offset was %d", pos);* %n格式返回应该被输出的字符数目,而不是实际输出的字符数目,利用格式化
int pos, x = 235, y = 93; 
   printf("%d %n%d
", x, &pos, y); 
   printf("The offset was %d
", pos);

* %n格式返回应该被输出的字符数目,而不是实际输出的字符数目。当把一个字符串格式化输出到一个定长缓冲区内时,输出字符串可能被截短。不考虑截短的影响,%n格式表示如果不被截短的偏量值(输出字符数目)。为了说明这一点,下面的代码会输出100而不是20:

char buf[20]; 
   int pos, x = 0; 
   snprintf(buf, sizeof buf, "%.100d%n", x, &pos); 
   printf("position: %d
", pos);

简单的例子

除了讨论抽象和复杂的理论,我们将会使用一个具体的例子来说明我们刚才讨论的原理。下面这个简单的程序能满足这个要求:

/* 
   * fmtme.c 
   *    Format a value into a fixed-size buffer 
   */ 
  #include <stdio.h> 
  int 
  main(int argc, char **argv) 
  { 
    char buf[100]; 
    int x; 
    if(argc != 2) 
      exit(1); 
    x = 1; 
    snprintf(buf, sizeof buf, argv[1]); 
    buf[sizeof buf - 1] = 0; 
    printf("buffer (%d): %s
", strlen(buf), buf); 
    printf("x is %d/%#x (@ %p)
", x, x, &x); 
    return 0; 
  }

对这个程序有几点说明:第一,目的很简单:将一个通过命令行传递值格式化输出到一个定长的缓冲区里。并确保缓冲区的大小限制不被突破。在缓冲区格式化后,把它输出。除了把参数格式化,还设置了一个整型值随后输出。这个变量是随后我们攻击的目标。现在值得我们注意的是这个值应该始终为1。

Tags:利用 格式化 字符串

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接