protostar format1 - Blog of Mathias
Blog of Mathias Web Securtiy&Deep Learning
protostar format1
发表于: | 分类: 格式化字符串漏洞 | 评论:0 | 阅读:427

最近真是怠惰啊~,今天又重新复习下格式化字符串漏洞,我感觉金老板快被我弄疯了hhhh,也是感谢他的帮助。
格式化字符串漏洞其实是一种很基本的漏洞类型,成因是printf()函数的参数只给定了需要打印的str,比如这样
printf(str);
那么格式化字符串本身,也就是我们的%d,%s,%x,就变成用户可控的情况了。
这里要注意的就是,printf其实算是一个接受变参的函数,格式化字符串之后的
比如
printf("%x%x",a,b);
但是这个时候,我们把b去掉 只保留a,却发现仍然打印出了一个数值。
很明显,printf的原理是直接用esp做基准去取参数,所以说这也是比较明显的一个问题了,我们完全可以任意读取其他地址的内存。
而且%n更是提供了写入功能,以参数对应的数值为指针,写入已经被打印出的字符数量。一个比较完整的介绍是。
%[第几个参数]$[对齐格式,比如010是用0补齐,10长度]x
因此,我们可以通过向第n个参数写入一个地址的方法,再把x换成n,就能写入了。

2.png

然后很不幸的是,在我的x64系统下,源码编译后,target所在的bss段地址的低32位中含有\x00,会产生截断的效果,因此重新把环境调整到了x86(当然这只是针对这道题的例外,真正的利用起来还是很广泛的,毕竟可以覆盖掉返回地址等信息)~
这样总算是没有\x00了

3.png

于是开始构造payload
首先通过连续打印的方式,观察我们的输入的str到底被存放在了哪里。

4.png

发现应该是控制在了第173个%x,第173个参数

5.png

验证了一下,确认了偏移量。

6.png

紧接着向目标直接用%n进行写入。

7.png

写入成功,我们由此改变了target变量的数值
注:想要把目标修改成具体的某个值时,首先根据需要填充的16进制计算对应的10进制数值,再通过改变$后的对齐长度,强制补齐那么多位数,注意补齐的长度为(需要填充的10进制数值-有效payload的长度)

还不快抢沙发

添加新评论