首页 > 代码库 > 格式化字符串漏洞

格式化字符串漏洞

这不是一篇完整的关于 “格式化字符串漏洞“ 的文章
我在学习中遇到问题所搜索到的一些零碎知识 在这做一下总结,  参考中的每一个链接都很好的 讲解了 “格式化字符串漏洞”

 

基本的格式化字符串参数:
参考: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 bingtangguan@ubuntu:~/Desktop/format$ ./test
2 %x
3 bffff024

那我们需要修改的地址就是:0xbffff024+0x64=0xbffff088

最后就是要在地址0xbffff088处写入2000: \x88\xf0\xff\xbf%10x%10x%10x%1966x%n

 
bingtangguan@ubuntu:~/Desktop/format$ python -c "print ‘\x88\xf0\xff\xbf%10x%10x%10x%.1966x%n‘" > 11
bingtangguan@ubuntu:~/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

 

 

格式化字符串漏洞