一、漏洞原理
格式化字符串漏洞(Format String Vulnerability)是由于程序使用用户可控的输入作为格式化字符串参数(如 printf
、sprintf
等函数)时未正确过滤导致的漏洞。攻击者可通过构造特殊格式字符串实现以下操作:
-
内存泄露:读取栈或堆中的敏感数据(如密码、密钥)。
-
内存覆盖:向任意地址写入数据(如劫持控制流、覆盖函数指针)。
-
程序崩溃:通过非法内存访问导致拒绝服务(DoS)。
关键机制:
格式化函数(如
printf
)根据格式指示符(如%s
,%x
,%n
)从栈中按顺序读取参数。如果用户输入的格式字符串包含多余指示符,函数会从栈中读取非预期的数据。
%n
指示符可将已输出的字符数写入指定地址,实现内存写操作。
二、常见题型
-
信息泄露(Memory Leak)
目标:读取栈或堆中的敏感数据(如
flag
或libc
地址)。示例:
printf(user_input)
→ 用户输入%p%p%p...
泄露栈内容。 -
覆盖关键变量
目标:修改程序逻辑(如绕过身份验证)。
示例:通过
%n
覆盖全局变量is_admin
的值为1
。 -
控制流劫持
目标:覆盖返回地址或函数指针(如
GOT
表项)。示例:通过
%n
将exit()
的 GOT 表项覆盖为shellcode
地址。