You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:25:09