Bandit — Niveau 4 → 5
Ce niveau apprend deux choses : la commande file pour déterminer le type d’un fichier, et surtout une convention Unix fondamentale — le séparateur -- qui marque la fin des options.
🎯 Objectif
Dans le dossier inhere, qui contient une dizaine de fichiers nommés -file00, -file01, etc., trouver le seul fichier “human-readable” (lisible par un humain, par opposition à un fichier binaire).
🧠 Concepts à connaître
La commande file détermine le type d’un fichier en analysant son contenu (pas son extension). Elle utilise une base de signatures connues — pour reconnaître par exemple qu’un fichier est un PDF, une image PNG, un script bash, un exécutable ELF, ou du texte ASCII.
file mon_fichier
# mon_fichier: ASCII text
file mon_image.png
# mon_image.png: PNG image data, 800 x 600, 8-bit/color RGB
Pour analyser plusieurs fichiers d’un coup, on combine avec le wildcard * (qui veut dire “tout”) :
file *
Le piège du niveau : dans inhere, tous les fichiers s’appellent -file00, -file01, etc. Quand le shell expanse * en -file00 -file01 -file02 ..., la commande file reçoit chaque argument et… les interprète comme des options. Parce que par convention, dans toutes les commandes Unix, un argument qui commence par - est une option, pas un nom de fichier. Résultat : file plante avec une erreur du genre invalid option.
Deux façons de contourner ça — et la deuxième est une des conventions Unix les plus utiles à connaître :
Solution 1 — Préfixer chaque fichier avec ./ :
file ./*
Le shell expanse en ./-file00 ./-file01 .... Chaque argument commence maintenant par ./, donc aucun ne ressemble à une option.
Solution 2 — Le séparateur -- :
file -- *
🧠 Convention Unix à graver dans la tête :
--(deux tirets seuls) signifie “fin des options, ce qui suit est des arguments positionnels”. Tout ce qui vient après--est interprété comme nom de fichier ou argument, jamais comme option, même si ça commence par-. Cette convention est respectée par la quasi-totalité des outils GNU.
Quelques exemples où -- te sauve :
rm -- -fichier-dangereux # supprime un fichier nommé "-fichier-dangereux"
grep -- -v fichier.txt # cherche la chaîne "-v" dans fichier.txt
🔍 Ma démarche
J’arrive dans le dossier, je tape :
ls
Une dizaine de fichiers tous nommés -fileXX. J’enchaîne naturellement :
file *
Plante. Erreur. Tous les fichiers sont vus comme des options.
C’est là que ma question se pose : “OK, je sais préfixer un fichier avec ./ pour qu’il ne soit pas confondu avec une option. Mais ici j’ai un wildcard *, pas un nom précis. Comment faire ?”
La réponse vient en regardant ce que le shell fait avec ./* : il expanse en ./-file00 ./-file01 .... Le préfixe ./ est appliqué à chaque résultat de l’expansion. Donc :
file ./*
Marche. Sortie :
./-file00: data
./-file01: data
./-file02: data
...
./-file07: ASCII text
./-file08: data
./-file09: data
Un seul fichier est marqué ASCII text — c’est le fichier “human-readable” qu’on cherche. cat ./-file07 (ou autre selon le numéro) donne le password.
J’ai aussi testé la variante file -- *, qui marche tout aussi bien. Avantage de cette syntaxe : elle est plus “déclarative” — elle dit explicitement “les arguments qui suivent ne sont pas des options”, alors que ./* masque ça via le préfixe. À utiliser selon les goûts, mais -- est plus universel pour les scripts.
🛠️ Commandes & outils découverts
| Commande | Ce qu’elle fait |
|---|---|
file fichier | Déterminer le type d’un fichier en analysant son contenu |
file ./* | Analyser tous les fichiers en évitant le piège des noms commençant par - |
file -- * | Idem, en utilisant le séparateur -- (convention Unix) |
* | Wildcard du shell, signifie “tout” ce qui matche |
💡 Ce que je retiens
Deux leçons :
filedétermine le type d’un fichier à partir de son contenu, pas de son extension — donc fiable même pour des fichiers sans extension ou mal renommés. Pratique en cybersécurité (un fichier malveillantimage.pngqui est en fait un exécutable, par exemple).- La convention Unix
--marque la fin des options. À retenir pour toutes les situations où un nom commence par-:rm -- -dangereux,grep -- -motif, etc. C’est une convention universelle, plus propre que de bricoler avec./.