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:~$ 
  1. legível por humanos (ASCII text)
  2. 1.033 bytes de tamanho (também em ls -l saída)
  3. 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 executa sh -c "file -b $0 | grep -q text" FILENAME para cada FILENAME 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 comandofilese parece.)

  • Mas 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).
  • O status de saída verdadeiro / falso vindo de grep é passado adiante por sh para find e atua como o resultado final do todo Teste “-exec sh -c "file $0 | grep -q text" {} \;“.
  • Caso o teste acima retornasse verdadeiro , o -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 

    Deixe uma resposta

    O seu endereço de email não será publicado. Campos obrigatórios marcados com *