由4.2.3的实验可知这三个功能是可以实现的,由于00可以系统自动改,因此不需要再用printf函数(自己上机尝试即可知道),因此地址成功改写。
4.3.6实验结果
编译运行,得到界面:如图
图3.10-程序的开始执行结果
在该界面弹出不到1s后出现界面:
图3.11-程序的其后的执行结果-弹出cmd框
说明进入了cmd窗口:输入ipconfig
图3.12-使用cmd的ipconfig命令
因此实验成功!
4.4攻击之二—使缓冲区溢出
可以使程序崩溃是最为简单的方式:
16
图4.1-程序E代码
本来执行第一条sprintf语句时buffer1没有溢出,内容为:“ERR Wrong command:Q2dmyshellcode”,\表面上看很短,它也的确不会溢出buffer1 ,但它利用了sprintf对格式化字符串\的解释。所以在第二个sprintf中,buffer2将被溢出。而main 函数的返回地址与buffer2相邻,随着buffer2被溢出,该返回地址也被改写了。由于被溢出改写的返回地址不位于有效的地址空间内,所以出现段溢出。
图4.2-程序的执行结果
格式化字符串函数对可变数量参数的使用方式依赖于其中的格式化字符串参数。如果格式化字符串参数可以由用户输入中取得,那么攻击者就可以构造各种类型的参数。其目的是通过这些参数对格式化字符串函数进行滥用,从而最终达到攻击系统的目的。
五、结论或总结
一、经验
1、在此次实验中我更加清晰地了解到了格式化字符串漏洞的成因和利用,更加清楚地了解了printf函数的执行过程和整体PE文件的工作和组织形式。
在此总结一下:通过格式化字符串,我们可以控制什么? 1、导致程序崩溃 2、查看堆栈 3、写内存
2、植入shellcode的过程:
①编写一定功能shellcode,并将其以二进制代码的字符数组形式存放在内存。 ②写一段程序,涉及到子函数的调用。
③获得我们编写的shellcode存放的内存地址
④找到在函数调用中存放函数返回地址的内存地址。
⑤利用printf函数将④步中找到的地址内容改为第③中获得的地址。
17
除了植入shellcode的修改返回地址的攻击方式外还有前面攻击原理提到的许多方法,还有待进更进一步探究。
二、教训
做此次实验花费了整整2周的时间,倒不是花在这个格式化字符串漏洞的时间很多,关键是一直主题不明确,因为选了一个主题,不清楚自己能不能成功,遇到瓶颈之后就会踌躇不前,最后纠结久后就无奈放弃!我先后尝试做了冒名邮件的实验,可以用VC发送任意多封邮件,发送邮件的服务器是163 smtp服务器,可惜不能冒名发送,后来想过是不是邮件服务防火墙问题,于是开始自己架设邮件服务器,还申请了免费域名,可惜没有成功,之后也选择了很多主题,每一个都是遇到瓶颈之后求助无果,无奈放弃。幸而最终还是确定好了格式化漏洞的主题,开始没有打算攻击的,只求原理,没想到一篇好文章《格式化字符串漏洞研究》中提及的漏洞利用方法让我想到了shellcode的植入和它说提到的方法的相似性,于是尝试着走走,竟然很轻松地就成功了,世上无难事,只怕有心人啊!
六、参考文献
1、《缓冲区溢出实验指导手册2010》- pdf 张爱芳老师制作 2、《0+DAY安全:软件漏洞分析技术》-电子工业出版社 3、《格式化字符串漏洞研究》-pdf 清华大学计算机系的杜旭涛、邢春晓、周立柱三人制作。(该资料给了我很多启发和思路) 4、《黑客防线2010年12月刊》
18