Jessaie de trouver un moyen efficace de faire le niveau 5 du OverTheWire bandit challenge .

Quoi quil en soit, jai un tas de fichiers, et il ny en a quun qui respecte les critères suivants:

  • Lisible par lhomme
  • Taille de 1 033 octets
  • Non exécutable

En ce moment, jutilise la commande find , et je suis capable de 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 lhomme . Les solutions que jai trouvées pour ce défi utilisent le paramètre de test -readable, mais je ne pense pas que cela fonctionne. -readable ne regarde que les permissions des fichiers, et non son contenu, tandis que la description du défi demande un fichier ASCII ou quelque chose comme ça.

Commentaires

  • Comment définissez-vous la lisibilité humaine? Non binaire?
  • La commande de fichier est votre ami 🙂
  • Peut-être un double de: stackoverflow.com/questions/14505218/…
  • Les humains sont lune des espèces connues les plus intelligentes sur terre. Ils ‘ sont également les seuls connus à être familiarisés avec les ordinateurs. Ils peuvent lire la plupart des fichiers à condition de connaître le type et d’obtenir les clés de chiffrement pour un chiffré.
  • SPOILER ALERT !!

Answer

Oui, vous pouvez utiliser find pour rechercher des fichiers non exécutables de la bonne taille, puis utilisez file pour vérifier lASCII. Quelque chose comme:

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

La quête sur, cependant, nest pas aussi simple que cela puisse paraître. «Humain lisible» 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 du texte et lisibles par lhomme. Voyons maintenant ce que file en fait:

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

Donc, le ci-dessus ne trouvera que file1 (pour les besoins de cet exemple, imaginons que ces fichiers ont 1033 caractères). Vous pouvez développer find pour rechercher la chaîne text:

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

Avec -w, grep nimprimera que les lignes où text se trouve comme un mot autonome. Cela devrait être assez proche de ce que vous voulez, mais je ne peux pas garantir quil ny a pas dautre type de fichier dont la description pourrait également inclure la chaîne text.

Réponse

Alors que -exec est principalement utilisé pour faire quelque chose avec les fichiers qui là où il est trouvé, il peut également servir de test. Par conséquent, nous pouvons lajouter à vos autres critères:

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

Noubliez pas, grep renvoie une valeur non nulle lorsque le modèle na pas été trouvé, et sh -c "COMMAND" retournera le résultat de lévaluation (tant quil est valide). imprimer uniquement les fichiers où file <filename> crache quelque chose qui se termine par text, par exemple « UTF-8 Unicode text` ou » ASCII text « , mais pas « Texte ASCII étendu non-ISO, avec séquences déchappement ».

En une seule ligne, il finit même par être plus court que daller sur xargs:

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

Garder i Noubliez pas que vous pouvez remplacer sh -c "file {} | grep "text$"" par nimporte quelle commande personnalisée. Si vous voulez vérifier quelque chose de très complexe, il peut être préférable de fournir un script shell et de lutiliser à la place:

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

qui, dans le long run, est plus facile à maintenir que lhistorique de votre shell:

#!/bin/sh file "$@" | grep "text$" > /dev/null 

Commentaires

  • Sympa! Notez, cependant, que la correspondance avec text$ exclura les éléments reconnus comme des scripts shell. Tout ce qui comporte un shebang est identifié comme un script, et ceux-ci sont parfaitement lisibles par lhomme.
  • @terdon est vrai, mais les scripts ont tendance à être exécutables: D. Cela étant dit, un script approprié devrait également reconnaître les fichiers PDF. Mais dun autre côté, un PDF contenant une image est-il lisible par lhomme ? Un PNG dun texte lisible ? Probablement. Je suppose quun test complet sera… difficile.

Réponse

Il vous suffit dutiliser:

find inhere -size 1033c 

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

Commentaires

  • pourquoi + 1033c renvoie-t-il plus de fichiers? est-ce que cest comme un signe plus grand ou égal?

Réponse

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

Réponse

Exécutez simplement ce qui suit par rapport au 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> 

Answer

Il ny a quun seul fichier avec 1033 octets de taille.

bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$ 

Pourquoi 1033c et non 1033? Consultez la page man

 -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) 

Vérifiez-le avec la commande ls -l et file, et vous obtenez toute la réponse.

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. lisible par lhomme (ASCII text)
  2. 1033 octets de taille (également en ls -l sortie)
  3. non exécutable (-rw-r-----)

Réponse

find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}" 

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

Réponse

Vous pouvez essayer ceci

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

Votre défi nautorise pas grep. Le fichier de mot de passe sera signalé comme « texte ASCII, avec de très longues lignes »

Réponse

Pour filtrer les noms de fichier lisibles par lhomme, vous pouvez utiliser la classe de caractères [:print:] ( imprimable ) nom. Vous trouverez plus dinformations sur ces classes dans le manuel de grep.

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

Une seconde réflexion , lexigence « lisible par lhomme » peut faire référence au contenu du fichier, au lieu de son nom. En dautres termes, vous recherchez des fichiers texte . Cest un peu plus délicat. Comme @ D_Bye suggéré dans un commentaire, vous devez ensuite utiliser la commande file pour déterminer le type de contenu du fichier. Mais ce ne serait pas une bonne idée dexécuter file après un tube, 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 fonctionne la file -part:

  • Le prédicat -exec sexécute sh -c "file -b $0 | grep -q text" FILENAME pour chaque FILENAME qui satisfait 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 $0 par le nom du fichier.
  • Le file détermine le type de contenu de chaque fichier et génère ces informations. Loption -b empêche limpression nom de chaque fichier testé.
  • grep filtres la sortie provenant de

programme, recherche de lignes contenant « text » . (Voyez par vous-même à quoi ressemble une sortie typique de la commandefile.)

  • Mais grep ne le fait pas afficher le texte filtré, car loption -q (calme) donnée . Ce quil fait, cest simplement changer son statut de sortie en 0 (qui représente « true » – le texte filtré a été trouvé) ou 1 (signifiant « erreur « – le texte  » text «  napparaissait pas dans la sortie de file).
  • Le statut de sortie vrai / faux provenant de grep est ensuite passé de sh à find et agit comme le résultat final de lensemble Test « -exec sh -c "file $0 | grep -q text" {} \;« .
  • Dans le cas où le test ci-dessus renvoie vrai , le -print la commande est exécutée (cest-à-dire que le nom du fichier testé est imprimé).
  • Réponse

    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:~$ 

    Commentaires

    • Utilisez simplement le fichier inhere / * et cat / home / bandit4 / inhere / -file07

    Réponse

    find -type f ! -executable -size 1033c 

    vous obtiendra le fichier de lexercice

    Réponse

    find . -type f -size 1033c ! -executable | xargs file | grep text 

    Fan dune doublure

    Réponse

    Je pense que le moyen le plus long de trouver le mot de passe pour ce niveau de bandit mentionné par la plupart des utilisateurs 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, jai réalisé quil était assez facile de localiser des fichiers lisibles par lhomme (aka ASCII à ce niveau) de cette façon en vérifiant les types de fichiers dun répertoire entier.Le répertoire inhere contient les fichiers portant le nom « -filexx » ou vérifiez rapidement tout le répertoire inhere avec file ./*

    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 

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *