GDB调试时如何向程序传递含空字节的字符串参数?
如何在GDB中为程序argv[1]传递包含空字节的字符串
核心问题
bash在处理命令行参数时会自动过滤空字节,导致常规的管道、重定向或run $(...)方式无法传递带空字节的payload,而缓冲区溢出测试中恰好需要这类包含空字节的跳转地址参数。
可行解决方案
方法1:GDB内置命令直接构造参数
利用GDB的printf命令生成包含空字节的字符串,再通过set args设置程序参数:
# 替换\x00\x12\x34\x56为你的目标地址,\x90*100是填充的nop指令 set args `printf '\x90%.0s' {1..100}\x00\x12\x34\x56` run
GDB的内置printf会完整保留空字节,不会被bash过滤。
方法2:通过GDB Python API构造
GDB支持Python脚本,可以直接构造字节串参数,绕开bash的处理:
python import gdb # 替换为你的实际payload,b前缀确保字节串保留空字节 payload = b'\x90'*100 + b'\x00\x12\x34\x56' # 用latin-1解码避免utf-8对空字节的报错 gdb.execute('set args ' + payload.decode('latin-1')) end run
方法3:二进制文件结合xargs传递
先将payload写入二进制文件:
python3 -c "print(b'\x90'*100 + b'\x00\x12\x34\x56', end='')" > overflow.bin
再在GDB中用xargs -0读取文件内容作为参数(-0让xargs以空字节为分隔符,完整保留payload):
run $(xargs -0 < overflow.bin)
验证方式
在GDB中设置断点查看参数是否正确:
break main run # 查看argv[1]的内存内容,确认空字节存在 x/s argv[1]
内容的提问来源于stack exchange,提问作者Peter Johansson
相关产品推荐
相关产品推荐

