Как я могу дать NULL байтов на входе? - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь использовать двоичный (64-разрядный) метод цепочки гаджетов.Я должен передать адрес 0x00007ffff7e10cf8, который содержит код для pop rax;ret При передаче этого ввода в формате с прямым порядком байтов мой bash выдает предупреждение: bash: warning: command substitution: ignored null byte in input и печатает только до 7f, игнорируя пустые байты.

Чтобы убедиться, что я правильно понял, что 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-байты и продолжает анализ до конца.

Есть ли способ фактически передать NULL-байтыв баш?Я использую Bash версии 5.0.3

1 Ответ

0 голосов
/ 30 апреля 2019

Сценарий оболочки на самом деле не является рекомендуемым способом исправления двоичных файлов. Однако это можно сделать с помощью 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"
...