本博客已经弃用,我的新博客地址:http://jujuba.me/
How printf works——浅谈格式化串漏洞
0x00 简介
格式化字符串漏洞由来已久,其主要原因是程序员在使用printf时未将格式化串的个数
和变量的个数相匹配,给了黑客们可乘之机。
我们可以先来看看printf函数的声明
int printf (const char *__format, ...)
很奇怪吧,printf的argument中有一个...
,这表示printf的argument的个数
是没有限制的,写多少个都没事。
比如下面这段代码是可以成功运行的,用gcc编译不会出现任何错误。
int main(){
char * s = "hello";
printf(s,s,s);
}
0x01 原理
printf函数和一般函数不太相同,因为它的argument(包括格式化串和变量)可以是任意
个,那么当程序被编译成二进制代码之后,CPU会知道格式化串和变量的分界线吗?肯定是
不知道的。假如程序员在写程序时使用了printf(something)
这种写法的话,相
当于没有限定自己的格式化串,那么我们就可以自己输入格式化串,此时CPU就会被误导,
以为自己要往高地址方向读很多个变量,从而