Sto cercando di trovare un modo efficiente per eseguire il livello 5 del OverTheWire Bandit Challenge .
Comunque, ho un sacco di file e ce nè solo uno che rispetta i seguenti criteri:
- Leggibile dalluomo
- 1033 byte di dimensione
- Non eseguibile
In questo momento sto usando il comando find
e sono in grado di trovare i file che corrispondono agli ultimi 2 criteri:
find . -size 1033c ! -executable
Tuttavia, non so come escludere file non leggibili dalluomo Le soluzioni che ho trovato per questa sfida utilizzano il parametro di test -readable
, ma non credo che funzioni. -readable
guarda solo i permessi dei file “e non il loro contenuto, mentre la descrizione della sfida richiede un file ASCII o qualcosa del genere.
Commenti
- Come definisci leggibile dalluomo? Non binario?
- Il comando file è tuo amico 🙂
- Forse duplicato di: stackoverflow.com/questions/14505218/…
- Gli esseri umani sono una delle specie conosciute più intelligenti sulla terra. Loro ‘ sono anche gli unici conosciuti per i computer. Possono leggere la maggior parte dei file a condizione che possano scoprire il tipo e ottenere le chiavi di crittografia per quello crittografato.
- AVVISO SPOILER !!
Risposta
Sì, puoi usare find
per cercare file non eseguibili della dimensione corretta, quindi utilizzare file
per verificare la presenza di ASCII. Qualcosa come:
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
The questi su, tuttavia, non è così semplice come sembra. “Leggibile dalluomo” è un termine orribilmente vago. Presumibilmente, intendi testo. OK, ma che tipo di testo? Solo caratteri latini ASCII? Unicode completo? Ad esempio, considera questi tre file:
$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo
Questi sono tutti di testo e leggibili dalluomo. Ora, vediamo cosa ne ricava file
:
$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable
Quindi, precedente troverà solo file1
(per il bene di questo esempio, immaginiamo che quei file contengano 1033 caratteri). Potresti espandere find
per cercare la stringa text
:
find . -type f -size 1033c ! -executable -exec file {} + | grep -w text
Con -w
, grep
stamperà solo le righe in cui text
si trova come una parola a sé stante. Questo dovrebbe essere abbastanza vicino a quello che vuoi, ma “non posso garantire che non ci siano altri tipi di file la cui descrizione potrebbe includere anche la stringa text
.
Risposta
Mentre -exec
viene utilizzato principalmente per fare qualcosa con i file che se presente, può anche fungere da test. Pertanto, possiamo aggiungerlo agli altri criteri:
find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \;
Ricorda, grep
restituisce un valore diverso da zero quando il pattern non è stato trovato e sh -c "COMMAND"
restituirà il risultato della valutazione (purché sia valido). Quindi stampa solo i file in cui file <filename>
sputa qualcosa che termina con text
, ad esempio “UTF-8 Unicode text` o” ASCII text “, ma non “Testo ASCII esteso non ISO, con sequenze di escape”.
In una singola riga, finisce anche per essere più corto di xargs
:
find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \;
Mantieni i Tieni presente che puoi sostituire sh -c "file {} | grep "text$""
con qualsiasi comando personalizzato. Se vuoi controllare qualcosa di molto complesso, potrebbe essere unidea migliore fornire uno script di shell e usarlo invece:
find . -size 1033c -not -executable -exec is_human_readable.sh {} \;
che, nel lungo run, è più facile da mantenere rispetto alla cronologia della shell:
#!/bin/sh file "$@" | grep "text$" > /dev/null
Commenti
- Bello! Nota, tuttavia, che la corrispondenza con
text$
escluderà le cose riconosciute come script di shell. Qualsiasi cosa con uno shebang è identificato come uno script e sono perfettamente leggibili dalluomo. - @terdon true, ma gli script tendono ad essere eseguibili: D. Detto questo, uno script corretto dovrebbe riconoscere anche i PDF. Ma daltra parte, un PDF contenente unimmagine è leggibile ? È un PNG di testo leggibile ? Probabilmente. Immagino che un test completo sarà … impegnativo.
Risposta
Devi solo usare:
find inhere -size 1033c
Ti darà lunico file che contiene la password.
Commenti
- perché + 1033c restituisce più file? è come un segno di maggiore o uguale?
Risposta
find . -size 1033c ! -executable -exec file {} +
Risposta
Esegui semplicemente quanto segue sul contenuto della directory:
$ 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>
Risposta
Esiste un solo file con 1033
byte di dimensione.
bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$
Perché 1033c
e non 1033
? Controlla la man
pagina
-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)
Verificalo con il comando ls -l
e file
e otterrai tutte le risposte.
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:~$
- human-readable (
ASCII text
) - 1033 byte di dimensione (anche in
ls -l
output) - non eseguibile (
-rw-r-----
)
Risposta
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}"
Prova questi comandi combinati. funziona sulla mia stazione.
Rispondi
Puoi provare questo
find . -size 1033c ! -executable -exec file {} +
La tua sfida non consente grep
. il file della password verrà segnalato come “testo ASCII, con righe molto lunghe”
Risposta
Per filtrare il nomi di file leggibili dalluomo, puoi utilizzare la [:print:]
( stampabile ) classe di caratteri nome. Troverai di più su queste classi nel manuale di grep
.
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Ripensandoci , il requisito “leggibile dalluomo” potrebbe fare riferimento al contenuto del file, invece del suo nome. In altre parole, cercheresti file di testo . Questo è un po più complicato. Come @ D_Bye suggerito in un commento, dovresti quindi utilizzare il comando file
per determinare il tipo di contenuto del file. Ma non sarebbe una buona idea eseguire file
dopo una pipe, perché complicherebbe il compito di visualizzare il nome del file. Ecco cosa suggerisco:
find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print
Ecco brevemente come funziona la parte file
:
- Il predicato
-exec
viene eseguitosh -c "file -b $0 | grep -q text" FILENAME
per ogniFILENAME
che soddisfa tutte le condizioni precedenti (tipo, dimensione, non eseguibile). - Per ciascuno di questi file , una shell (
sh
) esegue questo breve script :file -b $0 | grep -q text
, sostituendo$0
con il nome del file. - Il
file
determina il tipo di contenuto di ogni file e restituisce queste informazioni. Lopzione-b
impedisce la stampa del nome di ogni file testato. -
grep
filtri luscita proveniente da
programma, cercando righe contenenti “testo” . (Guarda tu stesso come appare un tipico output del comandofile
.)
grep
no mostra il testo filtrato, perché ha lopzione -q
(silenzioso) data . Quello che fa è semplicemente cambiare il suo stato di uscita in 0
(che rappresenta “true” – il testo filtrato è stato trovato) o 1 (che significa “errore “- il testo ” testo “ non appariva nelloutput di file
). grep
viene passato ulteriormente da sh
a find
e funge da risultato finale dellintero “-exec sh -c "file $0 | grep -q text" {} \;
” test. -print
viene eseguito il comando (ovvero viene stampato il nome del file testato). Risposta
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:~$
Commenti
- Usa semplicemente file inhere / * e cat / home / bandit4 / inhere / -file07
Risposta
find -type f ! -executable -size 1033c
ti darà il file dellesercizio
Risposta
find . -type f -size 1033c ! -executable | xargs file | grep text
Fan di una riga
Risposta
Penso che il modo più lungo per trovare la password per questo livello di bandito menzionato dalla maggior parte dei precedenti utilizzando find e grep sia il comando più descrittivo.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Ma, dopo aver usato il comando “file” more, mi sono reso conto che è abbastanza facile individuare i file leggibili dalluomo (noti anche come ASCII in questo livello) in questo modo controllando i tipi di file di unintera directory.La directory inhere contiene file con il nome “-filexx” o controlla rapidamente lintera directory inhere con file ./*
Ecco il mio approccio.
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