格式化字符串攻击.docx

格式化字符串攻击.docx

ID:57578793

大小:16.91 KB

页数:8页

时间:2020-08-27

格式化字符串攻击.docx_第1页
格式化字符串攻击.docx_第2页
格式化字符串攻击.docx_第3页
格式化字符串攻击.docx_第4页
格式化字符串攻击.docx_第5页
资源描述:

《格式化字符串攻击.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、格式化字符串攻击格式化字符串漏洞同其他许多安全漏洞一样是由于程序员的懒惰造成的。当你正在阅读本文的时候,也许有个程序员正在编写代码,他的任务是:打印输出一个字符串或者把这个串拷贝到某缓冲区内。他可以写出如下的代码:  printf("%s",str);  但是为了节约时间和提高效率,并在源码中少输入6个字节,他会这样写:  printf(str);  为什么不呢?干嘛要和多余的printf参数打交道,干嘛要花时间分解那些愚蠢的格式?printf的第一个参数无论如何都会输出的!程序员在不知不觉中打开了一个安全漏洞,可以让攻击者控制程序的执

2、行,这就是不能偷懒的原因所在。  为什么程序员写的是错误的呢?他传入了一个他想要逐字打印的字符串。实际上该字符串被printf函数解释为一个格式化字符串(formatstring)。函数在其中寻找特殊的格式字符比如"%d"。如果碰到格式字符,一个变量的参数值就从堆栈中取出。很明显,攻击者至少可以通过打印出堆栈中的这些值来偷看程序的内存。但是有些事情就不那么明显了,这个简单的错误允许向运行中程序的内存里写入任意值。  Printf-学校忘记教给你的东西  在说明如何为了自己的目的滥用printf之前,我们应该深入领会printf提供的特性

3、。假定读者以前用过printf函数并且知道普通的格式化特性,比如如何打印整型和字符串,如何指定最大和最小字符串宽度等。除了这些普通的特性之外,还有一些深奥和鲜为人知的特性。在这些特性当中,下面介绍的对我们比较有用:  *在格式化字符串中任何位置都可以得到输出字符的个数。当在格式化字符串中碰到"%n"的时候,在%n域之前输出的字符个数会保存到下一个参数里。例如,为了获取在两个格式化的数字之间空间的偏量:  intpos,x=235,y=93;  printf("%d%n%d",x,&pos,y);  printf("Theoffset

4、was%d",pos);  *%n格式返回应该被输出的字符数目,而不是实际输出的字符数目。当把一个字符串格式化输出到一个定长缓冲区内时,输出字符串可能被截短。不考虑截短的影响,%n格式表示如果不被截短的偏量值(输出字符数目)。为了说明这一点,下面的代码会输出100而不是20:  charbuf[20];  intpos,x=0;  snprintf(buf,sizeofbuf,"%.100d%n",x,&pos);  printf("position:%d",pos);  简单的例子  除了讨论抽象和复杂的理论,我们将会使用一个

5、具体的例子来说明我们刚才讨论的原理。  下面这个简单的程序能满足这个要求:  /*  *fmtme.c  *Formatavalueintoafixed-sizebuffer  */  #include  int  main(intargc,char**argv)  {  charbuf[100];  intx;  if(argc!=2)  exit(1);  x=1;  snprintf(buf,sizeofbuf,argv[1]);  buf[sizeofbuf-1]=0;  printf("buffer(%d):%s",str

6、len(buf),buf);  printf("xis%d/%#x(@%p)",x,x,&x);  return0;  }  对这个程序有几点说明:第一,目的很简单:将一个通过命令行传递值格式化输出到一个定长的缓冲区里。并确保缓冲区的大小限制不被突破。在缓冲区格式化后,把它输出。除了把参数格式化,还设置了一个整型值随后输出。这个变量是随后我们攻击的目标。现在值得我们注意的是这个值应该始终为1。  本文中所有的例子都是在x86BSD/OS  4.1机器上完成。如果你到莫桑比克执行任务超过20年时间可能会对x86不熟悉,这是一个litt

7、le-endian机器。这决定在例子中多精度数字的表示方法。在这里使用的具体数值会因为系统的差异而不同,这些差异表现在不同体系结构、操作系统、环境甚至是命令行长度。经过简单调整,这些例子可以在其他x86平台上工作。通过努力也可以在其他体系结构的平台上工作。  来格式化吧!(FormatMe!)  现在是我们戴上黑帽子开始以攻击者方式思考问题的时候了。我们现在手头有一个测试程序。知道这个程序有一个漏洞并且了解程序员是在哪里犯错误的(直接把用户输入的命令行参数作为snprintf的格式化参数)。我们还拥有关于printf函数深入的知识,知道

8、如何运用这些知识。让我们开始修补我们的程序吧。  从简单的开始,我们通过简单的参数调用程序。看这儿:  %./fmtme"helloworld"  buffer(11):helloworld  xis1/0

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。