Pilotage d’entrées/sorties “Tout ou Rien”

Mise en situation

Vous pouvez prendre le contrôle à distance d’une alarme d’intrusion architecturée autour d’un Raspberry Pi.

Cette alarme dispose d’un voyant qui reflète l’état de la détection d’intrusion :

  • Ce voyant clignote à f = 0.5Hz avec un rapport cyclique α = 50% lorsqu’aucune intrusion n’est détectée

  • Il clignote à f = 10Hz avec un rapport cyclique α = 25% lorsqu’une intrusion est détectée

L’alarme dispose également d’un bouton “Test Voyant” qui permet de s’assurer de son bon fonctionnement en simulant une intrusion (→ clignotement f = 10Hz, α = 25%).

Votre mission consiste à hacker ce système pour remplacer le logiciel de l’alarme de façon à donner l’impression qu’elle fonctionne normalement.

Le travail consistera à :

  1. trouver sur la Raspberry Pi cible le processus de l’alarme qui contrôle le voyant et le bouton de l’alarme puis déterminer les broches GPIO associées à ces 2 dispositifs

  2. coder sur votre Raspberry Pi un script Python qui fait clignoter le voyant aux mêmes fréquences et rapport cyclique que sur l’alarme

  3. faire évoluer votre script pour qu’il gère également le mode “Test Voyant”

  4. tuer le processus de l’alarme sur la Raspberry Pi cible et le remplacer par votre script que vous aurez téléversé au préalable

💻 Travail n° 1 Collecte d’informations

  1. Tenter de retrouver l’adresse IP et/ou le nom d’hôte de la Raspberry Pi cible

  2. Se connecter dessus sachant que vous avez pu obtenir les données de connexion (login : pi / password : raspberry)

  3. Trouver le nom du processus de l’alarme qui accède aux 2 broches d’entrée/sortie du voyant et de son bouton de test

    • Vous savez qu’il existe une commande Linux qui permet de déterminer quels processus utilisent tel ou tel fichier. Or, dans Linux, “tout est fichier” y compris le contrôleur qui gère les entrées/sorties de la Raspberry Pi.
      Vous ne vous rappelez plus le nom de cette commande mais Google est votre ami 😉

    • Sur Linux , la commande ps donne des informations sur les processus actifs

    • L’interface de programmation Libgpiod (voir Accès aux GPIOs) met à disposition des outils en ligne de commande qui peuvent être utiles.

  4. Donner les n° ainsi que la direction (input ou output) des GPIO qui pilotent le voyant et le bouton de test

💻 Travail n° 2 Pilotage de sortie “Tout ou Rien”

🎯 Travail à faire :

  1. À partir de Manage the GPIO lines in Python3 and C with libgpiod link, coder un script Python qui permettra de faire clignoter le voyant à f=0.5Hz avec un rapport cyclique α = 50%

  2. Modifier le script pour faire clignoter le voyant à f = 10Hz avec un rapport cyclique α = 25%

💻 Travail n° 3 Lecture d’entrée “Tout ou rien”

🎯 Travail à faire :

  1. À partir de Manage the GPIO lines in Python3 and C with libgpiod link, coder un script Python qui permettra d’afficher l’état courant — relâché ou appuyé — du bouton poussoir

💻 Travail n° 4 Intégration

🎯 Travail à faire :

  1. Se servir des 2 codes précédents pour coder un script Python qui simule le fonctionnement de l’alarme, à savoir :

    • Faire clignoter le voyant à f = 0.5Hz / α = 50% lorsque le bouton poussoir est relâché

    • Faire clignoter le voyant à f = 10Hz / α = 25% lorsque le bouton poussoir est appuyé

💻 Travail n° 5 Action sur objectif

Cette étape vise à remplacer sur la Raspberry Pi cible le processus original de l’alarme par votre script de façon à faire croire qu’elle fonctionne normalement

🎯 Travail à faire :

  1. Téléverser votre script sur la cible

  2. Le rendre exécutable

  3. Tuer le processus original de l’alarme

  4. Exécuter votre script à la place

  5. Faire en sorte que votre script redémarre automatiquement à la mise sous tension de la Raspberry Pi.

    Pour cela, il faut le considérer comme un service du système d’exploitation contrôlé par le gestionnaire de services systemd.

    Le document Astuces système d’exploitation explique comment faire.

🞄  🞄  🞄