pwn栈溢出学习 格式化字符串基本原理

pwn栈溢出学习格式化字符串

1. 格式化字符串简介

格式化字符串函数可以接受可变数量的参数,并将第一个参数作为格式化字符串,根据其来解析之后的参数。通俗来说,格式化字符串函数就是将计算机内存中表示的数据转化为我们人类可读的字符串格式。几乎所有的 C/C++ 程序都会利用格式化字符串函数来输出信息,调试程序,或者处理字符串。一般来说,格式化字符串在利用的时候主要分为三个部分

  • 格式化字符串函数
  • 格式化字符串
  • 后续参数,可选

2. 格式化字符串函数

2.1 输入

  • scanf()

2.2 输出

函数基本介绍
printf输出到 stdout
fprintf输出到指定 FILE 流
vprintf根据参数列表格式化输出到 stdout
vfprintf根据参数列表格式化输出到指定 FILE 流
sprintf输出到字符串
snprintf输出指定字节数到字符串
vsprintf根据参数列表格式化输出到字符串
vsnprintf根据参数列表格式化输出指定字节到字符串
setproctitle设置 argv
syslog输出日志
err, verr, warn, vwarn 等。。。

3.格式化字符串的基本原理

以ctfwiki上的例子来说
在这里插入图片描述

  • c语言编译printf函数后会把数据push进栈
  • 那么栈空间在进入printf函数之前是这样的
some value
3.14
123456
addr of "red"
addr of format string: Color %s...
  • 那么函数执行的时候就会就会读取这串格式化字符串
  • 如果读到的不是%就会直接输出
  • 如果%之后接着往下读一位
  • 如果是%就输出%
  • 否则根据相应的字符,获取相应的参数,对其进行解析并输出

那如果编写printf函数的时候没有参数会怎样

printf("Color %s, Number %d, Float %4.2f");
  • 程序会照样执行
  • 只不过在读到第一个%s的时候会直接直接解析储存格式化字符串上面的变量
  • 这就是格式化字符串漏洞的基本原理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

==Microsoft==

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值