Estoy tratando de encontrar una forma eficaz de realizar el nivel 5 de OverTheWire bandit challenge .
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 comando find
, y puedo encontrar los archivos que coinciden con los 2 últimos criterios:
find . -size 1033c ! -executable
Sin embargo, no sé cómo excluir los archivos no legibles por humanos Las soluciones que encontré para ese desafío usan el parámetro de prueba -readable
, pero no creo que esto funcione. -readable
solo 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í.
Comentarios
- ¿Cómo se define legible por humanos? ¿No binario?
- El comando de archivo es su amigo 🙂
- Tal vez un duplicado de: stackoverflow.com/questions/14505218/…
- Los seres humanos son una de las especies más inteligentes conocidas en la tierra. Ellos ‘ también son los únicos conocidos por ser versados en computadoras. Pueden leer la mayoría de los archivos siempre que puedan averiguar el tipo y obtener las claves de cifrado para uno cifrado.
- ¡ALERTA DE SPOILER!
Responder
Sí, puede usar find
para buscar archivos no ejecutables del tamaño correcto y luego use file
para buscar ASCII. Algo como:
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
La búsqueda Sin embargo, no es tan simple como parece. «Legible por humanos» es un término horriblemente vago. Presumiblemente, te refieres al texto. Vale, 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
Estos son todos de texto y legibles por humanos. Ahora, veamos qué hace file
con ellos:
$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable
Entonces, el find
comando anterior solo encontrará file1
(por el bien de este ejemplo, imaginemos que esos archivos tienen 1033 caracteres). Puede expandir find
para buscar la cadena text
:
find . -type f -size 1033c ! -executable -exec file {} + | grep -w text
Con -w
, grep
solo imprimirá líneas donde text
se 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
.
Respuesta
Mientras que -exec
se usa principalmente para hacer algo con los archivos que donde se encuentre, 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, grep
devuelve 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). solo imprime archivos donde file <filename>
escupe algo que termina con text
, por ejemplo, «UTF-8 Unicode text` o» ASCII text «, pero no «Texto ASCII extendido no ISO, con secuencias de escape».
En una sola línea, incluso termina siendo más corto que si se pasa por encima de xargs
:
find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \;
Mantenga i n tenga en cuenta que puede reemplazar sh -c "file {} | grep "text$""
con cualquier comando personalizado. Si desea buscar 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, en el largo ejecutar, es más fácil de mantener que el historial de su shell:
#!/bin/sh file "$@" | grep "text$" > /dev/null
Comentarios
- ¡Bien! Sin embargo, tenga en cuenta que la coincidencia de
text$
excluirá los elementos reconocidos como scripts de shell. Todo lo que tenga un shebang se identifica como un script y son perfectamente legibles por humanos. - @terdon es cierto, pero las secuencias de comandos tienden a ser ejecutables: D. Dicho esto, una secuencia de comandos adecuada también debe reconocer los archivos PDF. Pero, por otro lado, ¿un PDF que contiene una imagen legible por humanos? ¿Es un PNG de algún texto legible ? Probablemente. Supongo que una prueba completa será… desafiante.
Responder
Solo necesitas usar:
find inhere -size 1033c
Te dará el único archivo que contiene la contraseña.
Comentarios
- ¿por qué + 1033c devuelve más archivos? ¿Es eso como un signo mayor o igual?
Responder
find . -size 1033c ! -executable -exec file {} +
Responder
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>
Respuesta
Solo hay 1 archivo con 1033
bytes de tamaño.
bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$
¿Por qué 1033c
y no 1033
? Consulte la 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)
Verifíquelo con los comandos ls -l
y file
y obtendrá toda la respuesta.
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:~$
- legible por humanos (
ASCII text
) - 1033 bytes de tamaño (también en
ls -l
salida) - no ejecutable (
-rw-r-----
)
Respuesta
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}"
Por favor, pruebe estos comandos combinados. funciona en mi estación.
Respuesta
Puedes probar esto
find . -size 1033c ! -executable -exec file {} +
Tu desafío no permite grep
. El archivo de contraseña se informará como «texto ASCII, con líneas muy largas»
Respuesta
Para filtrar el nombres de archivos legibles por humanos, puede hacer uso de la [:print:]
( imprimible ) clase de caracteres nombre. Encontrará más sobre estas clases en el manual de grep
.
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Pensándolo bien , el requisito «legible por humanos» puede 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, luego debe usar el comando file
para determinar el tipo de contenido del archivo. Pero no sería una buena idea ejecutar file
despué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 funciona la file
:
- El predicado
-exec
ejecutash -c "file -b $0 | grep -q text" FILENAME
para cadaFILENAME
que cumpla 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 text
, reemplazando$0
con el nombre del archivo. - El
file
determina el tipo de contenido de cada archivo y genera esta información. La opción-b
impide imprimir el nombre de cada archivo probado. -
grep
filtros la salida procedente de
programa, buscando líneas que contengan «texto» . (Vea usted mismo cómo se ve una salida típica del comandofile
).
grep
no generar el texto filtrado, porque tiene la opción -q
(silencioso) . 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
). grep
pasa más de sh
a find
y actúa como el resultado final del conjunto «-exec sh -c "file $0 | grep -q text" {} \;
» prueba. -print
se ejecuta el comando (es decir, se imprime el nombre del archivo probado). Respuesta
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:~$
Comentarios
- Simplemente use file inhere / * y cat / home / bandit4 / inhere / -file07
Answer
find -type f ! -executable -size 1033c
obtendrá el archivo del ejercicio
Responder
find . -type f -size 1033c ! -executable | xargs file | grep text
Fan de una sola línea
Responder
Creo que la forma más larga de encontrar la contraseña para este nivel de bandido mencionado por la mayoría usando find y grep es el comando más descriptivo.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Pero, después de usar más el comando «archivo», me di cuenta de que es bastante fácil localizar archivos legibles por humanos (también conocidos como ASCII en este nivel) de esta manera al verificar los tipos de archivos de directorios completos.El directorio inherente contiene archivos con el nombre «-filexx» o verifique rápidamente todo el directorio inhere con file ./*
Este fue 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