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