Agent Skills
返回列表
💻

格式化字符串利用

开发编程 更新于 2026.08.30

将以下提示词粘贴到你的 AI 对话框中:

请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/format-string-exploitation-rwsq。

技能介绍

问题:当你的输入变成了格式化串

当程序把用户输入直接当作 printf 家族函数的格式化参数时,输入里的 %p、%n 就不再是普通字符,而是会被解析为格式化操作。攻击者可以借此读取栈上任意位置的内存(泄露 canary、返回地址、libc 基址),甚至向任意地址写入数据(如将 system 的地址写入 puts@GOT)。然而,实际操作远比理论复杂:你得准确算出输入在栈上的偏移,处理 64 位下的空字节截断,绕过 __printf_chk 对 %n 的限制,还要在不知道程序内部结构的情况下完成盲利用。基础模型往往在这些细节上翻车——偏移算错、地址放错位置、忽略空字节,一步错步步错。

核心能力:从栈泄露到任意写入

这个技能把格式化字符串利用拆成几个可操作的模块。首先是栈内存读取,通过 %N$p 或 %N$s 直接定位并打印栈上第 N 个参数,用来泄露 canary、保存的 RBP、返回地址或 libc 相关地址,进而计算出基址。其次是任意地址写入,利用 %n 系列说明符(%n、%hn、%hhn、%ln)将已打印字符数写回内存,逐字节构造目标值,常用于覆写 GOT 表项或 glibc hook。

针对复杂场景,技能覆盖了栈指针链利用(当格式串不在栈上时,借助栈上已有的指针链间接寻址)和盲格式化字符串利用(通过发送 %p 序列、确定偏移、泄露 GOT 再覆写的完整流程)。对于 64 位环境,特别处理了地址中的空字节问题,提供了将地址放置在格式串之后并对齐的布局模板。此外还包含 FORTIFY_SOURCE 绕过策略,例如用非位置参数的 %hn 顺序写入,或借助堆溢出与 ROP 组合绕过 __printf_chk 的限制。

适用边界与注意事项

这套技能主要面向 CTF 与授权安全研究中的二进制漏洞利用,不适用于没有格式化字符串漏洞的程序。__malloc_hook 等技巧仅在 glibc < 2.34 的旧版本有效,新版 glibc 已移除这些 hook。64 位下 48 位地址空间的限制意味着你只能操作低 48 位地址,高 16 位通常为零,这会影响写入策略。在真实环境中,ASLR 与 PIE 会增加利用难度,通常需要结合信息泄露先行破解。技能文档中明确区分了 32 位与 64 位的写入差异,建议在实操前先确认目标架构与保护机制,避免套用错误模板。

使用场景

  • CTF 比赛中遇到 printf 直接打印用户输入的题目,需要泄露 canary 并覆写 GOT 拿到 shell
  • 远程服务没有源码和二进制,只能发送格式串探测,需要用盲格式化泄露栈与 libc 基址
  • 64 位程序里写入的地址含空字节被截断,需要把地址放到格式串之后并补齐对齐
  • 目标开了 FORTIFY_SOURCE,位置参数 %n 被禁止,需要改用 %hn 顺序写入绕过 __printf_chk

适合人员

  • 参加 CTF Pwn 比赛的选手,需要在赛场上快速构造格式化字符串利用链
  • 进行授权渗透测试的安全研究员,需要分析二进制漏洞并编写利用代码
  • 负责加固二进制程序的开发工程师,需要理解漏洞成因并修复格式化字符串误用