如何在输入中提供 NULL 字节?

How can I give NULL bytes in input?

我正在尝试利用小工具链接技术利用二进制文件(64 位)。我必须通过地址 0x00007ffff7e10cf8 其中包含代码 pop rax;ret 在以小端格式传递此输入时,我的 bash 发出警告说: bash: warning: command substitution: ignored null byte in input 并且只打印到 7f,忽略 NULL 字节。

为了确保我理解 bash 忽略并且在遇到第一个 NULL 字节时不停止解析的概念。我尝试了 echo $(printf "\x00\x55\x44\x33\x22\x00\x34") 并且输出是

bash: warning: command substitution: ignored null byte in input
UD3"4

所以是的,bash 只是忽略 NULL 字节并一直解析到最后。

有没有办法在 bash 中实际传递 NULL 字节?我正在使用 bash 版本 5.0.3

shell 脚本并不是真正推荐的修补二进制文件的方法。但是,可以用 dd 来完成。比如说,你必须在文件的 0xff00-0xff07 位置写入 0x00007ffff7e10cf8,覆盖已经存在的字节(从 0 开始计数)。您可以使用

#!/bin/bash

input='original.bin'
output='patched.bin'
patch='\x00\x00\x7f\xff\xf7\xe1\x0c\xf8' # Keep an eye on endianness!
start="$((16#FF00))"

{ 
  dd if="$input" bs="$start" count=1 2>/dev/null
  printf "$patch"
  dd if="$input" bs="$((start+${#patch}/4))" skip=1 2>/dev/null
} >"$output"