Непечатаемые символы в качестве ввода в командной строке

Когда вы удаляете атрибут dumpable, группа из / proc / / файлов и ссылок становится нечитаемой другими процессами, даже принадлежит пользователю.

Справочная страница prctl гласит:

Процессы, которые не могут быть выгружены, не могут быть подключены через ptrace (2) PTRACE_ATTACH; см. ptrace (2) для получения дополнительной информации.

Если процесс не является дампируемым, право собственности на файлы в каталоге / proc / [pid] процесса затрагивается, как описано в proc (5) .

И proc справочная страница гласит:

/ proc / [pid]

Каждый подкаталог / proc / [pid] содержит псевдо -файлы и каталоги, описанные ниже. Эти файлы обычно принадлежат действующему пользователю и действующему идентификатору группы процесса. Однако в целях безопасности право собственности предоставляется root: root, если процесс " dumpable "атрибуту присвоено значение , отличное от 1.

И, наконец, ptrace справочная страница гласит:

Проверка режима доступа Ptrace

Различные части API пользовательского пространства ядра (не только операции ptrace () ) требуют так называемых проверок «режима доступа ptrace», результат которых определяет, будет ли операция разрешена (или, в некоторых случаях , приводит к тому, что операция "чтения" возвращает очищенные данные).

(...)

Алгоритм, используемый для проверки режима доступа ptrace, определяет , разрешено ли вызывающему процессу выполнить соответствующее действие над целевым процессом. (В случае открытия файлов / proc / [pid] "вызывающий процесс" - это тот, который открывает файл, а процесс с соответствующим PID - "целевой процесс".) Алгоритм выглядит следующим образом:

(...)

  1. Запретить доступ, если атрибут "dumpable" целевого процесса имеет значение , отличное от 1 (...), а вызывающий не имеет возможности CAP_SYS_PTRACE в пространстве имен пользователя целевого процесса.

1
18.06.2017, 23:31
3 ответа

эта команда сделала свое дело

printf '\x0f\x11' | program
0
27.01.2020, 23:13

Утилита printf поддерживает восьмеричные escape-символы:

  1. В дополнение к escape-последовательностям, показанным в нотации формата файла XBD ( '\\', '\a ', '\b', '\f', '\n', '\r', '\t', '\v' ), "\ddd", где ddd - один, два или три- цифровое восьмеричное число, должно быть записано как байт с числовым значением, указанным восьмеричным числом.

Встроенная функция printf по крайней мере в Bash и Zsh также поддерживает шестнадцатеричные escape-последовательности \xHH, а также кавычки $'...', которые интерполируют escape-последовательности аналогично.

Таким образом, чтобы использовать такие символы в аргументах командной строки для какой-либо команды, сделайте что-то вроде этого:

$ somecmd "arg_with_$(printf '\017')_xoff"

или поместите его в переменную, если вам нужно использовать символ более одного раза

$ xoff=$(printf '\017')
$ somecmd "many${xoff}odd${xoff}chars"

Или, чтобы передать два байта 0x0f 0x11 (017 021 в восьмеричном формате) на команду, указанную в комментариях:

$ printf "\x0f\x11" | somecmd...
$ printf "\017\021" | somecmd...
6
27.01.2020, 23:13

Это зависит от оболочки; ZSH предлагает форму $\NNN

% perl -e 'printf "%vx\n", shift' $'\177'
7f
% 

Как в zsh, так и в kshдругим вариантом будет использование control+v , а затем возврат , который должен вставить ^Mв командную строку, хотя это может быть утомительным и может чрезмерно усложнить историю оболочки.

При их отсутствии другим вариантом является запуск программы, которая генерирует соответствующие символы.

% perl -e 'printf "%vx\n", shift' $( perl -e 'print "\x0F"' )
f
% 

Или использовать небольшую программу на C с соответствующими аргументами для вашей программы; это позволит избежать любых осложнений, которые может добавить оболочка

#include <err.h>
#include <unistd.h>

int main(void)
{
    execlp("perl", "perl", "-e", "printf \"%vx\\n\", shift", "\x0F",
           (char *) 0);
    err(1, "exec failed");
    return 1;
}
2
27.01.2020, 23:13

Теги

Похожие вопросы