C语言中经常使用scanf
和pringtf
进行格式化的读入和输出,但是没有做好过滤可能导致程序漏洞。
基础知识
通常C语言中的占位符有如下:
占位符 | 作用 |
---|---|
%p | 以16进制输出指针的值(地址) |
%x | 输出16进制值(与%p有区别) |
%s | 输出字符串值 |
%d | 输出10进制整数 |
%n | 占位符前面成功输入的字符个数写入变量中 |
用%number$p
可以指定后number个参数输出。
漏洞点
若程序中直接使用printf(str)
,且str
我们可以控制,则在str中输入格式化字符串,可以泄露出栈内容,且可以进行任意地址写。
利用方式:
- 泄露出栈中内容,找到栈中str的位置(利用%number$x)进行探查。
- 构造payload
地址+填充字符+%number$n
可以任意地址写入内容。