Como posso recuperar de um 'chmod -x chmod'? [duplicado]

5

Supondo que você não pode acessar a Internet nem reinicializar a máquina, como posso me recuperar de

chmod -x chmod

?

    
por José Castro 14.07.2016 / 18:35

1 resposta

7

1 - use uma linguagem de programação que implemente chmod

Ruby:

ruby -e 'require "fileutils"; FileUtils.chmod 0755, “chmod"'

Python:

python -c "import os;os.chmod('/bin/chmod', 0755)”

Perl:

perl -e 'chmod 0755, “chmod”'

Node.js:

require("fs").chmod("/bin/chmod", 0755);

C:

$ cat - > restore_chmod.c 
#include <sys/types.h>
#include <sys/stat.h>

int main () {
    chmod( "/bin/chmod", 0000755 );
}
^D

$ cc restore_chmod.c

$ ./a.out

2 - Crie outro executável com chmod

Criando um executável:

$ cat - > chmod.c 
int main () { }
^D

$ cc chmod.c

$ cat /bin/chmod > a.out

Copiando um executável:

$ cp cat new_chmod

$ cat chmod > new_chmod

3 - Inicie o BusyBox (ele tem chmod dentro)

4 - Usando o Gnu Tar

Crie um arquivo com permissões específicas e use-o para restaurar o chmod:

$ tar --mode 0755 -cf chmod.tar /bin/chmod

$ tar xvf chmod.tar

Faça a mesma coisa, mas sem se preocupar em criar o arquivo:

tar --mode 755 -cvf - chmod | tar xvf -

Abra um soquete em outra máquina, crie um arquivo e restaure-o localmente:

$ tar --preserve-permissions -cf chmod.tar chmod

$ tar xvf chmod.tar

Outra possibilidade seria criar o arquivo regularmente e editá-lo para alterar as permissões.

5 - cpio

cpio permite manipular arquivos; quando você executa cpio file , após os primeiros 21 bytes, há três bytes que indicam as permissões do arquivo; se você editar esses, é bom ir:

echo chmod |
  cpio -o |
  perl -pe 's/^(.{21}).../${1}755/' |
  cpio -i -u

6 - Carregadores dinâmicos

/bin/ld.so chmod +x chmod

(os caminhos reais podem variar)

7 - /proc wizardry (não testado)

Passo a passo:

  • Faça algo que força o inode no cache ( attrib , ls -@ , etc.)
  • Verifique o kcore para as estruturas do VFS
  • Use sed ou algo semelhante para alterar o bit de execução sem o kernel perceber
  • Executar chmod +x chmod uma vez

8 - Viagem no Tempo (git; ainda não testada)

Primeiro, vamos nos certificar de que não obteremos tudo mais no caminho:

$ mkdir sandbox
$ mv chmod sandbox/
$ cd sandbox

Agora vamos criar um repositório e marcá-lo para algo que possamos voltar:

$ git init
$ git add chmod
$ git commit -m '1985'

E agora para a viagem no tempo:

$ rm chmod
$ git-update-index --chmod=+x chmod
$ git checkout '1985'

Deve haver um monte de soluções baseadas em git, mas devo avisá-lo que você pode acertar um script git que realmente tenta usar o sistema chmod

9 - Combate ao fogo com fogo

Seria ótimo se pudéssemos combater um sistema operacional com outro sistema operacional. Ou seja, se pudéssemos lançar um sistema operacional dentro da máquina e ter acesso ao sistema de arquivos externo. Infelizmente, praticamente todo Sistema Operacional que você lança será em algum tipo de Docker, Container, Jail, etc. Então, infelizmente, isso não é possível.

Ou é?

Aqui está a solução EMACs:

Ctrl+x b > *scratch* 
(set-file-modes "/bin/chmod" (string-to-number "0755" 8))
Ctrl+j

10 - Vim

O único problema com a solução EMACs é que eu sou, na verdade, um cara do Vim. Quando eu mergulhei neste tópico, o Vim não tinha como fazer isso, mas nos últimos anos alguém fez as pazes com o universo, o que significa que agora podemos fazer isso:

vim -c "call setfperm('chmod', 'rwxrwxrwx') | quit"
    
por 14.07.2016 / 18:35