查看: 472|回复: 1

[Pwn] 格式化漏洞常用的符号说明

[复制链接]
发表于 2020-2-7 00:32:47 | 显示全部楼层 |阅读模式
Format String符号说明
在格式化字符串中,"%s"、"%d" 等类型的符号叫符号说明,这些符号说明的基本格式为 %parameterfield width[length]type 。相信大家对于简单的符号说明并不陌生,但如果要利用格式化字符串漏洞,我们还需要用到几个比较冷门的符号说明,如:

格式化漏洞常用的符号说明

格式化漏洞常用的符号说明

pwn题中,有形如下述代码的形式就是格式化字符串漏洞

char str[100]; 
scarf("%s",str);
 printf(str)
也许使用者的目的只是直接输出字符串,但是这段字符串来源于可控的输入,就造成了漏洞。
示例程序如下


格式化漏洞常用的符号说明

格式化漏洞常用的符号说明


编译:gcc -m32 -o str str.c输入%2$x

格式化漏洞常用的符号说明

格式化漏洞常用的符号说明


格式化漏洞常用的符号说明

格式化漏洞常用的符号说明

原因是如果直接printf(“占位符”)这种形式,就会把栈上的偏移当做数据输出出来。通过构造格式化串,就可以实现任意地址读和任意地址写。
任意地址读
事实上,我们在scanf(或者read)来输入字符串的时候,字符串就已经在栈中了,如图,可以看出偏移为6。如果我们构造出addr(4字节)%6$s,就能读取这个地址的值了。

格式化漏洞常用的符号说明

格式化漏洞常用的符号说明
我们尝试一下,输入AAAA%6$s,当然不可能真的读到地址为41414141的内存值,不过从下图我框起来的内容就知道,如果我们输入一个合法的值,就可以读了。

格式化漏洞常用的符号说明

格式化漏洞常用的符号说明
任意地址写
和上面的任意地址读是同理的,只不过利用了格式化字符串的一个比较冷门的特性,%n。
这个占位符可以把它前面输出的字符的数量,写入指定的地址。
比如
printf("abc%n", &val);

val的值就被改变为3,我们一般都用pwntools自带的fmt_str来生成格式化串
fmt_str(offset,size,addr,target)
offset表示要覆盖的地址最初的偏移
size表示机器字长
addr表示将要覆盖的地址
target表示我们要覆盖为的目的变量值
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
善莫大焉-2019

0

主题

91

帖子

0

精华

中级会员

Rank: 8Rank: 8

学币
229
荣耀
0
rank
0
违规
0

    发表于 2020-2-13 10:13:35 | 显示全部楼层
    用心讨论,共获提升!
    关闭

    论坛公告上一条 /1 下一条

    快速回复 返回顶部 返回列表