格式化字符串漏洞
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了格式化字符串漏洞相关的知识,希望对你有一定的参考价值。
这不是一篇完整的关于 “格式化字符串漏洞“ 的文章
我在学习中遇到问题所搜索到的一些零碎知识 在这做一下总结, 参考中的每一个链接都很好的 讲解了 “格式化字符串漏洞”
基本的格式化字符串参数:
参考:http://bobao.360.cn/learning/detail/3654.html
%c:输出字符,配上%n可用于向指定地址写数据。 %d:输出十进制整数,配上%n可用于向指定地址写数据。 %x:输出16进制数据,如%i$x表示要泄漏偏移i处4字节长的16进制数据,%i$lx表示要泄漏偏移i处8字节长的16进制数据,32bit和64bit环境下一样。 %p:输出16进制数据,与%x基本一样,只是附加了前缀0x,在32bit下输出4字节,在64bit下输出8字节,可通过输出字节的长度来判断目标环境是32bit还是64bit。 %s:输出的内容是字符串,即将偏移处指针指向的字符串输出,如%i$s表示输出偏移i处地址所指向的字符串,在32bit和64bit环境下一样,可用于读取GOT表等信息。 %n:将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置,如%100x10$n表示将0x64写入偏移10处保存的指针所指向的地址(4字节),
而%$hn表示写入的地址空间为2字节,%$hhn表示写入的地址空间为1字节,%$lln表示写入的地址空间为8字节,在32bit和64bit环境下一样。有时,直接写4字节会导致程序崩溃或等候时间过长,可以通过%$hn或%$hhn来适时调整。 %n : 是通过格式化字符串漏洞改变程序流程的关键方式,而其他格式化字符串参数可用于读取信息或配合%n写数据。
利用格式化字符串漏洞改写任意内存数据:
参考 :http://www.jianshu.com/p/f2acfeb66b6c
向内存中写入4个字节的方法是将其划分成两块(两个高位字节和两个低位字节),然后使用#$和%hn将它们放入到正确的位置。 例如,我们要将 0xbffffffa 写入内存 0x0804a028 ——示例代码的 canary(金丝雀)的地址,首先把值拆分: 两个高位字节(HOB): 0xbfff 两个低位字节(LOB): 0xffff 然后通过魔术计算公式构造一个格式化字符串:
"\\x2a\\xa0\\x04\\x08\\x28\\xa0\\x04\\x08 %.49143x%4\\$hn%.16379x%5\\$hn"
# ./fmttest `printf "\\x2a\\xa0\\x04\\x08\\x28\\xa0\\x04\\x08"`%.49143x%4\\$hn%.16379x%5\\$hn (这里省略一大堆输出) Canary at 0x0804a028 = 0xbffffffa
示例成功的将canary的内容改为0xbffffffa 。
构建示例所用的公式请对照下图(魔术公式表):
GDB调试 和 程序运行时 内存地址不一样:
参考:http://bobao.360.cn/learning/detail/695.html
这里有一点需要特别注意: gdb调试环境里面的栈地址跟直接运行程序是不一样的,也就是说我们在直接运行程序时修改这个地址是没用的,所以我们需要结合格式化字符串漏洞读内存的功能,先泄露一个地址出来,然后我们根据泄露出来的地址计算出ebp-0x10的地址。
我们继续在gdb调试,执行get()函数后随便输入AAAAAAA,执行到printf()的时候观察栈区:
我们如果只输入%x的话就可以读出esp+4地址上的数据,也就是0xbfffefe4,而我们需要修改的地址为0xbffff048,这两个地址的偏移为0x6
下面我们就可以直接运行程序,并输入%x,然后获取ESP+4地址内的值:
1 [email protected]:~/Desktop/format$ ./test 2 %x 3 bffff024
那我们需要修改的地址就是:0xbffff024+0x64=0xbffff088
最后就是要在地址0xbffff088处写入2000: \\x88\\xf0\\xff\\xbf%10x%10x%10x%1966x%n
[email protected]:~/Desktop/format$ python -c "print ‘\\x88\\xf0\\xff\\xbf%10x%10x%10x%.1966x%n‘" > 11
[email protected]:~/Desktop/format$ cat 11 | ./test
???? bffff024 0 0000000(省略了很多很多0)000000000000000000
0000000003good!!
参考:
http://bobao.360.cn/learning/detail/3654.html
http://www.jianshu.com/p/f2acfeb66b6c
http://bobao.360.cn/learning/detail/695.html
以上是关于格式化字符串漏洞的主要内容,如果未能解决你的问题,请参考以下文章
Format String Vulnerability Lab(格式化字符串漏洞实验最新版——2020年1月12日更新)