Вы можете передавать awk
переменные извне, используя аргумент -v
. Вы можете использовать его повторно для передачи нескольких переменных.
Например, для первой строки вашего скрипта:
awk -v FIELD_DELIMITER='\036' -v WIPEOUT_CHARACTER='X' 'BEGIN{FS=OFS=FIELD_DELIMITER} {gsub(/./, WIPEOUT_CHARACTER, $13)} 1' $1 > $file_directory'/'$mask_filename$seperation$temp$DATA_SUFFIX
Я проверил GNU Awk 4.1.4, и он с удовольствием взял "\036" и интерпретировал его как разделитель записей ASCII RS (), поэтому я ожидаю, что это должно работать и для вас.
Похоже, что script
является решением, как упоминал А.Б. С помощью -e
вы даже получите код возврата программы. cat -vet
показывает более явно возврат каретки ^M
и новую строку $
.
$ script -q -e out -c./pusher.bin >/dev/null; echo $?
0
$ cat -vet out
Script started on Mon Dec 21 10:54:40 2020$
echo 'Catch me if you can'^M$
Я придумал это функциональное, но ошибочное решение:
RESULT="$(bash -c 'ID="s$(head -c 8 /dev/urandom | base64 | sed "s/[^0-9a-zA-Z]//g")"; F="$(mktemp)"; screen -d -m -S "$ID" bash -c "./escape.bin; cat >/$F"; sleep 1s; screen -S "$ID" -X quit; cat <$F; rm "$F"')"
Разбивка важных битов:
# Generate a unique session name for screen
ID="s$(head -c 8 /dev/urandom | base64 | sed "s/[^0-9a-zA-Z]//g")";
# Get a temporary file
F="$(mktemp)";
# Run pusher in a detached (`-d -m`) screen session
# with its own tty and read back the tty's buffer
# using cat and write it to the temporary file
screen -d -m -S "$ID" bash -c "./pusher.bin; cat >/$F";
# Sleep for one second for pusher to finish (I'm a
# aware that I can poll screen using `-list`, but
# exec fails for some reason, help here would be
# appreciated)
sleep 1s;
# Kill screen session manually (again, `exec`ing
# fails for some reason )
screen -S "$ID" -X quit;
# Print the contents of F to stdout so that it can
# be captured by the outermost `$(...)`
cat <$F;
# Removes the temporary file
rm "$F"'
Этот метод достаточно надежен для моего случая использования, но у него есть очевидные проблемы:
pusher.bin
потерян. pusher.bin
, а предполагает, что он будет завершен через 1 секунду. Некоторые из них легко исправить, в то время как другие требуют больше усилий.
Вам нужно прочитать терминал после инъекции. Например, для одной строки:
$./pusher.bin;read a
$ echo "Intercepted: $a"
или вообще:
$./pusher.bin;cat
Возможно, вам придется внедрить EOF, чтобы cat
завершилось.
Альтернативный вариант, если вы хотите видеть только введенные символы:
$ stty -echo;./pusher.bin;cat;stty echo
Вы не сможете захватить введенные строки и отличить их от обычного ввода