fmt 详解

2022-03-24

概述

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可以放在任意的位置,你找得到偏移就行