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

时间:2019-04-30 06:02:37

标签: reverse-engineering bash

我正在尝试通过小工具链接技术利用二进制(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

1 个答案:

答案 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"