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。 这个占位符可以把它前面输出的字符的数量,写入指定的地址。 比如 val的值就被改变为3,我们一般都用pwntools自带的fmt_str来生成格式化串 fmt_str(offset,size,addr,target) offset表示要覆盖的地址最初的偏移 size表示机器字长 addr表示将要覆盖的地址 target表示我们要覆盖为的目的变量值
|