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:~$ 
  1. human-readable (ASCII text)
  2. 1033 byte di dimensione (anche in ls -l output)
  3. 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 eseguito sh -c "file -b $0 | grep -q text" FILENAME per ogni FILENAME 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.)

  • Ma 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).
  • Lo stato di uscita vero / falso proveniente da grep viene passato ulteriormente da sh a find e funge da risultato finale dellintero “-exec sh -c "file $0 | grep -q text" {} \;” test.
  • Nel caso in cui il test precedente avesse restituito true , -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 

    Lascia un commento

    Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *