Encuentra archivos legibles por humanos

14

Estoy tratando de encontrar una manera eficiente de hacer el nivel 5 del desafío de bandido OverTheWire .

De todos modos, tengo un montón de archivos, y solo hay uno que respeta los siguientes criterios:

  • Legible por humanos
  • 1033 bytes de tamaño
  • No ejecutable

En este momento, estoy usando el findcomando y puedo encontrar los archivos que coinciden con los 2 últimos criterios:

find . -size 1033c ! -executable

Sin embargo, no sé cómo excluir archivos no legibles por humanos. Las soluciones que encontré para ese desafío usan el -readableparámetro de prueba, pero no creo que esto funcione. -readablesolo mira los permisos de los archivos, y no su contenido, mientras que la descripción del desafío solicita un archivo ASCII o algo así.

J.Doe
fuente
1
¿Cómo se define la legibilidad humana? No binario?
terdon
2
comando de archivo es tu amigo :)
Romeo Ninov
Tal vez duplicado de: stackoverflow.com/questions/14505218/…
zuazo
3
Los humanos son una de las especies conocidas más inteligentes en la tierra. También son los únicos que se conocen con computadoras. Pueden leer la mayoría de los archivos siempre que puedan averiguar el tipo y obtener las claves de cifrado para uno cifrado.
Stéphane Chazelas
1
¡¡ALERTA DE SPOILER!!
Dan Bolser

Respuestas:

17

Sí, puede usar findpara buscar archivos no ejecutables del tamaño correcto y luego usar filepara verificar ASCII. Algo como:

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

La pregunta, sin embargo, no es tan simple como parece. 'Legible por humanos' es un término terriblemente vago. Presumiblemente, te refieres al texto. OK, pero ¿qué tipo de texto? ¿Carácter latino ASCII solamente? Unicode completo? Por ejemplo, considere estos tres archivos:

$ cat file1
abcde
$ cat file2
αβγδε
$ cat file3
abcde
αβγδε
$ cat file4
#!/bin/sh
echo foo

Todos estos son legibles por texto y humanos. Ahora, veamos qué filehace de ellos:

$ file *
file1: ASCII text
file2: UTF-8 Unicode text
file3: UTF-8 Unicode text
file4: POSIX shell script, ASCII text executable

Entonces, el findcomando anterior solo encontrará file1(por el bien de este ejemplo, imaginemos que esos archivos tenían 1033 caracteres). Puede expandir findpara buscar la cadena text:

find . -type f -size 1033c ! -executable -exec file {} + | grep -w text

Con el -w, grepsolo imprimirá líneas donde textse encuentre como una palabra independiente. Eso debería estar bastante cerca de lo que desea, pero no puedo garantizar que no haya otro tipo de archivo cuya descripción también pueda incluir la cadena text.

terdon
fuente
4

Si bien -execse usa principalmente para hacer algo con los archivos que se encontraron, también puede actuar como una prueba. Por lo tanto, podemos agregarlo a sus otros criterios:

find . \
  -size 1033c \
  -not -executable \
  -exec sh -c 'file {} | grep "text$"' \;

Recuerde, grepdevuelve un valor distinto de cero cuando no se encontró el patrón y sh -c "COMMAND"devolverá el resultado de la evaluación (siempre que sea válido). Por lo tanto, esto solo imprimirá archivos donde file <filename>escupe algo que termina con text, por ejemplo, "texto Unicode UTF-8" o "texto ASCII", pero no "texto ASCII extendido no ISO, con secuencias de escape".

En una sola línea, incluso termina más corto que al pasar xargs:

find . -size 1033c -not -executable -exec sh -c 'file {} | grep "text$"' \;

Tenga en cuenta que puede reemplazar sh -c 'file {} | grep "text$"'con cualquier comando personalizado. Si desea verificar algo muy complejo, podría ser una mejor idea proporcionar un script de shell y usarlo en su lugar:

find . -size 1033c -not -executable -exec is_human_readable.sh {} \;

que, a la larga, es más fácil de mantener que el historial de su shell:

#!/bin/sh
file "$@" | grep "text$" > /dev/null
Zeta
fuente
¡Agradable! Sin embargo, text$tenga en cuenta que la coincidencia excluirá cosas reconocidas como scripts de shell. Cualquier cosa con un shebang se identifica como un guión, y esos son perfectamente legibles para los humanos.
terdon
@terdon true, pero los scripts tienden a ser ejecutables: D. Dicho esto, una secuencia de comandos adecuada también debe reconocer los archivos PDF. Pero, por otro lado, ¿es un PDF que contiene una imagen legible para humanos ? ¿Es legible un PNG de algún texto ? Probablemente. Supongo que una prueba completa será ... desafiante.
Zeta
2
find . -size 1033c ! -executable -exec file {} +
usuario305801
fuente
1

Solo necesitas usar:

find inhere -size 1033c

Le dará el único archivo que contiene la contraseña.

BugHunterUK
fuente
¿Por qué + 1033c devuelve más archivos? ¿Es eso como un signo de mayor o igual?
szeitlin
1

Simplemente ejecute lo siguiente contra el contenido del directorio:

$ 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>
t0lkim
fuente
0
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: '{print $1}'

Por favor, intente estos comandos combinados. Funciona en mi estación.

Fengbo Wu
fuente
0

Puedes probar esto

find . -size 1033c ! -executable -exec file {} +

Tu desafío no lo permite grep. el archivo de contraseña se informará como "texto ASCII, con líneas muy largas"

Emmanuel
fuente
0

Para filtrar los nombres de archivo legibles por humanos, puede hacer uso del nombre de la clase de caracteres[:print:] ( imprimible ) . Encontrará más información sobre tales clases en el manual de .grep

find . -type f -size 1033c -name "[[:print:]]*" ! -executable

Pensándolo bien, el requisito de "lectura humana" podría referirse al contenido del archivo, en lugar de su nombre. En otras palabras, estaría buscando archivos de texto . Eso es un poco más complicado. Como @D_Bye sugirió en un comentario, debe usar el filecomando para determinar el tipo de contenido del archivo. Pero no sería una buena idea correr filedespués de una tubería, porque complicaría la tarea de mostrar el nombre del archivo. Esto es lo que sugiero:

find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print

Así es brevemente cómo filefunciona la parte:

  • El -execpredicado se ejecuta sh -c 'file -b $0 | grep -q text' FILENAMEpara cada uno FILENAMEque satisfaga todas las condiciones anteriores (tipo, tamaño, no ejecutable).
  • Para cada uno de esos archivos, un shell ( sh) ejecuta este breve script :, file -b $0 | grep -q textreemplazando $0con el nombre del archivo.
  • El fileprograma determina el tipo de contenido de cada archivo y genera esta información. La -bopción impide imprimir el nombre de cada archivo probado.
  • grepfiltra la salida proveniente del fileprograma, buscando líneas que contengan "texto" . (Vea usted mismo cómo se fileve una salida típica del comando).
  • Pero grepno genera el texto filtrado, porque tiene la -qopción (silenciosa) dada. Lo que hace es cambiar su estado de salida a 0(que representa "verdadero" - se encontró el texto filtrado) o 1 (que significa "error" - el texto "texto" no apareció en la salida de file).
  • El estado de salida verdadero / falso proveniente de grepse pasa más sha finday actúa como el resultado final de la " -exec sh -c 'file $0 | grep -q text' {} \;" prueba completa.
  • En caso de que la prueba anterior sea verdadera , -printse ejecuta el comando (es decir, se imprime el nombre del archivo probado).
Alfran
fuente
0
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:~$ 
jesse_b
fuente
Simplemente use el archivo inhere / * y cat / home / bandit4 / inhere / -file07
0
find  -type f ! -executable -size 1033c

le conseguirá el archivo del ejercicio

mano fría
fuente
0
find . -type f -size 1033c ! -executable | xargs file | grep text

Fan de una camisa

Caballero oscuro
fuente
0

Creo que la forma más larga de encontrar la contraseña para este nivel de bandido mencionado por la mayoría de los anteriores utilizando find y grep es el comando más descriptivo.

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

Pero, después de usar el comando 'archivo' más, me di cuenta de que es bastante fácil localizar archivos legibles por humanos (también conocido como ASCII en este nivel) de esta manera al verificar los tipos de archivos de directorios completos. El directorio inhere contiene archivos con el nombre '-filexx' o verifica rápidamente todo el directorio inhere confile ./*

Aquí estaba mi enfoque.

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
Curtidor
fuente
-2
du --human-readable | find -not -executable -size 1033c

obtendrá tu resultado

Varun Rathore
fuente