利用格式化字符串漏洞对系统发起攻击
2007-07-15 16:45:29 来源:WEB开发网核心提示: 本文中所有的例子都是在x86 BSD/OS 4.1机器上完成,如果你到莫桑比克执行任务超过20年时间可能会对x86不熟悉,利用格式化字符串漏洞对系统发起攻击(3),这是一个little-endian机器,这决定在例子中多精度数字的表示方法,程序还告诉我们变量x的值是1(以十进制和十六进制分
本文中所有的例子都是在x86 BSD/OS 4.1机器上完成。如果你到莫桑比克执行任务超过20年时间可能会对x86不熟悉,这是一个little-endian机器。这决定在例子中多精度数字的表示方法。在这里使用的具体数值会因为系统的差异而不同,这些差异表现在不同体系结构、操作系统、环境甚至是命令行长度。经过简单调整,这些例子可以在其他x86平台上工作。通过努力也可以在其他体系结构的平台上工作。
用Format攻击
现在是我们戴上黑帽子开始以攻击者方式思考问题的时候了。我们现在手头有一个测试程序。知道这个程序有一个漏洞并且了解程序员是在哪里犯错误的(直接把用户输入的命令行参数作为snprintf的格式化参数)。我们还拥有关于printf函数深入的知识,知道如何运用这些知识。让我们开始修补我们的程序吧。
从简单的开始,我们通过简单的参数调用程序。看这儿:
% ./fmtme "hello world"
buffer (11): hello world
x is 1/0x1 (@ 0x804745c)
现在这儿还没有什么特别的事情发生。程序把我们输入的字符串格式化输出到缓冲区里,然后打印出它的长度和数值。程序还告诉我们变量x的值是1(以十进制和十六进制分别显示),x的存储地址是0x804745c。接下来我们试着使用一些格式指令。在下面的例子中我们打印出在格式化字符串之上栈堆中的整型数值:
% ./fmtme "%x %x %x %x"
buffer (15): 1 f31 1031 3133
x is 1/0x1 (@ 0x804745c)
对这个程序的快速分析可以揭示在调用snprintf函数时程序堆栈的规划:Address Contents Description
fp+8 Buffer pointer 4-byte address
fp+12 Buffer length 4-byte integer
fp+16 &n
更多精彩
赞助商链接