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

传递含空字节的小端序数据时异常,寻求技术指导

问题根源与解决建议

核心问题分析

  1. Bash命令替换丢失空字节:你使用$(...)做命令替换时,Bash会自动忽略输出中的空字节(\x00),导致构造的b'\x8d\x12\x00\x00'实际只传递了\x8d\x12,后面两个空字节被丢弃,这也是你看到-bash: warning: command substitution: ignored null byte in input警告的原因。
  2. 地址异常的由来:程序输出的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:36:24