windows平台下的格式化字符串漏洞利用技术

windows平台下的格式化字符串漏洞利用技术

ID:14262341

大小:709.00 KB

页数:18页

时间:2018-07-27

windows平台下的格式化字符串漏洞利用技术_第1页
windows平台下的格式化字符串漏洞利用技术_第2页
windows平台下的格式化字符串漏洞利用技术_第3页
windows平台下的格式化字符串漏洞利用技术_第4页
windows平台下的格式化字符串漏洞利用技术_第5页
资源描述:

《windows平台下的格式化字符串漏洞利用技术》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、windows平台下的格式化字符串漏洞利用技术作者:Abysssec译者:riusksk(泉哥:http://riusksk.blogbus.com)本文真正的受益者应该是那些有定汇编语言基础,以及具备经典的栈溢出知识的人,这样本文才能引领读者在windows平台下编写出自己的格式化字符串漏洞利用程序。本文主要讲述各种关键的利用技术,也许在本文发布前已经有不少人写了关于格式化字符串漏洞的文章,但他们的文章一般都相对枯燥和基础。但我们也不敢说本文讲述得相当出色和全面,不过我们会尽量使其达到这种程度。格式化字

2、符串这类软件漏洞最初是在1999年左右发现的,但在2000年之前一直被认为是没有危害和利用价值的。格式化字符串攻击可使程序崩溃或者执行恶意代码。这个问题源于对用户输入内容未进行过滤导致的,这些输入数据都是作为某些C函数执行格式化操作时的参数,如printf()。恶意用户可以使用%s和%x等格式符,从堆栈或其它可能内存位置来输出数据。也可以使用格式符%n向任意地址写入任意数据,配合printf()函数和其它类似功能的函数就可以向存储在栈上的地址写入被格式化的字节数。一个经典的exploit是混合这些技术,然

3、后用恶意shellcode的地址来覆盖某一链接库函数地址或者栈上的返回地址。其中填充的一些格式化参数主要是用于控制输出的字节数,而%x主要用于从栈中弹出字节直至格式化字符串自身的起始位置。伪造的格式化字符串起始部分应该用欲执行的恶意代码地址来覆写,这个可以借助%n格式符来实现。因此你现在需要理解受此类漏洞影响的PERL和C/C++软件,除printf()函数之外,其它函数也可能受到格式化字符串漏洞的影响,比如:●Printf()●Snprintf()●Vprintf()●Syslog()●……格式化字符串

4、漏洞除了可以执行恶意代码外,还可以从漏洞程序中读取某些数据,比如密码及其它重要信息。下面我们写份C代码进行分析,以帮助大家理解消化。#include#includeintmain(intargc,char*argv[]){intx,y,z;x=10;y=20;z=y-x;print(“theresultis:%d”,z);//%dusingcorrectformatsocodeissecure}#include#includevo

5、idparser(char*string){charbuff[256];memset(buff,0,sizeof(buff));strncpy(buff,string,sizeof(buff)-1);printf(buff);//hereisformatstringvulnerability}intmain(intargc,char*argv[]){parser(argv[1]);return0;}正如你在parser函数中看到的,程序员忘记使用%s来输出buf,以致攻击者可以使用它控制程序的执行流程,进

6、而执行恶意shellcode。现在的问题是我们该如何来控制程序的执行流程?现在我们运行漏洞程序,然后在入口处注入一些格式化参数,运行后输入一些正常的参数,如图1所示:图1现在我们使用格式化参数,结果如图2所示:图2如上所示输出内容已被更改了,这个问题主要是printf()(格式化函数)未使用%s参数,以致%x被作为正常的格式化参数而直接读取了栈中的后4个值。不要忘记了,格式化函数中还有一个指向当前格式化参数的指针。因此我们可以利用它从指定的内存地址中读取数据,这个可以用字符串地址或者shellcode地址

7、来替换。比如像图3中的情况:图3现在另一个问题是我们该如何向内存中写入数据?为了向特定的内存地址中写入数据,我们应该使用%n格式符来利用漏洞。下面我使用以下格式化参数来执行程序,如图4所示:图4如上所示,我们可以读取内存及其它一些可用信息。为了定位字符串的起始地址,我们可以使用5个%x和%n来实现,如图5所示:图5程序崩溃了……我们调试一下此次崩溃,这里我用ImmunityDebugger,你也可以使用WinDBG/VSDebugger/OD等……图6如图6所示,这里是指令movdwordptr…这意味着

8、现在将从ecx复制数据到eax指向的地址中。如果读者熟悉经典的堆/栈溢出,应该会知道这样一种方法:如果攻击者能够控制ecx和eax,就可以向其写入4字节数据,以使其跳转到恶意代码。你可以使用一连串的A字符来查找字符串,如图7所示:图7正如上面看到的输出了一个25,如果你使用一个%n来代替%x,那么从调试器可以看到如图8所示的情况:图8因此如果我们再填充更多的字符下去就可以完全控制eax了,比如像图9所示的情况:图9结果如图10

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。