格式化字符串利用
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/format-string-exploitation-lr-li7v。
技能介绍
核心问题
在C/C++程序中,若将用户输入直接作为printf系列函数的格式化字符串,会触发格式化字符串漏洞。这类漏洞轻则泄露栈上敏感数据,重则通过%n等占位符实现任意地址写入,最终控制程序执行流。但实际利用中,开发者常面临位置参数偏移计算错误、64位架构下地址占位符摆放不当等问题,导致利用链断裂。
核心能力与实现逻辑
该技能围绕格式化字符串利用的完整链条展开,核心能力包括:
- 栈数据读取:通过
%x、%s等占位符逐层回溯栈帧,精准定位返回地址、保存寄存器等关键变量的内存布局; - 任意地址写入:利用
%n将已输出字符数写入指定地址,结合栈上可控指针,实现对GOT表、__malloc_hook等关键结构的覆盖; - 盲利用场景处理:针对无回显程序,通过
%s触发段错误、%d输出异常值等方式,间接推导内存布局; - 64位架构适配:解决64位下栈地址高位缺失问题,通过调整占位符顺序(如
%llx配合参数索引)确保地址完整读取。
关键步骤分为三步:首先通过%p占位符输出栈上数据,确定格式化字符串与目标地址的偏移量(如%7$x读取第7个位置参数);其次构造写入原语,在格式串中嵌入目标地址对应的参数索引(如%10$n),并配合%c控制写入字节数;最后针对FORTIFY_SOURCE等保护机制,利用函数检查盲区(如printf对%n的限制可通过%ms间接绕过)或结合栈溢出篡改返回地址,完成利用链拼接。
适用边界与注意点
该技能适用于CTF竞赛、漏洞复现等场景,需配合pwntools等工具进行自动化参数计算。需注意:不同编译器对%n的处理存在差异(如GCC默认禁用时需结合其他原语);64位程序需考虑栈对齐要求,避免写入地址时出现字节截断;生产环境中需结合PIE、ASLR等缓解措施的绕过手段,不可直接套用。
使用场景
- CTF竞赛中遇到格式化字符串漏洞,需要泄露栈上敏感数据以定位返回地址
- 处理无回显的格式化字符串漏洞程序,通过盲利用推导内存布局
- 针对64位程序的GOT表覆盖利用,需调整格式串中地址占位符的顺序
- 绕过FORTIFY_SOURCE保护时,利用printf对%n限制的盲区构造写入原语
适合人员
- CTF参赛者,需要在竞赛中快速完成格式化字符串漏洞的完整利用链
- 漏洞复现工程师,需针对特定编译器和架构调整格式串利用参数
- 二进制安全研究员,需分析真实场景中格式化字符串漏洞的利用手法
- 安全工具开发者,需集成格式化字符串利用的自动化参数计算功能