printf漏洞介绍
printf(format,<参量表>)
1、概念
printf接受变长的参数,其中第一个参数为格式化字符串,后面的参数在实际运行时将与格式化字符串中特定的子字符串进行对应,将格式化字符串中的特定字串,解析为相应的参与值。格式化字符串就是%这种。
2、漏洞成因
printf函数在执行时,首先进行格式化字符串的解析–从栈(或者寄存器)获取参数并与符号说明进行匹配,然后将匹配的结果输出到屏幕上,那么 ,如果格式化字符串中的符号声明与栈上参数不能正确匹配,比如参数个数少于符号声明个数时,就会造成泄漏。
而本书,printf也就是一个有力的攻击武器,我们可以通过控制字符串的值来实现更多的泄露或者完成个高级的利用。
3、实例代码
gcc编译之后用gdb打开
我们可以看到红框内edx是“My name is %s”,这个时候注意我们的代码,printf后面是没有跟参的,在本该压参的位置没有参数,导致了压入的是“My name is %s”。
我们看到红框呢内,程序开始调用printf函数了,我们的格式是给了,但是var这个参数是什么我们没有给,所以他就会到esp,高4位的地方去取值
所以说这个是残缺的程序,那我们来帮助他完成。
set *(0xffffd844) = 0x804a008
4、实例二
代码如下
gcc编译后使用windbg打开,首先查看一下main函数,如下图
红框中就是就是read函数,且我们要在sub esp,0x4下断点,因为那里开始要分配空间
当我们单步到call read时,我们可以输入自己想说的话,最后程序也是可以输出的,这就利用了printf漏洞
希望大家可以有所收获!!!