在X86结构下,格式化字符串的参数通过栈传递,根据cdecl的调用约定,在进入printf函数前,程序将参数从右往左依次压栈;进入printf函数之后,函数会解析第一个参数(格式化字符串),一次读取一个字符,如果字符不是"%",那么字符会被直接复制到输出。否则会读取下一个非空字符,获取相应的参数并解析输出 正常调用printf函数 当...
1.4 格式化字符串的漏洞影响 在最好的情况下,栈值可能包含一个随机的十六进制数字,而格式化字符串可能会将其解释为一个越界的地址,从而导致进程出现段错误。这可以被攻击者利用实施拒绝服务攻击。最坏的情况下,攻击者能够利用这个漏洞来读取任意数据和向任意地址写入数据。1.5 漏洞演示 /* fmttest.c */#inclu...
格式化字符串是一种很常见的漏洞,其产生根源是printf函数设计的缺陷,即printf()函数并不能确定数据参数arg1,arg2…究竟在什么地方结束,也就是说,它不知道参数的个数。它只会根据format中的打印格式的数目依次打印堆栈中参数format后面地址的内容格式字符串漏洞发生的条件就是格式字符串要求的参数和实际提供的参数不匹配。
%[标志][输出最小宽度][.精度][长度]类型,其中跟格式化字符串漏洞有关系的主要有以下几点:1、输出最小宽度:用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。2、类型:d 表示输出十进制整数*s 从内存中读取字符串*x 输出十六进制数*n ...
在网上找学习格式化字符串漏洞的材料,大多数是 Linux 系统的,分享一下在 Windows 系统上学习格式化字符串漏洞的记录。 环境配置 01 ◆操作系统:Windows XP SP1 ◆编译器:VC6.0 ◆调试器:Immunity Debugger ◆漏洞利用脚本语言:Python 2.7.1 编译测试程序 ...
格式化字符串漏洞的形成原因在于printf/fprintf/vsprintf等格式化字符串打印函数在接受可变参数时,因码农自己偷懒写,编写的形式不正确而形成的漏洞。当然,这是比较诙谐的说法。 真正形成的原因是,当初创建printf函数的这批人没有让printf去检测格式化字符串的占位符个数与参数个数是否相等。只要在执行printf时,每读取到一...
在现代操作系统中,存在一些内存保护机制可以帮助防范格式化字符串漏洞的利用。比如,地址空间布局随机化(ASLR)可以随机化程序的内存布局,使攻击者更难以确定目标内存地址。另外,数据执行保护(DEP)可以防止程序执行非法的指令,从而减少格式化字符串漏洞的危害。安全编程实践 采用安全的编程实践可以帮助开发人员更好地...
格式化字符串函数可以接受可变数量的参数,并将第一个参数作为格式化字符串,根据它来解析后面的参数。简单来说格式化字符串的漏洞就是格式字符串要求的参数和实际提供的参数不匹配。我们以x86结构下的例子说明。 在X86结构下,格式化字符串的参数是通过栈传递的,先看一个我们常见的C语言编写的程序代码。
按照规定,"%s %d %s"这一串格式化字符串,会被一个一个字符读取,读到%匹配参数,并输出。所以结果如下root@ubuntu20:~/fmt# ./demo Hello World! 233 以上是正常的操作方式,如果我们在参数不变的情况下对格式化字符串进行修改,那么便会造成漏洞在%s %d %s之后加上%x %x %x %3$s,如下...
对于格式化字符串漏洞的利用主要有:使程序崩溃、栈数据泄露、任意地址内存泄露、栈数据覆盖、任意地址内存覆盖。使程序崩溃 格式化字符串漏洞通常要在程序崩溃时才会被发现,这也是最简单的利用方式。在Linux中,存取无效的指针会使进程收到SIGSEGV信号,从而使程序非正常终止并产生核心转储,其中存储了程序崩溃时的许多...