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"