格式化字符串

原理

(栈上)格式化字符串漏洞主要针对printf()类的函数. 其核心在于依赖格式化占位符指明参数值格式化类型.

  • 格式化占位符 %[parameter][flags][field width][.precision][length]type 对于该攻击手段来说, 最重要的参数是parameter. 具体形式为n$, 表示输出第几个参数. 如果一个占位符使用parameter, 其余占位符也需要使用parameter. 对于length参数, hh输出一个字节, h输出一个双字节. 对于type参数, n不输出字符, 但是把已经成功输出的字符个数写入对应的整型指针参数所指的变量
  • 攻击手段 由上面的解释, 那么攻击手段主要有两种, 任意读和任意写. 首先对于读取, 我们可以通过输出很多很多内容泄露栈上内容, 使用%x或者%p输出栈上内容, 或者使用%s将其数值被解析为指针, 输出其对应地址的字符串内容. 通过输入一些内容, 我们可以确定我们输入的字符串在栈上的位置. 因为所使用的字符串是在栈上的, 而被攻击的函数的也在栈上获取参数, 所以我们可以通过写入需要读取的目标地址, 然后将其作为地址解析, 再打印出来. 于是可以实现对于任意地址的读取. 如给出这样的payload:payload = p32(__isoc99_scanf_got) + '%4$s', 我们就可以打印出scanf()对应的got表的内容.(可能有时需要进行padding) 对于写入, 则主要分为两步. 首先需要覆盖栈上地址, 而后通过栈上内容覆盖任意地址. 首先按照读取一样的方法找到字符串在栈上的位置, 而后通过%n进行修改. 需要注意的是, %n写入四字节, hhn写入单字节, hn写入双字节. 同时在构造payload的时候,

修复手段

代码审计…(现实中真的会遇到这种漏洞吗)