
В моем предыдущем вопросе:выполнил «chmod 666 ld-2.17.so» — как восстановить?Я спросил, если я изменю ld-2.17.so
разрешение на чтение, как я смогу восстановить его обратно, поскольку оно не позволит мне выполнить вообще ничего, что требует этих библиотек?
И я получил следующий ответ:
Если у вас есть исполняемый файл, в который можно производить запись, вы можете скопировать содержимое ld.so в этот файл с помощью команды bash read:
while IFS= read -d '' -r line; do printf "%s\0" "$line"; done > executable-file < /lib64/ld-2.17.so
Я попробовал, и это сработало. Но меня смущает, почему этот while
цикл работает, если /bin/bash
сам требует lib64/ld-2.17.so
библиотеку, как можно увидеть ниже,
ldd /bin/bash
linux-vdso.so.1 => (0x00007ffc54dee000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f6fb9bbe000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f6fb99ba000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6fb95f6000)
/lib64/ld-linux-x86-64.so.2 (0x000055ec142f5000)
Может кто-нибудь сказать мне, почему bash
код работает из терминала без /lib64/ld-2.17.so
? Означает ли это, что я также могу создать пустой исполняемый файл, используя bash
из терминала, даже если /lib64/ld-2.17.so
у меня нет разрешений?
Спасибо
решение1
while IFS= read -d '' -r line; do
printf "%s\0" "$line"
done > executable-file < /lib64/ld-2.17.so
использует только встроенные функции оболочки, поэтому не нужно запускать новые процессы. Сценарий восстановления предполагает, что у вас уже есть запущенная оболочка; поскольку она уже запущена, ее разрешения на диске и разрешения ее библиотек больше не имеют значения.
При таких обстоятельствах вы не сможете запустить новую оболочку, но ни на что из запущенного в данный момент процесса измененные разрешения не повлияют.
Если файл, который вы пытаетесь прочитать, имеетнетразрешения, это сработает только если вы находитесь в оболочке root; в противном случае перенаправление ld-2.17.so
не удастся, поскольку вы не сможете прочитать нечитаемый файл, если вы не являетесь пользователем root. (Я игнорирую здесь SELinux и т. п.)