Estou tentando encontrar uma maneira eficiente de fazer o nível 5 do Desafio de bandido OverTheWire .
De qualquer forma, eu tenho um monte de arquivos, e só há um que respeita os seguintes critérios:
- Legível por humanos
- 1033 bytes de tamanho
- Não executável
No momento, estou usando o comando find
, e consigo encontrar os arquivos que correspondem aos 2 últimos critérios:
find . -size 1033c ! -executable
No entanto, não sei como excluir arquivos não legíveis por humanos . As soluções que encontrei para esse desafio usam o parâmetro de teste -readable
, mas acho que não funciona. -readable
olha apenas as permissões dos arquivos “, e não seu conteúdo, enquanto a descrição do desafio pede um arquivo ASCII ou algo parecido.
Comentários
- Como você define legível por humanos? Não é binário?
- o comando de arquivo é seu amigo 🙂
- Talvez duplicado de: stackoverflow.com/questions/14505218/…
- Os humanos são uma das espécies conhecidas mais inteligentes na terra. Eles ‘ também são os únicos que conhecem computadores. Eles podem ler a maioria dos arquivos, desde que possam descobrir o tipo e obter as chaves de criptografia para um criptografado.
- ALERTA DE SPOILER !!
Resposta
Sim, você pode usar find
para procurar arquivos não executáveis do tamanho certo e, em seguida, use file
para verificar o ASCII. Algo como:
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
O questi on, no entanto, não é tão simples quanto parece. “Legível por humanos” é um termo terrivelmente vago. Presumivelmente, você quer dizer texto. OK, mas que tipo de texto? Somente caracteres latinos ASCII? Unicode completo? Por exemplo, considere estes três arquivos:
$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo
Todos são textos e podem ser lidos por humanos. Agora, vamos ver o que file
faz com eles:
$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable
Então, o acima encontrará apenas file1
(para o propósito deste exemplo, vamos imaginar que esses arquivos tivessem 1033 caracteres). Você pode expandir o find
para procurar a string text
:
find . -type f -size 1033c ! -executable -exec file {} + | grep -w text
Com o -w
, grep
imprimirá apenas as linhas onde text
for encontrado como uma palavra autônoma. Isso deve ser muito próximo do que você deseja, mas não posso garantir que não haja nenhum outro tipo de arquivo cuja descrição também possa incluir a string text
.
Resposta
Enquanto -exec
é usado principalmente para fazer algo com os arquivos que onde for encontrado, ele também pode atuar como um teste. Portanto, podemos adicioná-lo aos seus outros critérios:
find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \;
Lembre-se, grep
retorna diferente de zero quando o padrão não foi encontrado, e sh -c "COMMAND"
retornará o resultado da avaliação (contanto que seja válido). Portanto, isso irá imprime apenas arquivos onde file <filename>
cospe algo que termina com text
, por exemplo, “UTF-8 Unicode text` ou” ASCII text “, mas não “Texto ASCII estendido não ISO, com sequências de escape”.
Em uma única linha, termina até mesmo mais curto do que ultrapassar xargs
:
find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \;
Mantenha i Lembre-se de que você pode substituir sh -c "file {} | grep "text$""
por qualquer comando personalizado. Se você quiser verificar se há algo muito complexo, pode ser uma idéia melhor fornecer um script de shell e usá-lo em seu lugar:
find . -size 1033c -not -executable -exec is_human_readable.sh {} \;
que, no longo executar, é mais fácil de manter do que o histórico do seu shell:
#!/bin/sh file "$@" | grep "text$" > /dev/null
Comentários
- Legal! Observe, entretanto, que a correspondência de
text$
excluirá coisas reconhecidas como scripts de shell. Qualquer coisa com um shebang é identificada como um script e são perfeitamente legíveis por humanos. - @terdon true, mas os scripts tendem a ser executáveis: D. Dito isso, um script adequado também deve reconhecer PDFs. Mas, por outro lado, um PDF contendo uma imagem humana legível ? É um PNG de algum texto legível ? Provavelmente. Acho que um teste completo será … desafiador.
Resposta
Você só precisa usar:
find inhere -size 1033c
Ele lhe dará o único arquivo que contém a senha.
Comentários
- por que + 1033c retorna mais arquivos? é como um sinal de maior ou igual?
Resposta
find . -size 1033c ! -executable -exec file {} +
Resposta
Basta executar o seguinte no conteúdo do diretório:
$ file -- * -file00: data -file01: data -file02: data -file03: data -file04: data -file05: data -file06: data -file07: ASCII text -file08: data -file09: data $ cat -- \-file07 <output>
Resposta
Há apenas 1 arquivo com 1033
bytes de tamanho.
bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$
Por que 1033c
e não 1033
? Verifique a man
página
-size n[cwbkMG] File uses n units of space, rounding up. The following suffixes can be used: `b" for 512-byte blocks (this is the default if no suffix is used) `c" for bytes `w" for two-byte words `k" for Kilobytes (units of 1024 bytes) `M" for Megabytes (units of 1048576 bytes) `G" for Gigabytes (units of 1073741824 bytes)
Verifique com os comandos ls -l
e file
e você obterá todas as respostas.
bandit5@bandit:~$ ls -l ./inhere/maybehere07/.file2 -rw-r----- 1 root bandit5 1033 May 7 20:15 ./inhere/maybehere07/.file2 bandit5@bandit:~$ bandit5@bandit:~$ file ./inhere/maybehere07/.file2 ./inhere/maybehere07/.file2: ASCII text, with very long lines bandit5@bandit:~$
- legível por humanos (
ASCII text
) - 1.033 bytes de tamanho (também em
ls -l
saída) - não executável (
-rw-r-----
)
Resposta
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}"
Por favor, tente estes comandos combinados. funciona na minha estação.
Resposta
Você pode tentar isso
find . -size 1033c ! -executable -exec file {} +
Seu desafio não permite grep
. arquivo de senha será relatado como “texto ASCII, com linhas muito longas”
Resposta
Para filtrar o nomes de arquivos legíveis por humanos, você pode usar a [:print:]
( imprimível ) classe de caracteres nome. Você encontrará mais sobre essas classes no manual de grep
.
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Pensando bem , o requisito “legível por humanos” pode se referir ao conteúdo do arquivo, em vez de seu nome. Em outras palavras, você estaria procurando por arquivos de texto . Isso é um pouco mais complicado. Como @ D_Bye sugeriu em um comentário, você deve usar o comando file
para determinar o tipo de conteúdo do arquivo. Mas não seria uma boa ideia executar file
após um pipe, porque complicaria a tarefa de exibir o nome do arquivo. Aqui “é o que eu sugiro:
find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print
É assim que a file
-parte funciona:
- O
-exec
predicado executash -c "file -b $0 | grep -q text" FILENAME
para cadaFILENAME
que satisfaça todas as condições anteriores (tipo, tamanho, não executável). - Para cada um desses arquivos , um shell (
sh
) executa este breve script :file -b $0 | grep -q text
, substituindo$0
pelo nome do arquivo. - O
file
determina o tipo de conteúdo de cada arquivo e exibe essas informações. A opção-b
impede a impressão de nome de cada arquivo testado. -
grep
filtros a saída vindo de
programa, procurando por linhas contendo “texto” . (Veja por si mesmo, como uma saída típica do comandofile
se parece.)
grep
não enviar o texto filtrado, porque tem a opção -q
(silencioso) fornecida . O que ele faz é apenas alterar seu status de saída para 0
(que representa “verdadeiro” – o texto filtrado foi encontrado) ou 1 (significando “erro “- o texto ” text “ não apareceu na saída de file
). grep
é passado adiante por sh
para find
e atua como o resultado final do todo Teste “-exec sh -c "file $0 | grep -q text" {} \;
“. -print
o comando é executado (ou seja, o nome do arquivo testado é impresso). Resposta
bandit4@bandit:~$ ls inhere bandit4@bandit:~$ file inhere/* inhere/-file00: data inhere/-file01: data inhere/-file02: data inhere/-file03: data inhere/-file04: data inhere/-file05: data inhere/-file06: data inhere/-file07: ASCII text inhere/-file08: data inhere/-file09: data bandit4@bandit:~$ pwd /home/bandit4 bandit4@bandit:~$ cat /home/bandit4/inhere/-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh bandit4@bandit:~$
Comentários
- Basta usar o arquivo inhere / * e cat / home / bandit4 / inhere / -file07
Resposta
find -type f ! -executable -size 1033c
obterá o arquivo do exercício
Resposta
find . -type f -size 1033c ! -executable | xargs file | grep text
Fan of one liners
Resposta
Eu acho que a maneira mais longa de encontrar a senha para este nível de bandido mencionado acima usando find e grep é o comando mais descritivo.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Mas, depois de usar mais o comando “arquivo”, percebi que é muito fácil localizar arquivos legíveis por humanos (também conhecidos como ASCII neste nível), verificando todos os tipos de arquivos de diretórios.O diretório inhere contém arquivos com o nome “-filexx” ou verifique rapidamente todo o diretório inhere com file ./*
Essa foi minha abordagem.
bandit4@bandit:~/inhere$ file ./* ./-file00: data ./-file01: data ./-file02: data ./-file03: data ./-file04: data ./-file05: data ./-file06: data ./-file07: ASCII text ./-file08: data ./-file09: data bandit4@bandit:~/inhere$ cat ./-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh