0%

Format-String

学习了一下格式化字符串漏洞, 简单总结一下.

0x0 printf 的原理

1
2
int x = 0;
printf("x = %d", x);

首先, 将$0, addr of “x = %d”$入栈, 然后解析”x = %d”.

在进入 printf 之后,函数首先获取第一个参数,一个一个读取其字符会遇到两种情况

  • 当前字符不是 %,直接输出到相应标准输出.
  • 当前字符是 %, 继续读取下一个字符
    • 如果没有字符,报错
    • 如果下一个字符是 %, 输出 %
    • 否则根据相应的字符,获取相应的参数,对其进行解析并输出
      其他的格式化输出类似

      0x1 格式化字符串格式

      1
      %[parameter][flags][field width][.precision][length]type

对pattern的解释

  • parameter
    • n$,获取格式化字符串中的指定参数
  • flag
  • field width
    • 输出的最小宽度
  • precision
    • 输出的最大长度
  • length 输出的长度
    • hh 输出一个字节
    • h 输出一个双字节