roger 发表于 2020-2-7 00:32:47

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

Format String符号说明在格式化字符串中,"%s"、"%d" 等类型的符号叫符号说明,这些符号说明的基本格式为 %parameterfield widthtype 。相信大家对于简单的符号说明并不陌生,但如果要利用格式化字符串漏洞,我们还需要用到几个比较冷门的符号说明,如:
pwn题中,有形如下述代码的形式就是格式化字符串漏洞
char str;
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表示我们要覆盖为的目的变量值

monkeyman 发表于 2020-2-13 10:13:35

用心讨论,共获提升!
页: [1]
查看完整版本: 格式化漏洞常用的符号说明