help/content/files/challenge.md

5.6 KiB

date title weight
2019-04-04T15:59:52+02:00 challenge.txt 20
  • challenge.txt définitions des paramètres de votre challenge (au format toml) :
    • 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

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