概述
fmt(格式化字符串漏洞)这个漏洞一开始学的时候不觉得有什么,后来在做题时发现它能做到的事情挺多的,这里写下来做个记录
格式化字符串函数可以接受可变数量的参数,并将第一个参数作为格式化字符串,根据其来解析之后的参数
常见的函数有
- 输入
scanf -
输出 printf 输出到 stdout
fprintf 输出到指定 FILE 流
vprintf 根据参数列表格式化输出到 stdout
vfprintf 根据参数列表格式化输出到指定 FILE 流
sprintf 输出到字符串
snprintf 输出指定字节数到字符串
vsprintf 根据参数列表格式化输出到字符串
vsnprintf 根据参数列表格式化输出指定字节到字符串
setproctitle 设置 argv
syslog 输出日志
err, verr, warn, vwarn 等
fmt的功能有很多
常见的符号
- %x %lx
- %n(4) %hn(2) %hhn(1) %lln(8)
- %s
- %p
- %d
1.使程序崩溃
一般情况下,用
%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s
不出意外都能让程序崩溃
2. 泄露内存
可以通过%x-%x-%x-%x-%x-%x来获得栈的变量
为了快捷,也有 %number$x 的形式,值得一提的是,这里的number值得是除开格式化字符串的第几个参数
比如 printf(“abcdef”,4,6,7,8,9)
%4$x指向8,%3$x指向7
想获得内存中的变量 可以使用
addr%number$x
的形式来获得addr的值
3. 覆盖内存
可以用
addr%12c%number$n
的形式覆盖addr的值
%12c会打印出偏移的值,并且必然是12个字节
但addr可以放在任意的位置,你找得到偏移就行