|\__/ | (`\
    _.|o o  |_ ) )
---(((---(((--------
GRENOBLE HACKERSPACE

blog/9600bauds02.html

9600bauds ISSUE No2

2026-02-05 12:00

>> Téléchargez l'archive tar.gz | .sig
>> Voir la version html | txt

00.txt

                       ▄▄▄▄▄    ▄▄▄▄    ▄▄▄     ▄▄▄    
                      ██▀▀▀██ ▄██▀▀▀█ ▄██▀▀█  ▄██▀▀█  
                      ██ ▄▄██ ██      ██   █▄ ██   █▄ 
                       ▀▀▀▀██ ██▄███▄ ██   ██ ██   ██  
                      ▄   ▄██ ██▀  ██ ██  ▄██ ██  ▄██
                      ▀████▀  ▀█████▀  ▀███▀   ▀███▀  bauds

                            ISSUE No 2 - Jan 2026

                                9600@ghspace.fr
                           #9600 sur irc.libera.chat

┌────────────┐
│ DISCLAIMER └─────────────────────────────────────────────────────────────────┐
│ Ce zine est une oeuvre collective, à but informatif, écrite par des gens qui |
| savent (parfois) ce qu'ils font. En aucun cas ils ne peuvent être tenus      |
| responsables de vos bêtises.                                                 │
└──────────────────────────────────────────────────────────────────────────────┘

-- INFO --

9600 bauds est un ezine inter-hackerspaces francophones à l'initiative de
GRENOBLE HACKERSPACE. Vous pouvez partager vos projets, vos actualités, vos
réflexions, vos tutoriels, vos retours d’expérience, ou tout autre contenu de
votre communauté dans un format volontairement minimaliste et nostalgique

-- EDITO --

Deuxième édition du zine 9600 bauds ! 
Mais moins d'article pour ce début d'année...

>>> Z'êtes tout mous ou quoi !! 

Bon, on va ré-organiser l'bazar pour éviter ce genre de bévue.
On s'amuse aussi sur la partie présentation, Si vous avez des idées, 
recommendations, faites-le nous savoir!

Biz.
                                                              Beemo / Staff 9600

┌──────────┐
│ SOMMAIRE └───────────────────────────────────────────────────────────────────┐
| 00.TXT : Sommaire et Présentations .............................. Staff 9600 |
| 01.TXT : Développement de driver sous Windows 11: Leçon 1........... Xylitol |
| 02.TXT : Exécution anonyme d'un ELF sous Linux ....................... Beemo |
| 03.TXT : FOSDEM 2026 : Petit retour d'expérience ................ tuxlu & ix |
| 04.TXT : CHIP-8 s'po compliqué! ...................................... Beemo |
└──────────────────────────────────────────────────────────────────────────────┘

-- CONTACT --

Tu peux nous contacter via :

- IRC:    #9600 sur irc.libera.chat 6667
- EMAIL:  Staff 9600 <9600@ghspace.fr>

Besoin de confidentialité ?

-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEaMau5BYJKwYBBAHaRw8BAQdAIriSQTvU+voZh3ol3A5lZpOzO0Hf4a3ie5dc
0TAcQTy0HFN0YWZmIDk2MDAgPDk2MDBAZ2hzcGFjZS5mcj6IkwQTFgoAOxYhBDxY
ZnlHx05Ta/BFq3t6TmyI4pAlBQJoxq7kAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMB
Ah4HAheAAAoJEHt6TmyI4pAl4rUA/2RhQ1zFNjG1sbpYn2yhd4vW6ELWv3jbHSbv
k9hxhFAYAP436htohxy36vUY/lZAaShInBXd3ThVcfgbGZ04rfy7BLg4BGjGruQS
CisGAQQBl1UBBQEBB0BXqqHHKxM0ZPHJty2Hzn8MGL5Mn1R6BiaGbCDqW122UgMB
CAeIeAQYFgoAIBYhBDxYZnlHx05Ta/BFq3t6TmyI4pAlBQJoxq7kAhsMAAoJEHt6
TmyI4pAlog4A/2/eb+Y/CwJhIJ8WUS3ftNw6Yi929SBizt9JAu5eVpACAQCyu6ku
/U2Zk/Ia96Lc3J0CoresASYjVc2vjt+7V9uVAQ==
=Rvqt
-----END PGP PUBLIC KEY BLOCK-----

Ah oui, j'oubliais... Nous sommes toujours ouvert à de nouveaux articles.
Donc si vous voulez contribuer aux prochains numéro, envoyer nous votre
proposition déja formatté par email. Aussi, si vous pensez avoir du temps et
les compétences, le comité éditorial est ouvert à candidature.

                                                |>>>
                                            _  _|_  _
                                           |;|_|;|_|;|
                                           \\.    .  /
                                            \\:  .  /
                                             ||:   |       \,/
                                             ||: , |            /`\
              __                            _||_   |
     ____--`~    '--~~__            __ ----~    ~`---,              ___
-~--~                   ~---__ ,--~'                  ~~----_____-~'   `~----~~
 

-- EOF --

01.txt
 ▄▄▄▄▄    ▄▄▄▄    ▄▄▄     ▄▄▄    
██▀▀▀██ ▄██▀▀▀█ ▄██▀▀█  ▄██▀▀█  
██ ▄▄██ ██      ██   █▄ ██   █▄ 
 ▀▀▀▀██ ██▄███▄ ██   ██ ██   ██  
▄   ▄██ ██▀  ██ ██  ▄██ ██  ▄██ No 2
▀████▀  ▀█████▀  ▀███▀   ▀███▀  bauds

┌──────────────────────────────┐
│ ISSUE No 2 - Jan 2026 01.TXT └───────────────────────────────────────────────┐
| Développement de driver sous Windows 11: Leçon 1                             |
| Xylitol                                                   |
| HACKGYVER HACKERSPACE (Belfort)                                              |
└──────────────────────────────────────────────────────────────────────────────┘

-- 0x0: Prélude --

Mesdames et messieurs, c'est votre capitaine qui vous parle, nous nous appro-
chons de kernel-land. Veuillez attacher vos ceintures et désactiver
tout Secure Boot pendant la phase d'approche...
Bon... oui c'était facile... en tout cas, ça fait plaisir d'envoyer une contrib
à un zine après tant d'années. Peut-être que moi aussi je devrais faire mon
zine, qui sait... après tant de temps passé dans le game a écrire pour les 
autres... J'éspère que si des old timerz trainent encore dans le coin et lisent
ces lignes, que mon nick vous fera sourire :)

Bon donc...
Dans cet article nous allons voir comment développer votre premier driver
kernel mode. Ou bien votre deuxième, ou votre troisième... Il y a bien sûr déjà
eu des articles qui traite de ça dans les zines, mais c'était quand...
en 2006, 2010 ? Les technos évoluent d'OS en OS... il était temps de remettre
un peu tout ça à jour.

Au sommaire de cet article

- 0x1: Créer l'environnement de développement
- 0x2: Configuration du projet Visual Studio
- 0x3: Notre premier driver
- 0x4: Le test !
- 0x5: Le mot de la fin 



-- 0x1: Créer l'environnement de développement --

Bien évidemment il vous faudra créer un environnement de test en machine
virtuelle. De manière générale ce n'est pas une bonne idée de tester directement
des drivers maison sur sa machine à cause des risques de BSoD, etc...
L'installation d'un Windows 11 sous VMware est idéale pour ce tutoriel.
Et même pour l'après.
Donc je ne vais pas vous apprendre la vie sur comment on installe un OS, tout ce
que je peux vous préconiser c'est de lui mettre de la place pour plus tard si
vous souhaitez installer d'autres outils de dev ou de rev.

Une fois votre OS opérationnel, on installe Visual Studio 2022.
Vous le trouverez ici: https://visualstudio.microsoft.com/downloads/ 

Depuis l'installeur de Visual Studio 2022 - v17.144.19 (October 2025)
Voici ce qu'il faut paramétrer:


Dans l'onglet Charges de travail:
[*] Développement Desktop en C++
      ^
      `--- On Code notre driver en C, donc...


Dans l'onglet Composants individuels:
[*] Bibliothèques avec atténuations de Spectre MSVC v143 - VS 2022 C++ x64/x86
    (dernière version)
      ^
      `--- En soi, vous n'avez pas besoin de ça, mais on va quand même l'install
           Si vous ne souhaitez pas l'installer ne le faites pas, nous verrons
           un peu plus tard quoi faire. (Spectre est une faille matérielle
           découverte en 2018. Depuis, Microsoft a ajouté une option /Qspectre
           dans la compilation pour mitiger le problème, mais ce n'est pas
           obligatoire pour compiler) 

[*] Kit de développement logiciel SDK Windows 11 (10.0.26100.6584)
      ^
      `--- Le SDK est nécessaire et complémentaire du WDK.

[*] Windows Driver Kit
      ^
      `--- C'est le connecteur entre Visual Studio et le vrai WDK
 
Une fois votre Visual Studio installé avec ces composants, il va falloir
installer le vrai WDK
-> https://learn.microsoft.com/fr-fr/windows-hardware/drivers/download-the-wdk

Vous trouvez ça absurde de ne pas distribuer WDK dans l'installeur de VS
directement?
Sachez que sous les anciens Windows, l'installation de l'IDE et de la
configuration des projets drivers était encore plus chronophage !

Une fois ça installer il nous reste une dernière chose à faire, passer l'OS en
mode test pour pouvoir charger nos drivers.
Ouvrez l'invite de commande en administrateur et taper:
bcdedit /set testsigning on

Maintenant on redémarre le système.

Vous devriez voir normalement sur le bureau dans le coin à droite:
Mode test
Windows 11 Professionnel
Build 26100.ge_release.240331-1435 (ou un truc du genre) 

Maintenant on télécharge DebugView
-> http://download.sysinternals.com/files/DebugView.zip
Un petit utilitaire qui nous servira à la fin pour tester notre driver. 



-- 0x2: Configuration du projet Visual Studio --


Bon, maintenant ouvrez Visual Studio
Cliquez sur «Créer un projet», puis sélectionnez «Empty WDM Driver»
Sur la prochaine page donnez un nom à votre projet, par exemple «HelloDriver»
puis cliquez sur le bouton «Créer»

L'interface principale de VS s'ouvre.
Avant toute chose, en haut dans la barre d'outils, changez la configuration
«Debug» par «Release»

Ensuite nous aurons besoin de faire quelques modifications dans les propriétés
de notre projet.
Allez dans l'explorateur de solutions à gauche, faites un clic droit sur
«HelloDriver» et allez dans les propriétés.

C/C++ > Général > Considérer les avertissements comme des erreurs: Non (/WX-)
C/C++ > Génération de code > Vérification de la sécurité sur: Désactiver (/GS-)
C/C++ > Génération de code > Spectre Mitigation: Disabled
                               ^
                               `--- (si vous n'avez pas installé Spectre)

Éditeur de liens > Entrée > Dépendances supplémentaires: uniquement ntoskrnl.lib
Éditeur de liens > Avancé > Point d'entrée: DriverEntry

Voilà... on est bon



-- 0x3: Notre premier driver --

Dans le menu de VS, aller dans «Projet», puis «Ajouter un nouvel élément...»
Une nouvelle fenêtre s'ouvre, aller dans code, sélectionnez «Fichier C++ (.cpp)»
nommez votre fichier main.cpp et cliquer sur «Ajouter»

Ensuite, entrez le code suivant:

```
#include 

VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
    DriverObject->DriverUnload = &DriverUnload;

    DbgPrint("Bonjour!\n");
    DbgPrint("Chemin du registre : %wZ\n", RegistryPath);
    return STATUS_SUCCESS;
}
    
VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
    DbgPrint("Au revoir!\n");
}
```

Expliquons un peu ce code...
«ntddk.h», c'est le header principal du WDK qui contient toutes les définitions.
C'est un genre d'équivalent à stdio.h, mais pour le monde kernel.

«VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);» ça, c'est notre déclaration
de déchargement du driver

«DriverObject» c'est une structure que Windows crée et remplit avant d'appeler
notre driver.

«DriverEntry» c'est notre point d'entrée du driver, l'équivalent du main()
en user-mode.

«RegistryPath» c'est le chemin dans le registre de notre driver.

«DbgPrint» c'est l'équivalent de printf() mais pour le kernel.

«STATUS_SUCCESS», c'est un code de retour standard pour indiquer que l'opération
s'est terminée avec succès.



Maintenant le .inf
Dans votre explorateur de solution à droite, développez «Driver Files» et
cliquez sur «HelloDriver.inf»
Mais à quoi sert donc ce fichier ?
Vous avez déjà dû le voir si vous avez déjà installé des drivers sous Windows.
Il y a 2 manières d'installer un driver. La première est l'installation manuelle
sans le fichier .inf on drop notre driver dans %SystemRoot%\system32, puis on
déclare le driver directement au système avec «sc create»
C'est la solution la plus simple pour les tests et le dev.
La deuxième solution c'est "l'officielle" via un fichier .inf en utilisant
«pnputil» ou bien simplement en faisant un clic droit sur le .inf et ensuite
«Installer»

On ne va pas supprimé le .inf du projet, comme ça vous aurez les deux méthodes
Par contre nous allons devoir modifier le squelette de base proposé par VS, car
le modèle qu'il nous propose est censé être un device INF attaché à un
périphérique.
Voici la version corrigée pour notre projet: 

```
;
; HelloDriver.inf
;

[Version]
Signature="$WINDOWS NT$"
Class=System
ClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318}
Provider=%ManufacturerName%
DriverVer = 10/27/2025,21.47.54.26
CatalogFile=HelloDriver.cat
PnpLockdown=1

[DefaultInstall.NTamd64]
CopyFiles=DriverCopy

[DefaultInstall.NTamd64.Services]
AddService=HelloDriver,,HelloDriver_Service_Inst

[DestinationDirs]
DriverCopy=11

[DriverCopy]
HelloDriver.sys

[SourceDisksNames]
1 = %DiskName%,,,""

[SourceDisksFiles]
HelloDriver.sys=1

[HelloDriver_Service_Inst]
DisplayName   ="HelloDriver"
ServiceType   =1
StartType     =3
ErrorControl  =1
ServiceBinary =%11%\HelloDriver.sys

[Strings]
ManufacturerName=""
DiskName="HelloDriver Source Disk"
```

Ce que l'on a modifié/ajouté:
[DefaultInstall.NTamd64]
CopyFiles=DriverCopy
DefaultInstall.NTamd64 précise que c'est pour une architecture x64
CopyFiles=DriverCopy renvoie dans la section [DriverCopy] et copie les fichiers
listés.

[DefaultInstall.NTamd64.Services]
AddService=HelloDriver,,HelloDriver_Service_Inst
DefaultInstall.NTamd64.Services indique à Windows qu'un service kernel doit
être créé
AddService=HelloDriver, c'est le nom du service, les deux virgules après
indiquent que l'on ne veut pas d'argument, HelloDriver_Service_Inst c'est le nom
d'une section définie plus bas pour créer et configurer le service.

[DestinationDirs]
DriverCopy=11
DestinationDirs précise ou copier le fichier, "11" étant notre DirID pour
%SystemRoot%\System32

[DriverCopy]
HelloDriver.sys
cette section, c'est le fichier a copié, qui va être copié dans le dir défini
par la section DestinationDirs.

[SourceDisksNames] et [SourceDisksFiles] servent a décrire les supports 
d'installation et/ou il se trouve (disque 1) c'est une relique du passé ou on
installait des drivers depuis des CDROMs ou des disquettes, mais Windows utilise
encore ce schéma et refuse de valider un .inf sans SourceDisksFiles.

[HelloDriver_Service_Inst]
DisplayName   ="HelloDriver"
ServiceType   =1
StartType     =3
ErrorControl  =1
ServiceBinary =%11%\HelloDriver.sys

Ce bloc la configure notre service, on y retrouve son nom, le type de service
"1" qui signifie SERVICE_KERNEL_DRIVER
StartType, et le type de démarrage, "3" étant pour DEMAND_START, le démarrage
manuel.
ErrorControl, la réaction de Windows si le driver échoue au démarrage du service
ServiceBinary =%11%\HelloDriver.sys, le chemin du driver à charger, on y
retrouve %11% qui est son DirID pour %SystemRoot%\System32


Voilà on a fait le tour du fichier inf, si vous avez des questions sur les
différentes valeurs, demandez a google ou bien a un LLM.

Maintenant qu'on a fait tout ça, dans Visual Studio depuis le menu du haut,
aller dans «Générer» et cliquer sur «Générer la solution»

========== Build : 1 réussite(s), 0 échec(s), 0 à jour, 0 ignorée(s) ==========




-- 0x4: Le test ! --

Prenez votre «HelloDriver.sys» fraichement compilé et déposez-le dans
«C:\Windows\System32\»

Ouvrez l'invite de commandes en administrateur et taper:  
sc create HelloDriver type= kernel binPath= "C:\Windows\System32\HelloDriver.sys" start= demand

Le message «[SC] CreateService réussite(s)» apparait.

Génial, maintenant ouvrez DebugView en administrateur. Dans le menu allez dans
«Capture» et cocher «Capture Kernel (Ctrl+K)» et «Enable Verbose Kernel Output»


De retour sur votre invite de commande tapez:
sc start HelloDriver

Le message «Bonjour!» apparait dans DebugView.
Ainsi que:
Chemin du registre : \REGISTRY\MACHINE\SYSTEM\ControlSet001\Services\HelloDriver	

Si vous voulez connaitre l'état de votre driver vous pouvez taper:
sc query HelloDriver 

Pour le stopper: sc stop HelloDriver
Le message «Au revoir!» apparait alors dans DebugView.

Pour supprimer le service: sc delete HelloDriver

Si vous souhaitez l'installer depuis votre .inf alors vous pouvez faire:
pnputil /add-driver HelloDriver.inf /install

Pour le supprimer:
pnputil /delete-driver HelloDriver.inf /uninstall



-- 0x5: Le mot de la fin --

Et voilà, vous venez d'écrire votre premier driver sous Windows 11.
Ce n'est qu'un Hello World, mais l'important, c'est d'avoir mis les mains dans
la mécanique. Et c'est aussi la porte d'entrée vers tout un univers...
Dans le prochain numéro nous verrons comment communiqué avec l'user-land !

     |       :::'/\ :::::: ::::   :::::: ::::   :::::: ::::   ::::::       |
     | cWHQ! ::'/  \`::::: ::::   :::::: ::::   :::::: ::::   ::::::       |
     |       :'/    \`:::: ::::   :::::: ::::   :::::: ::::   ::::::       |
     :       '/      \ ::: ::::   :::::: ::::   :::::: ::::   ::::::
  _ _______  /      //_._____ ___.      ___  _ ______ _ _ _/\ __.          |
   \\_     \/     __/  |     \_  |_____(___)_.        /     \\  |_____     |
    /               \_    ____/  |     \     |_  ____/  |     \ |     \    :
   /       /\________/____|  __ _____ //____  /___| __________/_____ //    .
   \      /                          \/ Noli turbare circulos meus! \/
    \\   /     __ \    / __
     \  /  .__\\   \  /   //_____________________________ _ ____
     .\/   |        \/                                         //____ __ _
     :

02.txt
 ▄▄▄▄▄    ▄▄▄▄    ▄▄▄     ▄▄▄    
██▀▀▀██ ▄██▀▀▀█ ▄██▀▀█  ▄██▀▀█  
██ ▄▄██ ██      ██   █▄ ██   █▄ 
 ▀▀▀▀██ ██▄███▄ ██   ██ ██   ██  
▄   ▄██ ██▀  ██ ██  ▄██ ██  ▄██ No 2
▀████▀  ▀█████▀  ▀███▀   ▀███▀  bauds

┌──────────────────────────────┐
│ ISSUE No 2 - Jan 2026 02.TXT └───────────────────────────────────────────────┐
| Exécution anonyme d'un ELF sous Linux                                        |
| Noë Flatreaud  (Beemo)                                   |
| GRENOBLE HACKERSPACE (Grenoble)                                              |
└──────────────────────────────────────────────────────────────────────────────┘

== [ Introduction ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [ 1 ] ==

 Amusons-nous un peu avec ELF,

 D'habitude, exécuter un fichier ELF nécessire de le placer quelque part sous 
 /run/user ou tout ce qui est pris en charge par tmpfs fonctionne très bien.
 Mais moi j'ai pas envie de laisser de traces, je veux pas d'opérations fichier
 et je veux que mon programme disparaisse au moment de l'execution, j'aimerai
 simplement récupérer un bout de la mémoire, d'y placer un binaire et de
 l'exécuter sans modifier le noyau ou charger une lib.

 SOMMAIRE
  
        1. Introduction
        2. Petits rappels
        3. Écriture d'une charge utile
        4. Exécution discrète avec memfd_create et execveat
        5. Mot de la fin
        6. Références

== [ Petits rappels ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [ 2 ] ==

memfd_create - un fichier qui n’existe pas (sur le disque)

```
SYNOPSIS

       #define _GNU_SOURCE         /* See feature_test_macros(7) */
       #include 

       int memfd_create(const char *name, unsigned int flags);

DESCRIPTION

       memfd_create() creates an anonymous file and returns a file
       descriptor that refers to it.  The file behaves like a regular
       file, and so can be modified, truncated, memory-mapped, and so on.
       However, unlike a regular file, it lives in RAM and has a volatile
       backing storage.  Once all references to the file are dropped, it
       is automatically released.  Anonymous memory is used for all
       backing pages of the file.  Therefore, files created by
       memfd_create() have the same semantics as other anonymous memory
       allocations such as those allocated using mmap(2) with the
       MAP_ANONYMOUS flag.

    ...

       MFD_CLOEXEC
              Set the close-on-exec (FD_CLOEXEC) flag on the new file
              descriptor.  See the description of the O_CLOEXEC flag in
              open(2) for reasons why this may be useful.       
       
```

  En gros, memfd_create() est un appel système linux qui permet de crée un
  fichier anonyme en RAM (sans lien vers le disque) et retourne un descripteur 
  de fichier pour y accéder. Le descripteur se comporte comme un fichier
  classique (modifiable, mappable en mémoire, etc.), mais volatile, il est
  automatiquement supprimé quand plus aucun processus ne l’utilise. Utile pour
  partager des données entre processus ou créer des zones mémoire anonymes;

  MFD_CLOEXEC nous permet de fermer automatiquement le descripteur au moment de
  l'execution.

execveat - exécuter depuis la mémoire

```
SYNOPSIS         top

       #include       /* Definition of AT_* constants */
       #include 

       int execveat(int dirfd, const char *path,
                    char *const _Nullable argv[],
                    char *const _Nullable envp[],
                    int flags);

DESCRIPTION         top

       The execveat() system call executes the program referred to by the
       combination of dirfd and path.  It operates in exactly the same
       way as execve(2), except for the differences described in this
       manual page.

       ...

       AT_EMPTY_PATH
              If path is an empty string, operate on the file referred to
              by dirfd (which may have been obtained using the open(2)
              O_PATH flag).
```

  execveat() est un appel système qui permet d’exécuter un programme en 
  combinant un descripteur de répertoire (dirfd) et un chemin (path). 
  Il fonctionne comme execve(2), mais avec une particularité bien sympa : Si
  le path est une chaîne vide, le programme exécuté est celui référencé 
  directement par dirfd (obtenu, imaginons, comme par hasard, avec 
  memfd_create()). 

== [ Écriture d'une charge utile ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [ 3 ] ==

  Maintenant que les rappels sont fait, amusons nous un peu !

  On va écrire un petit hellowold en ASM x86-64 qui affiche un message et se
  termine proprement. Rien de méchant, juste pour illustrer le principe.  

```
	SECTION .data
msg:	db "Hi World",10
len:	equ $-msg

	SECTION .text
        global main
main:
	mov	edx,len
	mov	ecx,msg
	mov	ebx,1
	mov	eax,4
	int	0x80
	mov	ebx,0
	mov	eax,1
	int	0x80
```
    
  Et comme le fichier sera écrit en dur dans les sources, j'ai choisi de réduire
  un maximum sont empreinte spaciale [^4]
 
  >>> Résultat : un binaire brut de 142 octets (wc -c shellcode)

*hello

00000000  7f 45 4c 46 01 01 01 48  69 20 57 6f 72 6c 64 0a  |.ELF...Hi World.|
00000010  02 00 03 00 01 00 00 00  80 80 04 08 34 00 00 00  |............4...|
00000020  00 b8 04 00 00 00 cd 80  eb 58 20 00 02 00 28 00  |.........X ...(.|
00000030  05 00 04 00 01 00 00 00  00 00 00 00 00 80 04 08  |................|
00000040  00 80 04 08 a2 00 00 00  a2 00 00 00 05 00 00 00  |................|
00000050  00 10 00 00 01 00 00 00  a4 00 00 00 a4 90 04 08  |................|
00000060  a4 90 04 08 09 00 00 00  09 00 00 00 ba 09 00 00  |................|
00000070  00 b9 07 90 04 08 bb 01  00 00 00 eb a4 00 00 00  |................|
00000080  eb ea bb 00 00 00 00 b8  01 00 00 00 cd 80        |..............|
0000008e

  vous pouvez récupérer le binaire directement avex xxd

$ xxd -r dump.txt > hello

  Intégration du shellcode en C (xxd -i hello)
  
```
#ifndef HELLO_H
#define HELLo_H

unsigned char hello[] = {
  0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x48, 0x69, 0x20, 0x57, 0x6f,
  0x72, 0x6c, 0x64, 0x0a, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00,
  0x80, 0x80, 0x04, 0x08, 0x34, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00,
  0x00, 0x00, 0xcd, 0x80, 0xeb, 0x58, 0x20, 0x00, 0x02, 0x00, 0x28, 0x00,
  0x05, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x80, 0x04, 0x08, 0x00, 0x80, 0x04, 0x08, 0xa2, 0x00, 0x00, 0x00,
  0xa2, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
  0x01, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0xa4, 0x90, 0x04, 0x08,
  0xa4, 0x90, 0x04, 0x08, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
  0xba, 0x09, 0x00, 0x00, 0x00, 0xb9, 0x07, 0x90, 0x04, 0x08, 0xbb, 0x01,
  0x00, 0x00, 0x00, 0xeb, 0xa4, 0x00, 0x00, 0x00, 0xeb, 0xea, 0xbb, 0x00,
  0x00, 0x00, 0x00, 0xb8, 0x01, 0x00, 0x00, 0x00, 0xcd, 0x80
};
unsigned int hello_len = 142;

#endif
```

== [ Exécution discrète avec memfd_create et execveat ] ~~~~~~~~~~~~~~~ [ 4 ] ~~

```
#define _GNU_SOURCE

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include "hello.h"

#define DIE(str) perror(str); exit(1)
#define DIE_CLOSE(str, fd) close(fd); DIE(str)

int main()
{
    int fd;
    void *mem;

    // Créer un fichier anonyme en mémoire
    fd = syscall(SYS_memfd_create, "", 0);
    if (fd == -1)
    { DIE("memfd_create"); }

    // Définir la taille du memfd
    if (ftruncate(fd, hello_len) == -1)
    { DIE_CLOSE("ftruncate", fd); }

    // Mapper le memfd en mémoire
    mem = mmap(NULL, hello_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (mem == MAP_FAILED)
    { DIE_CLOSE("mmap", fd); }

    // Copier le shellcode dans la mémoire mappée
    memcpy(mem, hello, hello_len);
    // Démapper la mémoire (pas forcément nécessaire, mais bonne pratique)
    munmap(mem, hello_len);
    // Se positionner au début du fichier
    lseek(fd, 0, SEEK_SET);

    // Exécuter le memfd en utilisant execveat
    char *argv[] = {NULL};
    char *envp[] = {NULL};
    if (syscall(SYS_execveat, fd, "", argv, envp, AT_EMPTY_PATH) == -1)
    { DIE_CLOSE("execveat", fd); }

    // S'po possible d'arriver là!
    DIE_CLOSE("main", fd);
}
```

== [ Mot de la fin ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [ 5 ] ==

Tadaa! Vous avez executés un ELF, passer par un fichier et sans laisser de trace
sur le disque... un packer quoi! Biz.

== [ Références ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [ 6 ] ==

[^1] https://man7.org/linux/man-pages/man2/syscalls.2.html
[^2] https://man7.org/linux/man-pages/man2/memfd_create.2.html
[^3] https://man7.org/linux/man-pages/man2/execveat.2.html
[^4] http://timelessname.com/elfbin/

 o    \ o /   _ o             __|       \ /       |__         o _   \ o /    o
/|\     |      /\     ___\o     \o       |      o/     o/__   /\      |     /|\
/ \    / \    | \    /)  |      ( \     /o\    / )     |  (\  / |    / \    / \

-- EOF --

03.txt
 ▄▄▄▄▄    ▄▄▄▄    ▄▄▄     ▄▄▄    
██▀▀▀██ ▄██▀▀▀█ ▄██▀▀█  ▄██▀▀█  
██ ▄▄██ ██      ██   █▄ ██   █▄ 
 ▀▀▀▀██ ██▄███▄ ██   ██ ██   ██  
▄   ▄██ ██▀  ██ ██  ▄██ ██  ▄██ No 2
▀████▀  ▀█████▀  ▀███▀   ▀███▀  bauds

┌──────────────────────────────┐
│ ISSUE No 2 - Jan 2026 03.TXT └───────────────────────────────────────────────┐
| FOSDEM 2026 : Petit retour d'expérience                                      |
| tuxlu & ix                                                                   |
| GRENOBLE HACKERSPACE (Grenoble)                                              |
└──────────────────────────────────────────────────────────────────────────────┘

--[ Intro ]

Le FOSDEM , la grand-messe européenne du logiciel libre , nous a encore régalé 
de tonnes de conférences et rencontres passionnantes. regroupant près de 8000 
personnes à Bruxelles chaque année (pas de comptage officiel, l'entrée est 
libre, évidemment) et plus de 1000 talks, on ne peut donc exprimer un retour que 
d'une infime partie de l'expérience. Mais essayons quand même, en regroupant les 
retours de notre groupe de grenoblois.

--[ tuxlu ]

Tout d'abord, big up au Hackerspace de Bruxelles, le HSBXL, qui sait recevoir!
Logés dans un petit bureau de l'ancien siège d'une grande boite de la 
distribution, ils ont pu privatiser un bâtiment entier du lieu, avec un hangar 
comme salle de concert! beaucoup de monde , peut être trop pour pouvoir vraiment 
voir les projets du hackerspace, mais ils ont pu faire la démo d'un frigo 
"connecté" à la manière hackerspace, c'est à dire avec un écran qui affiche un 
terminal, et un scanner code barre branché dessus pour afficher le prix des 
boissons présentes dans le frigo. Le tout lancé par un fichier polyglotte 
PHP/bash ^^' . Triste toutefois que le hackerspace soit plutôt itinérant en ce 
moment, logé dans des lieux voués à être démolis :/

2026 est vraiment l'année de l'IA dans l'Open Source. Mais rangez vos fourches, 
ou pointez les de nouveau vers les GAFAM. Car quand le talk d'introduction est 
"FOSS in times of war, scarcity and (adversarial) AI" et celui de cloture 
"Open Source Security in spite of AI", ou le créateur de Curl explique s'être 
fait bombarder de rapports de vulnérabilités 100% hallucinés par ChatGPT, on 
voit bien que si l'IA chamboule tout l'écosystème de dev, c'est peu souvent en 
bien. (Il y avait tout de même des talks très intéressants d'outils utilisant du
machine learning et une salle "AI plumbers", mais avec des talks techniques sur 
l'IA open-source sans bullshit marketing)

En projet de navigation anonyme sur internet, J'y ai découvert nym, un VPN qui 
mixe chaque paquet entre trois nœuds, et rajoute des faux paquets random, pour 
brouiller le signal et empêcher toute inférence possible via des métadonnées. 
*Certes* le talk était plutôt une pub pour leur produit, vu qu'il est 
techniquement open-source mais qu'en pratique son infrastructure de serveurs 
nécessite un investissement conséquent pour le mettre en place. Mais la 
réflexion sur toutes les méthodes pour garantir son anonymat sur internet était 
profonde et intéressante.

Le projet révolutionnaire le plus impressionnant que j'aie vu est Fex: 
Tony Wasserka, un des hommes qui porte le monde de l'émulation et du jeu vidéo 
sur son dos grâce à ses contributions à Wine, Dolphin, aux drivers GPU Vulkan. 
Il revient avec un nouveau projet: faire tourner des binaires X86 (PC) sur ARM 
(mobile). Grace à toute une architecture bien pensée et des  optimisations 
intelligentes, très bien expliquées dans son talk, ça fonctionne! Le projet a 
été financé par Valve (Steam) qui s'en servira dans son prochain hardware de 
casque VR, mais ça aura aussi de grandes implication pour les portages de jeux 
sur mobiles et c'est déjà utilisé pour faire tourner des jeux sur les derniers 
Mac d'Apple.

Le projet *complètement stupide* le plus impressionnant que j'aie vu est de 
Dextero_ , qui dans un lightning talk nous a montré son environnement de 
bureau... qui tourne dans un terminal! chaque pixel est un tout petit caractère 
Unicode, et grâce à des optimisations intelligentes, il arrive à faire tourner 
DOOM (1993) à 40 images par secondes en parallélisant l'affichage des caractères 
sur son GPU!

Pour finir, le talk "The Hacker Folk Art of Esoteric Code", sur les langages 
ésotériques, a vraiment montré à quel point le code pouvait être de l'art, 
parfois beau, parfois idiot, parfois faisant réfléchir: Un langage composé 
niquement de deux caractères, d'images ou de sons, c'est classique. Mais que 
penser d'un langage ou les  variables se décomposent à chaque utilisation, les 
nombres driftant de plus en plus et les chaines de caractères devenant 
progressivement incompréhensibles? D'un langage ou toutes les actions sont au 
passé, ou ou toutes les variables sont globales... entre les utilisateurs du 
langage? Beaucoup de ces "esolangs" existent déjà... à vous d'en implémenter 
d'autres!

--[ Ix ]

Premier FOSDEM pour ma part, très chargé autant sur mon planning que sur ce 
monde (libre) que j'ai beaucoup observé sans y prendre tellement part. Comme 
dirait le staff : si vous ne voulez pas voir Google en sponsor, donnez. Le xkcd 
2347 est plus vrai aujourd'hui que jamais et je tends à croire que certains 
n'auront pas honte d'accuser les développeurs engagés et fidèles du Nebraska si 
la tour s'effondre.

Au niveau des confs, je retiens "All Your Keyboards Are Belong To Us!" qui 
dresse l'historique des méthodes et légendes autour de celles-ci pour 
"mettre sur écoute" les claviers, écrans ou autres led qui constituent 
l'interface utilisateur d'un ordi. Du Van Eck Phreaking (c'est à dire, la 
captation pirate de la TV Hertzienne) aux USB Rubber Ducky (Une clé qui mime un 
clavier auprès de l'OS pour y introduire du code malveillant) les techniques et 
leurs histoires (souvent romancées) sont foison. Il y a clairement de quoi se 
faire peur, ceci dit, ces histoires (même romancées) peuvent donner de bonnes 
leçons (comme ne pas mettre de clé USB suspecte dans son ordi, au hasard).

-- EOF --

04.txt
 ▄▄▄▄▄    ▄▄▄▄    ▄▄▄     ▄▄▄    
██▀▀▀██ ▄██▀▀▀█ ▄██▀▀█  ▄██▀▀█  
██ ▄▄██ ██      ██   █▄ ██   █▄ 
 ▀▀▀▀██ ██▄███▄ ██   ██ ██   ██  
▄   ▄██ ██▀  ██ ██  ▄██ ██  ▄██ No 2
▀████▀  ▀█████▀  ▀███▀   ▀███▀  bauds

┌──────────────────────────────┐
│ ISSUE No 2 - Jan 2026 04.TXT └───────────────────────────────────────────────┐
| CHIP-8 s'po compliqué!                                                       |
| Noë Flatreaud                                            |
| GRENOBLE HACKERSPACE (Grenoble)                                              |
└──────────────────────────────────────────────────────────────────────────────┘

--[ Intro ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ 0x0 ]--

Créée en 1977, CHIP-8 [^1] est la console fanfan originale. D'abord conçue pour
faciliter le développement de jeux pour l'ordinateur COSMAC VIP kit, elle a 
connu plusieurs renaissances au fil des décennies pour de nouvelles plateformes
passionnantes. C'est un très bon cas d'école pour apprendre à développer un 
émulateur, s'po compliqué et s'po trop long! 

Si vous voulez juste vous amuser, il existe des émulateurs un peu partout,
j'ai récemment dévouvert celui là : https://emuchip.com/

Sommaire:

   0x0 Intro
   0x1 Architecture
   0x2 Jeu d'instruction
   0x3 Petit exemple : Pong
   0x4 


--[ Architecture ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ 0x1 ]--

CHIP-8 est une architecture 8 bits. Elle dispose d'un espace mémoire de 4 Ko, 
de 16 registres 8 bits, d'un écran monochrome 64×32, d'une pile pour les 
sous-routines et de minuteries simples pour les délais et les sons. 

Clavier:

1 2 3 C
4 5 6 D
7 8 9 E
A 0 B F

Ecran: 64x32

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 32
                                                              64 x
                                                              
-- [ Jeu d'instructions ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ 0x2 ]--

Référence [^2]

N               est un nombre entre 0 et 15.      (4bit)
NN              est un nombre entre 0 et 255.     (8bit)
NNN             est une adresse entre 0 et 4095.  (12bit)
VX et VY        sont des registres (0-F).
I               est le registre d'index mémoire.

Instructions

0NNN    Exécuter une sous-routine en langage machine à l'adresse NNN
00E0    Effacer l'écran
00EE    Retourner d'une sous-routine
1NNN    Sauter à l'adresse NNN
2NNN    Exécuter une sous-routine commençant à l'adresse NNN
3XNN    Sauter l'instruction suivante si la valeur du registre VX est égale à NN

4XNN    Sauter l'instruction suivante si la valeur du registre VX n'est pas 
          égale à NN

5XY0    Sauter l'instruction suivante si la valeur du registre VX est égale à 
          la valeur du registre VY

6XNN    Stocker le nombre NN dans le registre VX
7XNN    Ajouter la valeur NN au registre VX
8XY0    Stocker la valeur du registre VY dans le registre VX
8XY1    Définir VX à VX OU VY
8XY2    Définir VX à VX ET VY
8XY3    Définir VX à VX XOR VY

8XY4    Ajouter la valeur du registre VY au registre VX
          Définir VF à 01 si un dépassement se produit
          Définir VF à 00 si aucun dépassement ne se produit

8XY5    Soustraire la valeur du registre VY du registre VX
          Définir VF à 00 si un emprunt se produit
          Définir VF à 01 si aucun emprunt ne se produit

8XY6    Stocker la valeur du registre VY décalée d'un bit vers la droite dans le
          registre VX
          Définir le registre VF au bit de poids faible avant le décalage
          VY reste inchangé

8XY7    Définir le registre VX à la valeur de VY moins VX
          Définir VF à 00 si un emprunt se produit
          Définir VF à 01 si aucun emprunt ne se produit

8XYE    Stocker la valeur du registre VY décalée d'un bit vers la gauche dans 
          le registre VX. 
          Définir le registre VF au bit de poids fort avant le décalage.
          VY reste inchangé

9XY0    Sauter l'instruction suivante si la valeur du registre VX n'est pas 
          égale à la valeur du registre VY

ANNN    Stocker l'adresse mémoire NNN dans le registre I
BNNN    Sauter à l'adresse NNN + V0
CXNN    Définir VX à un nombre aléatoire avec un masque de NN

DXYN    Dessiner un sprite à la position VX, VY avec N octets de données de 
          sprite commençant à l'adresse stockée dans I
          Définir VF à 01 si des pixels définis sont modifiés en non définis, 
          et 00 sinon

EX9E    Sauter l'instruction suivante si la touche correspondant à la valeur 
          hexadécimale actuellement stockée dans le registre VX est pressée

EXA1    Sauter l'instruction suivante si la touche correspondant à la valeur
          hex actuellement stockée dans le registre VX n'est pas pressée

FX07    Stocker la valeur actuelle du compteur de délai dans le registre VX
FX0A    Attendre une touche et stocker le résultat dans le registre VX
FX15    Définir le compteur de délai à la valeur du registre VX
FX18    Définir le compteur sonore à la valeur du registre VX
FX1E    Ajouter la valeur stockée dans le registre VX au registre I

FX29    Définir I à l'adresse mémoire des données de sprite correspondant au 
          chiffre hexadécimal stocké dans le registre VX

FX33    Stocker l'équivalent décimal codé binaire de la valeur stockée dans le 
          registre VX aux adresses I, I + 1 et I + 2

FX55    Stocker les valeurs des registres V0 à VX inclus en mémoire à partir 
          de l'adresse I
          I est défini à I + X + 1 après l'opération

FX65    Remplir les registres V0 à VX inclus avec les valeurs stockées en
          mémoire à partir de l'adresse I
          I est défini à I + X + 1 après l'opération

Notes: Le comportementpeut différer selon les implémentations

-- [ Petit Exemple : Pong ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ 0x3 ]--

Voici ci contre, un petit exemple de jeux assemblé dans le jeux d'instruction
chip8, vous pouvez récupérer le dump et l'exporter en binaire avec xxd [^3]

`$ xxd -r -p dump.txt dump.bin`

Ou alors trouvez vous un assembleur chip8 ;)

Pong de Paul Vervalin, 1990

```
00000000  6a 02 6b 0c 6c 3f 6d 0c  a2 ea da b6 dc d6 6e 00  |j.k.l?m.......n.|
00000010  22 d4 66 03 68 02 60 60  f0 15 f0 07 30 00 12 1a  |".f.h.``....0...|
00000020  c7 17 77 08 69 ff a2 f0  d6 71 a2 ea da b6 dc d6  |..w.i....q......|
00000030  60 01 e0 a1 7b fe 60 04  e0 a1 7b 02 60 1f 8b 02  |`...{.`...{.`...|
00000040  da b6 60 0c e0 a1 7d fe  60 0d e0 a1 7d 02 60 1f  |..`...}.`...}.`.|
00000050  8d 02 dc d6 a2 f0 d6 71  86 84 87 94 60 3f 86 02  |.......q....`?..|
00000060  61 1f 87 12 46 02 12 78  46 3f 12 82 47 1f 69 ff  |a...F..xF?..G.i.|
00000070  47 00 69 01 d6 71 12 2a  68 02 63 01 80 70 80 b5  |G.i..q.*h.c..p..|
00000080  12 8a 68 fe 63 0a 80 70  80 d5 3f 01 12 a2 61 02  |..h.c..p..?...a.|
00000090  80 15 3f 01 12 ba 80 15  3f 01 12 c8 80 15 3f 01  |..?.....?.....?.|
000000a0  12 c2 60 20 f0 18 22 d4  8e 34 22 d4 66 3e 33 01  |..` .."..4".f>3.|
000000b0  66 03 68 fe 33 01 68 02  12 16 79 ff 49 fe 69 ff  |f.h.3.h...y.I.i.|
000000c0  12 c8 79 01 49 02 69 01  60 04 f0 18 76 01 46 40  |..y.I.i.`...v.F@|
000000d0  76 fe 12 6c a2 f2 fe 33  f2 65 f1 29 64 14 65 00  |v..l...3.e.)d.e.|
000000e0  d4 55 74 15 f2 29 d4 55  00 ee 80 80 80 80 80 80  |.Ut..).U........|
000000f0  80 00 00 00 00 00                                 |......|
```

Désassemblé:

000: label-0:
001:    movi vA 2              ; Load immediate value 2
002:    movi vB 12             ; Load immediate value 12
003:    movi vC 63             ; Load immediate value 63
004:    movi vD 12             ; Load immediate value 12
005:    imovi label-11         ; Indirect move to label
006:    sprite vA vB 6         ; Draw sprite at coordinates
007:    sprite vC vD 6         ; Draw another sprite
008:    movi vE 0              ; Initialize register E
009:    call label-9           ; Call subroutine
010:    movi v6 3              ; Load register 6
011:    movi v8 2              ; Load register 8
012:    movi v0 96             ; Load register 0
013:    movt v0                ; Move to top
014:    rmovt v0               ; Remove top move
015:    sei v0 0               ; Set interrupt enable
016:    jump label-14          ; Jump to label
017:    rnd v7 23              ; Generate random number
018:    addi v7 8              ; Add immediate to register
019:    movi v9 255            ; Load maximum value
020:    imovi label-12         ; Indirect move to label
021:    sprite v6 v7 1         ; Draw small sprite
022:    imovi label-11         ; Indirect move to label
023:    sprite vA vB 6         ; Draw sprite again
024:    sprite vC vD 6         ; Draw another sprite
025:    movi v0 1              ; Load value 1
026:    snkr v0                ; Sneak operation
027:    addi vB 254            ; Subtract from register
028:    movi v0 4              ; Load value 4
029:    snkr v0                ; Sneak operation
030:    addi vB 2              ; Add to register
031:    movi v0 31             ; Load value 31
032:    movr vB v0             ; Move register value
033:    sprite vA vB 6         ; Draw sprite
034:    movi v0 12             ; Load value 12
035:    snkr v0                ; Sneak operation
036:    addi vD 254            ; Subtract from register
037:    movi v0 13             ; Load value 13
038:    snkr v0                ; Sneak operation
039:    addi vD 2              ; Add to register
040:    movi v0 31             ; Load value 31
041:    movr vD v0             ; Move register value
042:    sprite vC vD 6         ; Draw sprite
043:    imovi label-12         ; Indirect move to label
044:    sprite v6 v7 1         ; Draw small sprite
045:    movr v6 v8             ; Move register value
046:    movr v7 v9             ; Move register value
047:    movi v0 63             ; Load value 63
048:    movr v6 v0             ; Move register value
049:    movi v1 31             ; Load value 31
050:    movr v7 v1             ; Move register value
051:    snei v6 2              ; Sneaky not equal
052:    jump label-2           ; Conditional jump
053:    snei v6 63             ; Sneaky not equal
054:    jump label-3           ; Conditional jump
055: label-1:
056:    snei v7 31             ; Sneaky not equal
057:    movi v9 255            ; Load maximum value
058:    snei v7 0              ; Sneaky not equal
059:    movi v9 1              ; Load value 1
060:    sprite v6 v7 1         ; Draw small sprite
061:    jump label-15          ; Jump to label
062: label-2:
063:    movi v8 2              ; Load register 8
064:    movi v3 1              ; Load register 3
065:    movr v0 v7             ; Move register value
066:    movr v0 vB             ; Move register value
067:    jump label-4           ; Jump to label
068: label-3:
069:    movi v8 254            ; Load register 8
070:    movi v3 10             ; Load register 3
071:    movr v0 v7             ; Move register value
072:    movr v0 vD             ; Move register value
073: label-4:
074:    sei vF 1               ; Set interrupt enable
075:    jump label-5           ; Jump to label
076:    movi v1 2              ; Load value 2
077:    movr v0 v1             ; Move register value
078:    sei vF 1               ; Set interrupt enable
079:    jump label-6           ; Jump to label
080:    movr v0 v1             ; Move register value
081:    sei vF 1               ; Set interrupt enable
082:    jump label-8           ; Jump to label
083:    movr v0 v1             ; Move register value
084:    sei vF 1               ; Set interrupt enable
085:    jump label-7           ; Jump to label
086: label-5:
087:    movi v0 32             ; Load value 32
088:    movs v0                ; Move special
089:    call label-9           ; Call subroutine
090:    movr vE v3             ; Move register value
091:    call label-9           ; Call subroutine
092:    movi v6 62             ; Load register 6
093:    sei v3 1               ; Set interrupt enable
094:    movi v6 3              ; Load register 6
095:    movi v8 254            ; Load register 8
096:    sei v3 1               ; Set interrupt enable
097:    movi v8 2              ; Load register 8
098:    jump label-10          ; Jump to label
099: label-6:
100:    addi v9 255            ; Add immediate
101:    snei v9 254            ; Sneaky not equal
102:    movi v9 255            ; Load maximum value
103:    jump label-8           ; Jump to label
104: label-7:
105:    addi v9 1              ; Add immediate
106:    snei v9 2              ; Sneaky not equal
107:    movi v9 1              ; Load value 1
108: label-8:
109:    movi v0 4              ; Load value 4
110:    movs v0                ; Move special
111:    addi v6 1              ; Add immediate
112:    snei v6 64             ; Sneaky not equal
113:    addi v6 254            ; Subtract from register
114:    jump label-1           ; Jump to label
115: label-9:
116: label-10:
117:    imovi label-13         ; Indirect move to label
118:    bcd vE                 ; Binary coded decimal
119:    load v2                ; Load register
120:    digit v1               ; Extract digit
121:    movi v4 20             ; Load register 4
122:    movi v5 0              ; Load register 5
123:    sprite v4 v5 5         ; Draw sprite
124:    addi v4 21             ; Add to register
125:    digit v2               ; Extract digit
126:    sprite v4 v5 5         ; Draw sprite
127:    return                 ; Return from subroutine
128: label-11:
129:    movr v0 v8             ; Move register value
130:    movr v0 v8             ; Move register value
131:    movr v0 v8             ; Move register value
132: label-12:
133:    movr v0 v0             ; Move register value


--[ Mot de la fin! ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ 0x4 ]--

Pis voilà ! S'po complqiué! Y'a pas plus simple même.

Amusez vous à faire propre émulateur, assembleur, déassembleur, 
vous avez de quoi faire ;)

--[ Références ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ 0x5 ]--

- https://chip-8.github.io/links/
- https://git.sr.ht/~gotlou/chip8-emulator/tree
- https://github.com/Mockedarche/Chip-8-Emulator/tree/main
- https://github.com/vajradevam/chip8

[^1] https://en.wikipedia.org/wiki/CHIP-8
[^2] https://github.com/mattmikolay/chip-8/wiki/CHIP%E2%80%908-Instruction-Set
[^3] https://linux.die.net/man/1/xxd

________________________________________________________________________________

   ::::==========:::::::::::::::::::::::::::::::::::::::::::::::::::::::
   :::::::=========::::::.---------------.:::::::::::::::::::::::::::::::
   :::=============::::::| .-----------. |:::::::::::::::::::::::::::::
   ::::==========::::::::| | === == == | |:::::::::::::::::::::::::::::::::
   ::::==========::::::::| | AAAARG!   | |:::::::::::::::::::::::::::::::
   :::::::=========='::::| |   oscour! | |:::::::::::::::::::::::::::::
   :::===========::::::::| |___________| |::::::((;):::::::::::::::::::::
   """"============""""""|___________oo__|"")"""";(""""""""""""""""""""""
     ==========='           ___)___(___,o  (   .---._
        ===========        |___________| 8  \  |   |_)    .+-------+.
     ===========                     o8o8    ) |___|    .' |_______| `.
       =============      __________8___    (          /  /         \  \
    |\`==========='/|   .'= --------- --`.   `.       |\ /           \ /|
    | "-----------" |  / ooooooooooooo  oo\   _\_     | "-------------" |
    |______I_N______| /  oooooooooooo[] ooo\  |=|     |_______OUT_______|
                          / O O =========  O OO  \ "-"   .-------,
                           `""""""""""""""""""""""'      /~~~~~~~/
________________________________________________________/_   ~~~/_______________
hjw.................................................. \/_____/..moi à 3h du mat'

-- EOF --

cfp/cfp.txt
_____/\\\\\\\\\_______________/\\\\\_____/\\\\\\\________/\\\\\\\____        
 ___/\\\///////\\\_________/\\\\////____/\\\/////\\\____/\\\/////\\\__       
  __/\\\______\//\\\_____/\\\///________/\\\____\//\\\__/\\\____\//\\\_      
   _\//\\\_____/\\\\\___/\\\\\\\\\\\____\/\\\_____\/\\\_\/\\\_____\/\\\_     
    __\///\\\\\\\\/\\\__/\\\\///////\\\__\/\\\_____\/\\\_\/\\\_____\/\\\_    
     ____\////////\/\\\_\/\\\______\//\\\_\/\\\_____\/\\\_\/\\\_____\/\\\_   
      __/\\________/\\\__\//\\\______/\\\__\//\\\____/\\\__\//\\\____/\\\__  
       _\//\\\\\\\\\\\/____\///\\\\\\\\\/____\///\\\\\\\/____\///\\\\\\\/___
        __\///////////________\/////////________\///////________\///////_bauds

                          ISSUE No 3 - Avril 2026

                                9600@ghspace.fr
                           #9600 sur irc.libera.chat

┌────────────┐
│ DISCLAIMER └─────────────────────────────────────────────────────────────────┐
│ Ce zine est une oeuvre collective, à but informatif, écrite par des gens qui |
| savent (parfois) ce qu'ils font. En aucun cas ils ne peuvent être tenus      |
| responsables de vos bêtises.                                                 │
└──────────────────────────────────────────────────────────────────────────────┘

-- INFO --

9600 bauds est un ezine inter-hackerspaces francophones à l'initiative de
GRENOBLE HACKERSPACE. Vous pouvez partager vos projets, vos actualités, vos
réflexions, vos tutoriels, vos retours d’expérience, ou tout autre contenu de
votre communauté dans un format volontairement minimaliste et nostalgique

-- FAQ ---

Q: Pourquoi ASCII/ANSI seulement ?
A: Parce qu’écrire en ASCII ça fait mal aux doigts, mais c'est puré classe.

-- RTFM --

Format 		: Texte ASCII brut (pas de mise en forme riche).
Longueur 	: 1 à 2 articles par hackerspace.
Largeur 	: 80 colonnes maximum (pour rester lisible en terminal).
Encodage 	: UTF-8 (accents et caractères spéciaux acceptés sauf émojis).

Envoyez votre proposition à 9600@ghspace.fr (en corps de mail ou en pj.txt)

Date limite : 10 avril 2026 (minuit, UTC+2).
Publication : 25 avril 2026.

Structure :

Titre 		: Moins de 76 caractères
Auteur 		: Un pseudo court + nom complet (optionnel).
Hackerspace 	: Nom du hackerspace que vous représentez.
Contenu 	: Libre, mais clair et concis.

Contenu attendu :

Priorité aux projets concrets, retours d’expérience, actualités, présentations 
de hackerspaces, tutoriels, ou réflexions techniques.

- Hardware : Rétro-ingénierie, modifications de matériel, prototypage 
- Security : Vulnérabilités documentées, retex pentest, analyses de firmware
- Réseaux  : Protocoles obscurs, SDR, mesh networking 
- DIY/Art  : Projets artistiques
- Essais   : Articles autour de l'Infosec, du Libre, du Piratage etc..
- Spaces   : Présentations de lieux, outils partagés, retex

À éviter :

- Les tutoriels basiques sans originalité (ex: "Installer Linux sur un PC").
- Les sujets hors scope (ex: "Ma recette de bière maison")
- Le contenu purement théorique sans application pratique (sauf essais)

Politiques Spécifiques:

    1. Vulnérabilités 0-day

    Accepté si :

    - La vulnérabilité est déjà publique (patch dispo depuis ≥7 jours).
    - Pas de patch mais rapporté depuis ≥90 jours (avec preuve de contact).
    - Cible très pertinente pour la communauté

    Rejeté si :

    - Divulgation prématurée sans coordination avec les mainteneurs.
    - Cible triviale.

    2. Malware

    Accepté sous conditions :

    - Analyses techniques de malware existants 
    - Outils offensifs légitimes
    - Recherche défensive

    Exemple rejeté :

    - "Comment chiffrer un fichier et demander une rançon en Monero"
  
    Exemple accepté :    

    - "Reverse engineering d’un keylogger"

    3. Utilisation de l’IA

    Autorisé :

    - Correction grammaticale ou reformulation de phrases (à déclarer)
    - Articles sur l’IA incluant des outputs générés 

    Proscris :

    - Contenu généré par IA

Licence :

Par défaut : CC BY-NC-SA 4.0 (vous gardez vos droits, mais autorisez 
la réutilisation et l’adaptation sous les mêmes conditions).
Précisez dans votre soumission si vous souhaitez une autre licence.

Sélection : 

Les articles sont choisis pour leur pertinence, leur originalité et leur 
respect des règles. Si votre soumission n’est pas retenue pour le #1, elle sera
automatiquement considérée pour le #2. Aucune contribution ne sera perdue.

Archivage: 

9600 bauds sera conservé et partagé (site miroir, archives, etc.).

Exemple de soumission:

```
---
title : "Intro au piratage Hardware - Root Shell avec UART"
author : lavomatik
full_name: Lavo Matik 
hackerspace: GRENOBLE HACKERSPACE (Grenoble)
---

[Corps de l’article en texte brut, 80 colonnes max...]

```

Date limite : 10 avril 2026
Publication : 25 avril 2026

Contact : 9600@ghspace.fr

-- CONTACT ---

Vous pouvez nous contacter via :

- IRC:    #6900 sur irc.libera.chat 6667
- EMAIL:  Staff 9600 <9600@ghspace.fr>

Besoin de confidentialité ?

-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEaMau5BYJKwYBBAHaRw8BAQdAIriSQTvU+voZh3ol3A5lZpOzO0Hf4a3ie5dc
0TAcQTy0HFN0YWZmIDk2MDAgPDk2MDBAZ2hzcGFjZS5mcj6IkwQTFgoAOxYhBDxY
ZnlHx05Ta/BFq3t6TmyI4pAlBQJoxq7kAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMB
Ah4HAheAAAoJEHt6TmyI4pAl4rUA/2RhQ1zFNjG1sbpYn2yhd4vW6ELWv3jbHSbv
k9hxhFAYAP436htohxy36vUY/lZAaShInBXd3ThVcfgbGZ04rfy7BLg4BGjGruQS
CisGAQQBl1UBBQEBB0BXqqHHKxM0ZPHJty2Hzn8MGL5Mn1R6BiaGbCDqW122UgMB
CAeIeAQYFgoAIBYhBDxYZnlHx05Ta/BFq3t6TmyI4pAlBQJoxq7kAhsMAAoJEHt6
TmyI4pAlog4A/2/eb+Y/CwJhIJ8WUS3ftNw6Yi929SBizt9JAu5eVpACAQCyu6ku
/U2Zk/Ia96Lc3J0CoresASYjVc2vjt+7V9uVAQ==
=Rvqt
-----END PGP PUBLIC KEY BLOCK-----

                                 ~               *******
                                ~              *---*******
                        __      _   _!__      *-----*******
                   _   /  \_  _/ \  |::| ___ **-----********   ~
                 _/ \_/^    \/   ^\/|::|\|:|  **---*****/^\_
              /\/  ^ /  ^    / ^ ___|::|_|:|_/\_******/  ^  \
             /  \  _/ ^ ^   /    |::|--|:|---|  \__/  ^     ^\___
           _/_^  \/  ^    _/ ^   |::|::|:|-::| ^ /_  ^    ^  ^   \_
          /   \^ /    /\ /       |::|--|:|:--|  /  \        ^      \
         /     \/    /  /        |::|::|:|:-:| / ^  \  ^      ^     \
   _Q   / _Q  _Q_Q  / _Q    _Q   |::|::|:|:::|/    ^ \   _Q      ^
  /_\)   /_\)/_/\\)  /_\)  /_\)  |::|::|:|:::|          /_\)
_O|/O___O|/O_OO|/O__O|/O__O|/O__________________________O|/O__________
////////////////////////////// Ici c'est ChicaGre xD ///////////////////

-- EOF --

README.txt

                       ▄▄▄▄▄    ▄▄▄▄    ▄▄▄     ▄▄▄    
                      ██▀▀▀██ ▄██▀▀▀█ ▄██▀▀█  ▄██▀▀█  
                      ██ ▄▄██ ██      ██   █▄ ██   █▄ 
                       ▀▀▀▀██ ██▄███▄ ██   ██ ██   ██  
                      ▄   ▄██ ██▀  ██ ██  ▄██ ██  ▄██
                      ▀████▀  ▀█████▀  ▀███▀   ▀███▀  bauds

                            ISSUE No 2 - Jan 2026

                                9600@ghspace.fr
                           #9600 sur irc.libera.chat

┌────────────┐
│ DISCLAIMER └─────────────────────────────────────────────────────────────────┐
│ Ce zine est une oeuvre collective, à but informatif, écrite par des gens qui |
| savent (parfois) ce qu'ils font. En aucun cas ils ne peuvent être tenus      |
| responsables de vos bêtises.                                                 │
└──────────────────────────────────────────────────────────────────────────────┘

-- INFO --

9600 bauds est un ezine inter-hackerspaces francophones à l'initiative de
GRENOBLE HACKERSPACE. Vous pouvez partager vos projets, vos actualités, vos
réflexions, vos tutoriels, vos retours d’expérience, ou tout autre contenu de
votre communauté dans un format volontairement minimaliste et nostalgique

-- TREE --

.
├── 00.txt
├── 01.txt
├── 02.txt
├── 03.txt
├── 04.txt
├── cfp
│   └── cfp.txt
└── README.txt

-- RTFM --

le zine est divisé en plusieurs articles, chacun représenté par un fichier texte
(.txt). Vous pouvez les lire dans n'importe quel ordre avec l'éditeur ou 
visualiseur de votre choix (cat, vim, nano etc...)

Le répertoire `cfp` contient l'appel à contribution.

-- CONTACT --

Tu peux nous contacter via :

- IRC:    #9600 sur irc.libera.chat 6667
- EMAIL:  Staff 9600 <9600@ghspace.fr>

Besoin de confidentialité ?

-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEaMau5BYJKwYBBAHaRw8BAQdAIriSQTvU+voZh3ol3A5lZpOzO0Hf4a3ie5dc
0TAcQTy0HFN0YWZmIDk2MDAgPDk2MDBAZ2hzcGFjZS5mcj6IkwQTFgoAOxYhBDxY
ZnlHx05Ta/BFq3t6TmyI4pAlBQJoxq7kAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMB
Ah4HAheAAAoJEHt6TmyI4pAl4rUA/2RhQ1zFNjG1sbpYn2yhd4vW6ELWv3jbHSbv
k9hxhFAYAP436htohxy36vUY/lZAaShInBXd3ThVcfgbGZ04rfy7BLg4BGjGruQS
CisGAQQBl1UBBQEBB0BXqqHHKxM0ZPHJty2Hzn8MGL5Mn1R6BiaGbCDqW122UgMB
CAeIeAQYFgoAIBYhBDxYZnlHx05Ta/BFq3t6TmyI4pAlBQJoxq7kAhsMAAoJEHt6
TmyI4pAlog4A/2/eb+Y/CwJhIJ8WUS3ftNw6Yi929SBizt9JAu5eVpACAQCyu6ku
/U2Zk/Ia96Lc3J0CoresASYjVc2vjt+7V9uVAQ==
=Rvqt
-----END PGP PUBLIC KEY BLOCK-----

         @\_______/@
        @|XXXXXXXX |
       @ |X||    X |
      @  |XXXXXXXX |
     @   |X||    X |             V
    @    |X||   .X |
   @     |X||.  .X |                         V
  @     |%XXXXXXXX%||
 @      |X||  . . X||
@       |X||   .  X||                               @     @
        |X|| .    X|| .                             ||    %
       |XXXXXXXXXXXX||    .                         ||    %
       |XXXXXXXXXXXX||                           .  ||====% .
       |XX|        X||           `     .       .    ||    %  .
       |XX|        X||                      ;       ||    %     .
       |XX|======= X||============================+ || .. %  ............ .  .  
===== /            X||                              ||    %
                   X||           /)                 ||    %
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

-- EOF --