--- date: 2019-04-04T15:59:52+02:00 title: challenge.txt weight: 20 --- + `challenge.txt` définitions des paramètres de votre challenge (au format [toml](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md)) : - `gain = 42` : nombre de points que rapporte cet exercice ; - `tags = ["Android", "RAT", "ROM"]` : mots-clefs de l'exercice ; - `[[depend]]` : dépendance à un autre exercice : * `id = CHID` : identifiant du challenge ; * `theme = "NomDuTheme"` : (facultatif) nom du thème dans lequel aller chercher l'identifiant (par défaut, on prend le thème courant) ; - `[[flag]]` : chaîne de validation pour résoudre le challenge : * `type = "key"` : (facultatif, par défaut "key") type de flag : + `key` : [drapeau classique]({{< relref "/responses/simple.md" >}}), + `vector` : [liste de drapeaux]({{< relref "/responses/vector.md" >}}), + `mcq` : [question à choix multiple]({{< relref "/responses/mcq.md" >}}) (cases à cocher) avec ou sans [justification]({{< relref "/responses/mcq_justified.md" >}}), + `ucq` : [liste de choix]({{< relref "/responses/ucq.md" >}}) ; * `id = 42` : (facultatif) identifiant du flag au sein de l'exercice, pour définir des dépendances ; * `label = "Intitulé"` : (facultatif, par défaut : `Flag`) intitulé du drapeau ; * `raw = 'MieH2athxuPhai6u'` ou `raw = ['part1', 'part2']` : drapeau(x) exact(s) à trouver ; sous forme de tableau, le participant n'aura pas connaissaance du nombre d'éléments ; * `ordered = false` : (facultatif, par défaut : `false`) ignore l'ordre dans lequels les éléments du tableau sont passés ; * `validator_regexp = "^(?:sudo +)?(.*)$"` : (facultatif) expression rationnelle dont les groupes capturés serviront comme chaîne à valider (notez que `?:` au début d'un groupe ne le capturera pas) ; * `casesensitive = true` : (facultatif, par défaut : `false`) prend en compte la case de ce drapeau ; * `help = "Indication"` : (facultatif) chaîne de caractères placée sous le champ du formulaire, idéale pour donner une indication de format ; * `choices_cost = 42` : (facultatif) coût pour afficher les choix : avant l'affichage, se comporte comme un drapeau `key` classique (à 0, les choix sont affichés directement) * `noshuffle = true` : (facultatif, par défaut `false`) conserve l'ordre des propositions, au lieu de les mélanger ; * `[[flag.unlock_file]]` : bloque l'accès à un fichier tant que le flag n'est pas obtenu : + `filename = "toto.txt"` : nom du fichier tel qu'il apparaît dans le dossier `files` ; * `[[flag.need_flag]]` : liste des flags devant être validés avant de débloquer celui-ci : + `id = 23` : identifiant du flag tel qu'il a été défini plus tôt dans le fichier ; * `[[flag.choice]]` : représente un choix, répétez autant de fois qu'il y a de choix (pour les `mcq` et `ucq`) : + `label = "Intitulé de la réponse"`, + `value = true` (facultatif, par défaut `false`, sauf si `raw` est précisé) : valeur attendue pour ce choix, + `raw = "Justification"` (nécessaire pour un [QCM justifié]({{< relref "/responses/mcq_justified.md" >}})) : utilisez une chaîne de caractères (notez qu'il n'est pas possible de combiner des réponses vraies justifiées et non justifiées), + `help = "Flag correspondant"` : (facultatif) indication affichée dans le champ de texte des QCM justifiés, + ... toutes les autres propriétés applicables à un flag simple peuvent être utilisées : `ordered`, `validator_regexp`, `casesensitive`, ... ; - `[[hint]]` : paramètres pour un indice : * `filename = "toto.txt"` : (mutuellement exclusif avec `content`) nom du fichier tel qu'il apparaît dans le dossier `hints` ; * `content = "Contenu de l'indice"` : (mutuellement exclusif avec `filename`) contenu de l'indice affiché, en markdown ; * `cost = 10` : (facultatif, par défaut 1/4 des gains du challenge) coût de l'indice ; * `title = "Foo Bar"` : (facultatif, par défaut "Astuce $id") titre de l'astuce dans l'interface ; * `[[hint.need_flag]]` : liste des flags devant être validés pour débloquer cet indice : + `id = 23` : identifiant du flag ; Voir aussi [la section sur les flags]({{< relref "/responses" >}}). ## Exemple ```toml gain = 42 [[depend]] id = 2 [[flag]] label = "Date d'exfiltration" help= "Format : yyyy-mm" raw = '2015-12' [[flag]] label = "IPv6 d'exfiltration" raw = 'fe80::319c:1002:7c60:68fa' casesensitive = false [[flag]] type = "mcq" label = "Conditions générales de validation de challenge" raw = 'conscent' [[flag.choice]] label = "J'accepte les conditions" value = 'conscent' [[flag]] type = "ucq" label = "Quelle est la couleur du cheval blanc d'Henri IV ?" raw = 'blanc' casesensitive = false choices_cost = 21 [[flag.choice]] value = 'Noir' [[flag.choice]] label = 'Roux' value = 'Alezan' [[flag.choice]] label = 'Brun' value = 'Alezan' [[flag.choice]] label = "Crème" value = 'Blanc' [[flag]] type = "mcq" label = "Quels sont les films réalisés par C. Nolan ?" [[flag.choice]] label = "Memento" value = true [[flag.choice]] label = "Inception" value = true [[flag.choice]] label = "Transcendance" [[hint]] filename = 'enocean-specs.pdf' title = "Spécifications du protocole utilisé" [[hint]] content = """ Le TOML c'est magique. Je peux avoir des chaînes de caractères sur plusieurs lignes ! """ title = "L'astuce du siècle" cost = 30 ```