传递含空字节的小端序数据时异常,寻求技术指导
问题根源与解决建议
核心问题分析
- Bash命令替换丢失空字节:你使用
$(...)做命令替换时,Bash会自动忽略输出中的空字节(\x00),导致构造的b'\x8d\x12\x00\x00'实际只传递了\x8d\x12,后面两个空字节被丢弃,这也是你看到-bash: warning: command substitution: ignored null byte in input警告的原因。 - 地址异常的由来:程序输出的
0x5600128d中,0x5600通常是Linux用户态程序的默认加载基址(受ASLR影响可能变化)。因空字节丢失,你原本要覆盖的变量位置被栈上的其他数据(比如环境变量、程序参数残留数据)填充,最终形成错误地址触发段错误。
解决方案
方案1:通过标准输入传递含空字节的payload(推荐)
如果程序从标准输入读取输入,直接用管道传递数据,绕过Bash命令替换的限制:
python3 -c "import sys; sys.stdout.buffer.write(b'A' *1024 + b'\x8d\x12\x00\x00')" | ./run_me
方案2:用Python直接调用程序(适合参数接收输入的场景)
Bash本身无法传递含空字节的命令行参数,可直接用Python的subprocess模块调用程序:
import subprocess payload = b'A' * 1024 + b'\x8d\x12\x00\x00' subprocess.run(["./run_me", payload])
方案3:使用xargs -0传递参数
xargs的-0选项支持以空字节作为分隔符,能保留payload中的空字节:
python3 -c "import sys; sys.stdout.buffer.write(b'A' *1024 + b'\x8d\x12\x00\x00' + b'\x00')" | xargs -0 ./run_me
注:末尾额外添加的空字节是为了让xargs正确识别payload为单个参数。
内容的提问来源于stack exchange,提问作者NoPorkNoLard
相关产品推荐
相关产品推荐

