《Hacking: the Art of Exploitation》格式化字符串漏洞地址异常求助
问题根源与解决方法
问题本质
你遇到的问题和空字节无关,核心是shell的参数分词机制:你构造的地址小端序是\x20\x90\x55\x56,其中第一个字节\x20是ASCII空格字符,shell会把空格当作参数分隔符,导致你原本想作为一个整体传入的字节串被拆成了两个独立参数:
- 第一个参数:
\x20 - 第二个参数:
\x90\x55\x56%p.%p.%p.%p
这就破坏了地址的连续性,printf读取栈内容时自然会出现错乱,你看到的0x25565590其实是格式符%(ASCII 0x25)和后面的\x56\x55\x90拼接后的结果。
解决步骤
直接用双引号把整个构造的参数括起来,让shell将其识别为单个完整参数即可:
./fmt_vuln "$(printf "\x20\x90\x55\x56")%p.%p.%p.%p"
这样传入程序的argv[1]就是连续的\x20\x90\x55\x56%p.%p.%p.%p,栈上的地址会被正确解析为0x56559020,符合你的预期。
补充说明
如果后续遇到地址中包含\x00(空字节)的情况,那才会因为C字符串以空字节为终止符导致参数被截断,这时需要用其他技巧(比如利用环境变量传递包含空字节的payload),但你当前的场景完全是shell分词的问题,和空字节无关。
内容的提问来源于stack exchange,提问作者Anas Hadri
相关产品推荐
相关产品推荐

