我正在尝试通过小工具链接技术利用二进制(64位)。我必须通过地址
0x00007ffff7e10cf8
其中包含用于
pop rax;ret
在以little-endian格式传递此输入时,我的bash发出警告说:
bash: warning: command substitution: ignored null byte in input
并且仅打印到7f,忽略NULL字节。
为确保我正确理解bash IGNORES的概念,并且在遇到第一个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
答案 0 :(得分:0)
shell脚本实际上不是修补二进制文件的推荐方法。但是,可以使用dd
完成。假设您必须在文件的0x00007ffff7e10cf8
位置写入0xff00-0xff07
,覆盖已经存在的字节(从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"