格式化字符串漏洞详解(附BUUCTF习题)

一、漏洞原理

格式化字符串漏洞(Format String Vulnerability)是由于程序使用用户可控的输入作为格式化字符串参数(如 printfsprintf 等函数)时未正确过滤导致的漏洞。攻击者可通过构造特殊格式字符串实现以下操作:

  • 内存泄露:读取栈或堆中的敏感数据(如密码、密钥)。

  • 内存覆盖:向任意地址写入数据(如劫持控制流、覆盖函数指针)。

  • 程序崩溃:通过非法内存访问导致拒绝服务(DoS)。

关键机制

格式化函数(如 printf)根据格式指示符(如 %s%x%n)从栈中按顺序读取参数。

如果用户输入的格式字符串包含多余指示符,函数会从栈中读取非预期的数据。

%n 指示符可将已输出的字符数写入指定地址,实现内存写操作。

二、常见题型
  1. 信息泄露(Memory Leak)

    目标:读取栈或堆中的敏感数据(如 flag 或 libc 地址)。

    示例:printf(user_input) → 用户输入 %p%p%p... 泄露栈内容。

  2. 覆盖关键变量

    目标:修改程序逻辑(如绕过身份验证)。

    示例:通过 %n 覆盖全局变量 is_admin 的值为 1

  3. 控制流劫持

    目标:覆盖返回地址或函数指针(如 GOT 表项)。

    示例:通过 %n 将 exit() 的 GOT 表项覆盖为 shellcode 地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值