一 漏洞简介
格式化字符串漏洞(format string vulnerability),也是一种比较常见的漏洞类型。常出现于c语言格式化字符串一系列函数。比如printf,sprintf,fprintf等一系列家族函数。由于此函数对参数类型和个数过滤不严格,导致用户可以构造
任意数据,实现读取写入内存数据,从而实现代码执行。
二 原理分析
至于为什么会产生字符串溢出漏洞呢,我们来看看产生溢出的关键函数。比如说
_Check_return_opt_ _CRTIMP int __cdecl printf(_In_z_ _Printf_format_string_ const char *_Format, ...);
这个输出控制字符串函数。解释一下参数:
Format是个格式化控制字符串,里面控制这个字符串输出的格式。
常见格式控制如下列表
...省略号代表是用户可以控制的参数类型和列表。
关键就在于这个位置,参数类型和数量的不确定性,如果允许用户自己定义这两个参数。
那么就可以经过精心够早实现对程序任意位置的数据读取和写入,那么就能构造出漏洞
利用程序,从而控制我们的程序流程。
涉及的关键控制符
%n功能
是将%n之前printf已经打印的字符个数赋值给传入的指针。通过%n我们就可以修改内存中
的值了。例如: printf("aaaaaaa%n\n",&a);
printf("%d\n",a);
可以发现a的值被printf函数修改为了7。这就是%n的功效了。这是一个不常用到的参数.
它的功能是将%n之前printf已经打印的字符个数赋值给传入的指针。通过%n我们就可以</