2022年格式化字符串攻击设计实现 .pdf
《2022年格式化字符串攻击设计实现 .pdf》由会员分享,可在线阅读,更多相关《2022年格式化字符串攻击设计实现 .pdf(28页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、西南科技大学本科生毕业论文格式化字符串攻击设计实现摘要:格式化字符串漏洞对计算机系统和网络有很大的威胁,攻击者可以利用格式化字符串漏洞实现远程攻击,比如使程序崩溃,偷窥堆栈内容,甚至还可以修改程序返回地址为恶意代码,从而得到系统控制权。本文首先通过分析在格式化字符串漏洞中常用的格式化字符和格式化参数来详细的说明格式化字符串漏洞形成的原因,然后根据不同的格式化字符串漏洞,编写相应的调试程序,然后针对程序进行模拟攻击,并分析攻击结果。本文主要在模拟环境下实现了使程序崩溃、偷窥堆栈内容和修改程序返回地址的攻击。其次本文还结合现实中的格式化字符串漏洞进行解析,阐述如何利用这些漏洞进行攻击。最后本文还介
2、绍了格式化字符串漏洞的防范工具,包括静态分析软件和动态保护工具。关键词:格式化字符串漏洞;形成原因;攻击;防范工具名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 28 页 -西南科技大学本科生毕业论文Design and Implementation of a format string attack Abstract:Format string vulnerability is a vital threat to computer systems and networks,an attacker could exploit format string vulnerabiliti
3、es for remote attack,such as cause program crashes,peeping stack content,even modify the return address of program to malicious code to get control of the system.Firstly,this paper through the analysis of the common format characters and formatting parameters in the format string vulnerability to de
4、tailed description of the reasons for the formation of the format string vulnerability.Then according to the different format string vulnerabilities,preparation the appropriate debugger,then simulated attacks against the program and analyze the result of the attack.In this paper,in a simulated envir
5、onment to make the program crashes,peeping stack content and modify the program to return address.Furthermore,this article combined with format string vulnerabilities in the reality to parse,explains how to exploit these vulnerabilities to attack.The last,this paper also describes the prevention too
6、l of the format string vulnerability,include static analysis software and dynamic protection tools.Keyword:Format string vulnerability,Formation,Attack,Prevention tools 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 28 页 -西南科技大学本科生毕业论文目录第 1 章 绪论.1 1.1 课题背景 .1 1.2 课题研究意义 .1 第 2 章 格式化字符串漏洞形成原理.2 2.1 格式化字符串漏洞基本原理.2 2.
7、2 格式化函数 .2 2.3 printf 函数的一般格式 .2 2.4 格式化规定符 .4 2.5 堆栈.5 2.6 本章小结 .5 第 3 章 格式化字符串攻击方法及实现.6 3.1 使程序崩溃 .6 3.2 偷窥堆栈内容 .7 3.3 修改程序返回地址 .10 3.4 地址偏移量的确定 .16 3.5 格式化字符串漏洞实例 .17 3.5.1 漏洞描述 .17 3.5.2 漏洞利用 .19 3.6 本章小结 .20 第 4 章 防范工具 .21 4.1 静态分析软件 .21 4.2 动态保护工具 .22 结论.23 致谢.24 参考文献 .25 名师资料总结-精品资料欢迎下载-名师精心整
8、理-第 3 页,共 28 页 -西南科技大学本科生毕业论文1 第 1 章绪论1.1 课题背景随着现代科技的不断发展,计算机技术的应用已经深入到社会的各个领域。它在给我们的生活带来了极大便利的同时,也潜伏着危险。1999年,Tymm Twillman 发现了第一个格式化字符串漏洞。2000年,tf8 在 BugTraq上发布的 wu-ftpd 中的格式化字符串漏洞使得该漏洞广为人知。之后,众多的格式化字符串漏洞被发现。虽然已经过去了很多年,但是新的格式化字符串漏洞仍在不断被发现。根据中国国家信息安全漏洞库网站上的信息来看,从2000 年 1 月到 2012 年 5月,总共有 50721 个漏洞被
9、发现,其中只有 202 个格式化字符串漏洞,占总共漏洞的0.4%,所以格式化字符串漏洞其实并不常见。格式化函数是一系列的ANSIC 函数,它们可以接受可变数量的参数,其中一个称为格式化字符串参数(format string)。格式化函数对输入的格式化字符串参数进行解释,根据该参数的要求使用其它的输入参数,形成输出的字符串。格式化字符串函数几乎被用在所有的C 程序中,用来输出、打印信息或处理字符串。正因为这些函数使用的广泛性,他们的漏洞对系统的安全有重要影响。攻击者利用格式化字符串漏洞可以获得系统的控制权,这一点对于高可信软件和服务控件来说是致命的1。1.2 课题研究意义通过对该课题的研究,能让
10、我掌握如何利用由于格式化函数的微妙程序设计错误造成的安全的漏洞,以及其丰富的格式化语言函数来输入经过精心编制的含有格式化指令的文本字符串来达到使程序崩溃,查看堆栈内容和修改程序返回地址的目的2。注入恶意格式化串可以导致系统程序读取非可读地址的数据,进而使程序发生段错误,使程序崩溃3;通过为 printf 函数提供多余自身要求的参数来使程序输出堆栈内本不应该输出的内容,从而达到偷窥堆栈内存的目的;%n 参数可以把已经打印的字节数量存入到一个我们指定的参数内,该参数的地址作为格式化字符串函数的参数存放在栈上,通过精心设计要输入的字节数目来达到修改栈内返回地址为攻击代码地址,从而达到控制程序的目的。
11、名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 28 页 -西南科技大学本科生毕业论文2 第 2 章 格式化字符串漏洞形成原理2.1 格式化字符串漏洞基本原理格式化字符串漏洞其实是由于程序员的不规范操作造成的,在该指定输出格式的时候没有进行指定4。例如要将变量“x”以字符串的格式输出,规范的格式应该是这样:printf(%s,x),但是程序员可能因为懒惰就忽略了它的格式化字符串,直接写成:printf(x)。编译的时候是可以通过的。但就是这样的一个疏忽,如果这个变量“x”是由外部提供的话,就为这个程序留下了格式化字符串漏洞9。攻击者可以通过输入精心编制的含有格式化指令的文本字符串
12、来达到使程序崩溃、偷窥程序内容甚至是取得程序控制权的目的。下面介绍一下格式化字符串攻击中常用的一些函数和参数。2.2 格式化函数C 语言中常用到的格式化输出函数,如表2-1 所示:表 2-1 格式化输出函数2.3 printf 函数的一般格式printf 函数的一般格式为printf(格式控制,输出列表)函数特性Fprintf 将格式化的数据打印至文件Printf 将格式化的数据打印至标注输出“stdout”Sprintf 将格式化的数据存储到缓存中Snprintf 将指定长度的格式化数据存储到缓存中Vfprintf 将 va_arg 结构中的格式化数据打印到文件Vprintf 将结构中的格式
13、化数据打印到标准输出“stdout”Vsprintf 将结构中的格式化数据存储到缓存中Vsnprintf 将结构中的格式化数据存储到缓存中名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 28 页 -西南科技大学本科生毕业论文3 例如:printf(%d,%cn,i,c)括号内包含两部分:(1)“格式控制”是用双撇号括起来的一个字符串,称“转换控制字符串”,简称为“格式字符串”5。它包括两个信息:格式声明。格式声明由“%”和格式字符组成,如%d、%f 等。它的作用是将输出的数据转换为指定的格式然后输出。格式声明总是由“%”字符开始的。普通字符。普通字符即需要在输出是原样输出的字符。
14、例如上面printf 函数中的双撇号内的逗号、空格和换行符,也可以包括其他字符。(2)“输出列表”是程序需要输出的一些数据,可以是常量、变量或表达式。下面是 printf 函数的具体例子:printf(%d%dn,a,b)printf(a=%db=%dn,a,b)在第二个 printf 函数中的双撇号内的字符,除了两个“%d”以外,还有非格式声明的普通字符(如 a=,b=和n),它们全部按原样输出。如果 a 和 b 的值分别为 3 和 4,则输出为:a=3 b=4 执行“n”使输出控制移到下一行开头,从显示屏幕上可以看到光标已移到下一行开头。上面输出结果中有下划线的字符是printf 函数中的
15、“格式控制字符串”中的普通字符按原样输出的结果。3 和 4 是 a 和 b 的值(注意 3 和 4 这两个数字前和后都没有外加空格),其数字位数由a和 b 的值而定。加入a=12,b=123,则输出结果为:a=12 b=123 由于 printf 是函数,因此,“格式控制字符串”和“输出列表”实际上都是函数的参数。printf 函数的一般形式可以表示为:printf(参数 1,参数 2,参数 3,参数 n)参数 1 是格式控制字符串,参数 2参数 n 是需要输出的数据。执行 printf 函数时,将参数 2参数 n 按参数 1 所指定的格式进行输出。参数1 是必须有的,参数2参数n 是可选的。
16、名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 28 页 -西南科技大学本科生毕业论文4 2.4 格式化规定符printf 格式字符及附加格式说明符6分别如表 2-1 和 2-2 所示:表 2-2 printf 格式字符表 2-3 printf 的附加格式说明符字符说明l用于长整型整数,可加在格式符d、o、x、u 前面m(代表一个正整数)数据最小宽度n(代表一个正整数)对实数,表示输出n 位小数;对字符串,表示截取的字符个数输出的数字或字符在域内向左靠【说明】(1)printf 函数输出时,务必注意输出对象的类型应与上述格式说明匹配,否则将会出现错误。出科 X,E,G 外,其他格
17、式字符必须用小写字母,如%d 不能写成%D。格式字符说明d,i 以带符号的十进制形式输出整数(正数不输出符号)o 以八进制无符号形式输出整数(不输出前导符0)x,X 以十六进制无符号形式输出整数(不输出前导符0 x),用 x 则输出十六进制数的af 时以小写形式输出。用 X 时,则以大写字母输出u 以无符号十进制形式输出整数c 以字符形式输出,只输出一个字符s 输出字符串f 以小数形式输出单双精度数,隐含输出6 位小数e,E 以指数形式输出实数,用e 时指数以“e”表示(如1.2e+0.2),用 E 时指数以 E 表示如(1.2E+0.2)g,G 选用%f 或%e 格式中输出宽度较短的一种格式
18、,不输出无意义的 0,用 G 时,若以指数形式输出,则指数以大写表示名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 28 页 -西南科技大学本科生毕业论文5(2)可以在 printf 函数中的“格式控制字符串”内包含转义字符,如“n”,“t”,“b”,“r”,“f”和“377”等。(3)表中所列出的字母d,o,x,u,c,s,f,e,g,X,E 和 G 等,如用在“格式声明”中就作为格式字符。一个格式声明以“%”开头,以上述 12 个格式字符之一为结束,中间可以插入附加格式字符(也称修饰符)。例如:Printf(c=%cf=%fs=%s,c,f,s);(4)如果想输出字符“%”,
19、应该在“格式控制字符串”用连续两个“%”表示,如:Printf(%f%n,1,0/3);输出:0.333333%实现了输出“%”符号。2.5 堆栈一个程序的动态数据通过一块叫做堆栈的区域来存放。堆栈处于内存的高端,它具有后进先出的特性。当程序发生调用时,计算机做如此啊操作:首先把参数压入堆栈;然后保存指令寄存器(eip)中的内容作为返回地址(ret);再把基址寄存器(ebp)压入堆栈;随后将当前的栈指针(esp)拷贝到 ebp作为新的基地址;最后为本地变量留出一定空间,同时将 esp减去适当的数值7。普通的缓存区溢出就是利用了堆栈生长方向和数据存储方向相反的特点8,用后存入的数据覆盖先前压栈的
20、数据。一般是覆盖返回地址,从而改变程序的流程,这样,子函数返回时就跳到了攻击者指定的地址,就可以按照攻击者的意愿做任何事情了。格式化字符串漏洞和普通的缓存区溢出有相似之处,但又有所不同,他们都是利用了程序员的疏忽大意来改变程序的正常流程的。2.6 本章小结本章首先详细的分析了格式化字符串漏洞形成的原理,然后又介绍了格式化漏洞攻击中常用到的格式化字符和格式化参数,其中重点介绍了 printf 函数的格式化字符。名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 28 页 -西南科技大学本科生毕业论文6 第 3 章 格式化字符串攻击方法及实现3.1 使程序崩溃使程序崩溃主要用到“%s”这
21、个格式化规定字符,“%s”的作用是规定将变量为字符串的形式,但是不正常的使用会使程序读取不可读取地址里的内容,从而导致程序意外中断17。假设有如下一段代码3-1:代码3-1#include#include void main(int argc,char*argv)int count=1;while(argc 1)printf(argvcount);printf();count+;argc-;这段程序的作用是将输入的数逐个输出,但是这个程序存在一个格式化字符串漏洞,因为在这段代码“printf(argvcount)”中,缺少了一个指定以字符串格式输出的格式化规定符“%s”。如果输入的值是“ab
22、cd ef”,输出如图 3-1:名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 28 页 -西南科技大学本科生毕业论文7 图 3-1 输入“ab cd ef”得到的正确结果结果是正常的,但是如果输入的是“%s”,结果却是如下图3-2:图 3-2 程序崩溃结果该程序在试图读取不可读取地址“0 xbc73e708”的内容,所以出现了要强制终止程序的结果。但是如果将“printf(argvcount)”修改为“printf(%s,argvcount)”后,我们再次输入“%s”,结果如图 3-3 所示:图 3-3 修改后输出“%s”的正确结果此时可以看到程序正常的输出了字符串“%s”。使
23、程序崩溃的原理很简单,就是输入了特殊的字符“%s”让程序去读取受保护的地址内容,从而让程序意外中断。但是要达到使程序崩溃的目的,必须要满足两个条件,第一个条件就是这个程序必须存在这样的一个格式化字符串漏洞,第二个条件就是存在格式化字符串漏洞的这个变量必须由我们外部输入。只要满足了这两个条件,就可以达到使程序崩溃的目的。3.2 偷窥堆栈内容偷窥堆栈内容我们主要用到“%x”这个格式化规定字符,这个字符的本来作用是名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 28 页 -西南科技大学本科生毕业论文8 规定变量的格式为无符号十六进制的格式18。但是在某些时候,它却可以读取堆栈中的 3
24、2 个字节的内容并以十六进制的形式输出,堆栈中有很多重要的信息,比如返回地址,是不因该被用户知道的,但是通过攻击却可以得到这些重要的内容。假设有如下程序代码 3-2:这个程序的本来作用是将输入的一系列数的第一个数进行输出,但是这个程序也存在一个格式化字符串漏洞。就在这段代码中“printf(buff)”,因为它没有一个格式化规定符来规定变量“buff”以什么样的格式进行输出,而程序默认的是以字符串的格式进行输出,假如输入的是“AAAA DDDD”,则输出结果如图3-4 所示:图 3-4 输入“AAAA DDDD”得到的正确结果代码 3-2#include#include void functi
25、on(char*string)char buff256;memset(buff,0,sizeof(buff);strncpy(buff,string,sizeof(buff)-1);printf(buff);int main(int argic,char*argiv)function(argv1);return(0);名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 28 页 -西南科技大学本科生毕业论文9 结果是正确的,但是如果当输入的是“AAAA%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x”的时候(这里有 25 个“%x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年格式化字符串攻击设计实现 2022 格式化 字符串 攻击 设计 实现
限制150内