Trouver des fichiers lisibles par l'homme

14

J'essaie de trouver un moyen efficace de faire le niveau 5 du défi bandit OverTheWire .

Quoi qu'il en soit, j'ai un tas de fichiers, et il n'y en a qu'un qui respecte les critères suivants:

  • Lisible par l'homme
  • Taille de 1033 octets
  • Non exécutable

En ce moment, j'utilise la findcommande, et je peux trouver les fichiers correspondant aux 2 derniers critères:

find . -size 1033c ! -executable

Cependant, je ne sais pas comment exclure les fichiers non lisibles par l'homme. Les solutions que j'ai trouvées pour ce défi utilisent le -readableparamètre de test, mais je ne pense pas que cela fonctionne. -readablene regarde que les autorisations des fichiers, et non son contenu, tandis que la description du défi demande un fichier ASCII ou quelque chose comme ça.

J.Doe
la source
1
Comment définissez-vous lisible par l'homme? Pas binaire?
terdon
2
la commande de fichier est votre ami :)
Romeo Ninov
Peut-être un double de: stackoverflow.com/questions/14505218/…
zuazo
3
Les humains sont l'une des espèces connues les plus intelligentes au monde. Ils sont également les seuls à être familiarisés avec les ordinateurs. Ils peuvent lire la plupart des fichiers à condition qu'ils puissent trouver le type et obtenir les clés de chiffrement pour une clé chiffrée.
Stéphane Chazelas
1
ALERTE SPOIL!!
Dan Bolser

Réponses:

17

Oui, vous pouvez utiliser findpour rechercher des fichiers non exécutables de la bonne taille, puis utiliser filepour rechercher ASCII. Quelque chose comme:

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

La question, cependant, n'est pas aussi simple qu'il y paraît. «Lisible par l'homme» est un terme horriblement vague. Vraisemblablement, vous voulez dire du texte. OK, mais quel genre de texte? Caractère latin ASCII uniquement? Unicode complet? Par exemple, considérez ces trois fichiers:

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

Ce sont tous des textes et lisibles par l'homme. Voyons maintenant ce qui en filefait:

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

Ainsi, la findcommande ci-dessus ne trouvera que file1(pour cet exemple, imaginons que ces fichiers aient 1033 caractères). Vous pouvez développer le findpour rechercher la chaîne text:

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

Avec le -w, grepimprime uniquement les lignes où textse trouve en tant que mot autonome. Cela devrait être assez proche de ce que vous voulez, mais je ne peux pas garantir qu'il n'y a pas d'autre type de fichier dont la description pourrait également inclure la chaîne text.

terdon
la source
4

Bien qu'il -execsoit principalement utilisé pour faire quelque chose avec les fichiers qui ont été trouvés, il peut également servir de test. Par conséquent, nous pouvons l'ajouter à vos autres critères:

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

Rappelez-vous, grepretourne non nul lorsque le modèle n'a pas été trouvé, et sh -c "COMMAND"retournera le résultat de l'évaluation (tant qu'il est valide). Donc, cela n'imprimera que les fichiers où file <filename>crache quelque chose qui se termine par text, par exemple "Texte Unicode UTF-8" ou "Texte ASCII", mais pas "Texte ASCII étendu non ISO, avec séquences d'échappement".

En une seule ligne, cela finit même plus court que de parcourir xargs:

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

N'oubliez pas que vous pouvez remplacer sh -c 'file {} | grep "text$"'par n'importe quelle commande personnalisée. Si vous souhaitez rechercher quelque chose de très complexe, il peut être préférable de fournir un script shell et de l'utiliser à la place:

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

qui, à long terme, est plus facile à entretenir que l'historique de votre shell:

#!/bin/sh
file "$@" | grep "text$" > /dev/null
Zeta
la source
Agréable! Notez cependant que la correspondance text$exclura les éléments reconnus comme scripts shell. Tout ce qui a un shebang est identifié comme un script, et ceux-ci sont parfaitement lisibles par l'homme.
terdon
@terdon true, mais les scripts ont tendance à être exécutables: D. Cela étant dit, un script approprié devrait également reconnaître les PDF. Mais d'un autre côté, un PDF contenant une image est-il lisible par l' homme ? Le PNG d'un texte est-il lisible ? Probablement. Je suppose qu'un test complet sera… difficile.
Zeta
2
find . -size 1033c ! -executable -exec file {} +
user305801
la source
1

Il vous suffit d'utiliser:

find inhere -size 1033c

Il vous donnera le seul fichier contenant le mot de passe.

BugHunterUK
la source
pourquoi + 1033c renvoie-t-il plus de fichiers? est-ce comme un signe supérieur ou égal à?
szeitlin
1

Exécutez simplement ce qui suit sur le contenu du répertoire:

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

Veuillez essayer ces commandes combinées. cela fonctionne sur ma station.

Fengbo Wu
la source
0

Vous pouvez essayer ceci

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

Votre défi ne le permet pas grep. le fichier de mot de passe sera signalé comme "texte ASCII, avec de très longues lignes"

Emmanuel
la source
0

Pour filtrer les noms de fichiers lisibles par l'homme, vous pouvez utiliser le nom de classe de caractères[:print:] ( imprimable ) . Vous trouverez plus d'informations sur ces classes dans le manuel de .grep

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

Dans un second temps, l'exigence "lisible par l'homme" pourrait faire référence au contenu du fichier, au lieu de son nom. En d'autres termes, vous rechercheriez des fichiers texte . C'est un peu plus délicat. Comme @D_Bye l'a suggéré dans un commentaire, vous devez ensuite utiliser la filecommande pour déterminer le type de contenu du fichier. Mais ce ne serait pas une bonne idée de courir fileaprès un pipe, car cela compliquerait la tâche d'afficher le nom du fichier. Voici ce que je suggère:

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

Voici brièvement comment filefonctionne -part:

  • Le -execprédicat s'exécute sh -c 'file -b $0 | grep -q text' FILENAMEpour chacun FILENAMEqui remplit toutes les conditions précédentes (type, taille, non exécutable).
  • Pour chacun de ces fichiers, un shell ( sh) exécute ce court script :file -b $0 | grep -q text , en remplaçant $0le nom de fichier.
  • Le fileprogramme détermine le type de contenu de chaque fichier et génère ces informations. L' -boption empêche l'impression du nom de chaque fichier testé.
  • grepfiltre la sortie provenant du fileprogramme, recherchant les lignes contenant du "texte" . (Voyez par vous-même, comment une sortie typique dufile ressemble commande.)
  • Mais grepne produit pas le texte filtré, car il a l' -qoption (silencieuse) donnée. Ce qu'il fait, c'est simplement changer son état de sortie en 0(ce qui représente "vrai" - le texte filtré a été trouvé) ou 1 (ce qui signifie "erreur" - le texte "texte" n'apparaissait pas dans la sortie de file).
  • Le statut de sortie vrai / faux provenant de grepest ensuite transmis shà findet agit comme le résultat final de l'ensemble du " -exec sh -c 'file $0 | grep -q text' {} \;" test.
  • Si le test ci-dessus est retourné vrai , la -printcommande est exécutée (c'est-à-dire que le nom du fichier testé est imprimé).
Alfran
la source
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
la source
Utilisez simplement le fichier inhere / * et cat / home / bandit4 / inhere / -file07
0
find  -type f ! -executable -size 1033c

vous obtiendrez le fichier de l'exercice

coolhand
la source
0
find . -type f -size 1033c ! -executable | xargs file | grep text

Fan d'une doublure

Chevalier noir
la source
0

Je pense que la manière la plus longue de trouver le mot de passe pour ce niveau de bandit mentionné par la plupart ci-dessus en utilisant find et grep est la commande la plus descriptive.

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

Mais, après avoir utilisé la commande 'file' plus, j'ai réalisé qu'il était assez facile de localiser les fichiers lisibles par l'homme (aka ASCII à ce niveau) de cette façon en vérifiant les types de fichiers d'un répertoire entier. Le répertoire inhere contient des fichiers avec le nom '-filexx' ou vérifiez rapidement l'ensemble du répertoire inhere avecfile ./*

Voici mon approche.

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
Tanneur
la source
-2
du --human-readable | find -not -executable -size 1033c

obtiendra votre résultat

Varun Rathore
la source