Loading files…
Repositorio oficial del Badge WomenCON 2026. Aquí encontrarás el hardware (esquemático, PCB y footprints) y la documentación de uso del badge.
El badge es un dispositivo autónomo: se alimenta por USB-C, se maneja con sus 4 botones y sus pads capacitivos, y muestra todo en su OLED. No necesita computadora ni aplicación para jugar; la PC sólo se usa para flashear y para la consola serie de diagnóstico.
El firmware que corre en el badge es PwnPet,
un framework de mascota virtual (tipo Tamagotchi) sobre BLE con retos de CTF
integrados. Este badge corresponde a la variante ch573/WomenCon_2026.
Para interactuar con el badge desde una computadora existe PwnPet_CLI, una herramienta de línea de comandos en Python que se conecta por BLE. Ver la sección CLI.
| Bloque | Parte |
|---|---|
| MCU | CH573F (RISC-V, BLE 4.2, AES-128 por hardware, USB Full-Speed) |
| Antena | Antena embebida en el PCB |
| Pantalla | OLED SSD1306 128×32 (I²C @ 0x3C, conector J2) |
| LEDs de usuario | WS2812 RGB direccionable |
| Entrada táctil | 2 pads capacitivos (touchkey del CH573) |
| Entrada botones | 4 push buttons direccionales (activo-bajo, conector J1) |
| USB | USB Tipo-C (alimentación + datos, CDC serie) |
WomenCon_2026)| Función | Pin | Nota |
|---|---|---|
| OLED SDA / SCL | PB12 / PB13 | I²C por software (SoftWire) @ 400 kHz |
| WS2812 DATA | PA14 | SPI0 MOSI |
| Botón ARRIBA | PA9 |
| Botón ABAJO | PB7 |
| Botón IZQUIERDA | PA8 |
| Botón DERECHA | PA15 | Compartido con SPI0 MISO (ver nota abajo) |
| Touch pad 0 | PA4 | canal ADC 0 |
| Touch pad 1 | PA12 | canal ADC 2 |
| USB D+ / D− | PB11 / PB10 | Fijo por silicio |
| SWCLK / SWDIO | PB15 / PB14 | Programación SWD |
| BOOT / RESET | PB22 / PB23 |
Nota de diseño —
PA15. El botón DERECHA comparte pin con SPI0 MISO, que es el periférico usado para generar el timing del WS2812. El firmware libera SPI0 entre frames y sólo lo reactiva para cada ráfaga del LED, de modo que el botón funciona correctamente. El costo es un ligero tinte verde en el LED (MOSI queda en alto al reactivar). La solución limpia es un pull-down por hardware dePA14a GND.
El badge cría una criatura con estadísticas que evolucionan en el tiempo y sobreviven al apagado (se guardan en la DataFlash del CH573):
| Estadística | Rango | Qué la afecta |
|---|---|---|
| Felicidad | 0–1000 | Acariciar, jugar, misiones |
| Hambre | 0–1000 | Alimentar (sube), decae sola con el tiempo |
| Salud | 0–1000 | Descuido prolongado la baja |
| XP | 0–… | Misiones, caricias, alimentar |
Estados de la criatura (se reflejan en el sprite del OLED y en el color del LED):
| Estado | Condición | LED |
|---|---|---|
| Temeroso | Estado inicial (XP < 50) | Azul fijo |
| Curioso | XP ≥ 50 | Amarillo fijo |
| Leal | XP ≥ 100 | Verde fijo |
| Paranoia | 3 passkeys incorrectos por BLE | Rojo parpadeante (60 s) |
| Hambriento | Salud crítica | Magenta parpadeante |
| Muerto | Descuido total o sobrealimentación | Apagado |
Sobrealimentar tiene consecuencias: al pasar de 600 / 750 / 900 de hambre la criatura se pone "gordita" (sprites y LED naranja en tres intensidades), y al saturar en 1000 muere de sobrealimentación. Después de morir hay una penalización de 3 minutos antes de poder revivirla (arise, con animación y LED naranja).
| Acción | Efecto |
|---|---|
| ARRIBA (pulsación corta) | Acariciar la criatura (+5 XP) — muestra Petted +5xp |
| ARRIBA (pulsación larga) | Muestra/oculta la pantalla completa con el nombre del dueño |
| ABAJO | Alimentar (+25 comida/felicidad, +5 XP) — muestra +25food |
| IZQUIERDA | Overlay de estadísticas: H:<felicidad> N:<hambre> |
| DERECHA | Overlay de estadísticas: HP:<salud> XP:<xp> |
| IZQUIERDA + DERECHA ≥ 500 ms | Activa/desactiva el modo amistad (Friend ON/Friend OFF) |
| ARRIBA con solicitud pendiente | Acepta la solicitud de amistad en pantalla |
| Pads táctiles (PA4, PA12) | Entrada para las misiones de patrón táctil |
Con un OLED de 32 px las cadenas van abreviadas (
H:/N:en lugar deHAP:/HUN:); en variantes de 64 px se muestran completas.
Con el modo amistad activo (combo IZQ+DER), el badge escanea anuncios BLE de
otros PwnPet cercanos. Cuando detecta uno con RSSI fuerte (~−60 dBm, es decir,
a pocos centímetros) muestra Amigo? PwnPet_XXYY [↑=Aceptar]. Al presionar
ARRIBA, ese badge queda guardado en la lista de amigos.
El firmware incluye un conjunto de misiones integradas. Cada misión, cuando se completa, otorga XP y pone a disposición una bandera (PWNPET{...}). Esta guía no los resuelve; explica el marco para que sepas cómo abordarlos.
Cómo explorarlas desde la CLI:
missions — descubre qué misiones existen en tu badge y cuáles ya has completado.missions --hint <id> — solicita la pista oficial del firmware para una misión específica.flag <id> — recoge la bandera de una misión completada.Categorías de misión (las que existen dependen de los indicadores HAS_* de su variante):
HAS_BUTTONS=1).Algunas misiones se pueden completar completamente desde la CLI; otras requieren interacción física con el hardware. Esto es intencional: el badge es a la vez un dispositivo físico y un objetivo BLE.
Recuerda: las características que contienen banderas no se nombran en la CLI y sólo devuelven datos cuando se cumplen sus condiciones. Descúbrelas usando las pistas del propio firmware, no aquí.
La numeración de misiones no es necesariamente contigua: depende de los flags
HAS_*de la variante. Lista siempre conmissionspara ver cuáles existen en tu badge.
El badge anuncia como PwnPet_XXXX (o PwnPet_<nombre> si se le puso nombre
personalizado) y expone un servicio paraguas 0xFEED al que se conecta
cualquier cliente BLE estándar (nRF Connect, bleak, etc.):
| Grupo | UUIDs | Contenido |
|---|---|---|
| Vida | 0xFE01–0xFE09 | species_id, nombre, felicidad, energía, estado, XP, salud, lista de misiones, nombre del dueño (todos de lectura) |
| Interacción | 0xC001–0xC009 | feed, pet, play, renombrar, pista de misión, factory reset, comando de amistad, set_owner |
| Core | 0xDE01, 0xDE02 | master_flag (requiere estado Leal), all_missions_done |
| Habilidad | 0xFA01, 0xFA02 | valor del sensor, ability_flag (requiere sensor > umbral) |
| Memoria | 0x5E01–0x5E03 | dream_log, passkey_input, secret_journal (requiere estado Curioso/Leal y passkey correcto) |
PWNPET{12hex} y se derivan por CMAC del UID del
chip, así que cada badge tiene flags distintas.El badge se juega solo, pero para inspeccionarlo, resolver misiones por BLE y recoger banderas existe PwnPet_CLI: una herramienta de línea de comandos en Python que habla BLE con el badge desde Linux, macOS o Windows.
La guía completa está en el README de PwnPet_CLI. Aquí sólo va lo esencial para usarla con este badge.
Requisitos: Python ≥ 3.10 y un adaptador Bluetooth BLE 4.0+.
git clone https://github.com/ElectronicCats/PWNPet_CLI.git
cd PWNPet_CLI
python3 -m venv .venv
source .venv/bin/activate # Linux / macOS
# .venv\Scripts\activate # Windows
pip install -r pwnpet_cli/requirements.txt
chmod +x pwnpet # Linux / macOS
./pwnpet --version
El script pwnpet se invoca desde la raíz del repositorio. Para llamarlo desde
cualquier directorio, agrégalo al PATH, crea un symlink en ~/.local/bin o define
un alias en tu shell.
En Linux, si hay problemas de permisos BLE:
sudo usermod -aG bluetooth $USER # cerrar sesión y volver a entrar
pwnpet scan # busca badges PwnPet cercanos
pwnpet target set AA:BB:CC:DD:EE:1A # guarda el badge objetivo (o por nombre)
pwnpet # abre la sesión interactiva (modo por defecto)
scan lista nombre, dirección MAC, especie y estado emocional de cada badge visible:
Name Address Species State
PwnPet_1A2B AA:BB:CC:DD:EE:1A 0x0002 (Pwn Cat) temeroso
La sesión interactiva (pwnpet session, o pwnpet a secas) mantiene la conexión
BLE abierta y evita pagar los ~5–10 s de reconexión por comando. Al conectar imprime
el estado actual y deja el prompt (pwnpet). Se cierra con exit, quit o Ctrl+D;
Ctrl+C sólo cancela el comando en curso.
| Comando | Qué hace |
|---|---|
status | Muestra todos los campos públicos: dueño, especie, nombre, felicidad, hambre, salud, estado, XP, sensor y misiones |
feed | Alimenta a la criatura (porción fija). Sube hungry y felicidad — cuidado con sobrealimentar |
pet | Acaricia: sube felicidad y otorga algo de XP |
play <hex> | Juega escribiendo un valor mágico de 32 bits y lee la respuesta; ciertos valores son parte de los retos |
rename <nombre> | Cambia el nombre de la criatura (máx. 16 bytes UTF-8) |
owner [<nombre>] | Lee o define el nombre del dueño del badge (máx. 20 bytes UTF-8) |
missions | Lista las misiones y su estado (completada / pendiente) |
missions --hint <id> | Pide al firmware la pista oficial de una misión |
flag <id> | Recoge la bandera de una misión ya completada |
passkey <3 dígitos> | Envía el passkey mostrado en el OLED para desbloquear contenido protegido |
read <nombre|0xNNNN> | Lee una característica por nombre público o por UUID corto |
write <nombre|0xNNNN> <hex> | Escribe una característica |
friendship … | count, list, remove <MAC>, block <MAC>, proximity [on|off] |
arise | Restablecimiento de fábrica; sólo aparece si la criatura está muerta |
help | Lista completa de comandos |
Ejemplo:
(pwnpet) owner Ada Lovelace
owner: Ada Lovelace
(pwnpet) feed
ok
(pwnpet) missions
Missions (Pwn Cat):
[ ] mission 1
[X] mission 2
(pwnpet) flag 2
PWNPET{xxxxxxxxxxxx}
La CLI sólo nombra las características públicas. Las que contienen banderas no tienen nombre por diseño: se alcanzan únicamente por su UUID crudo (
read 0xNNNN) y devuelven datos vacíos hasta que se cumplen sus condiciones de acceso.
arise — revivir una criatura muertaSi la criatura muere (estado muerto (salud) o muerto (gordito)), el comando arise
aparece en la sesión:
(pwnpet) arise
WARNING: This will wipe all saved data and reboot the device.
Type yes to confirm: yes
Factory reset initiated. Device will reboot in ~1 s.
Es un restablecimiento completo de fábrica: borra XP, misiones, nombres y estado, y
reinicia el badge. La criatura renace en temeroso con todo en cero.
Si aparece
Arise blocked, la criatura murió hace demasiado poco. Espera 3 minutos y vuelve a intentarlo.
Para scripting, cada acción existe como subcomando independiente:
pwnpet status
pwnpet feed
pwnpet pet
pwnpet owner "Ada Lovelace"
pwnpet missions
pwnpet flag 2
pwnpet read happiness
pwnpet write 0xC001 32 # payload en hex (0x32 = 50 decimal)
Todos aceptan --target <addr|nombre> para sobrescribir el objetivo guardado, y
-d / --debug para ver el traceback completo. Cada invocación suelta paga la
latencia de escaneo + conexión + desconexión: para varias acciones seguidas, la
sesión interactiva es mucho más rápida.
| Código | Significado |
|---|---|
| 0 | OK |
| 1 | Error de uso (argumentos incorrectos) |
| 2 | Objetivo no encontrado (timeout de escaneo) |
| 3 | Fallo de conexión (adaptador BLE o timeout) |
| 4 | Error GATT (lectura/escritura rechazada por el firmware) |
| 5 | Timeout de notificación / valor mágico incorrecto |
El firmware evalúa las misiones en dos modos, y eso decide dónde se resuelve cada una:
play, write); las táctiles y de
botones exigen tocar el badge.En resumen: la CLI es el camino para las misiones de interacción BLE y para observar el progreso de todas; las de sensor, táctiles y de botones se completan en el plano físico.
El firmware vive en el repositorio ElectronicCats/pwnpet,
en la variante ch573/WomenCon_2026.
Descarga el .bin correspondiente a WomenCon_2026 de la página de
releases de pwnpet y
flashéalo con un programador WCH-LinkE por SWD.
Requisitos: Linux x64, curl, git, python3 >= 3.10 y un programador WCH-LinkE.
git clone https://github.com/ElectronicCats/pwnpet.git
cd pwnpet
./scripts/bootstrap.sh # instala arduino-cli, wlink y el core fijado
PWNPET_VARIANT=ch573/WomenCon_2026 ./scripts/build.sh
./scripts/flash_swd.sh # flasheo por SWD (camino canónico)
Variables de compilación útiles:
| Variable | Por defecto | Para qué sirve |
|---|---|---|
PWNPET_VARIANT | ch573/panama_dojocon_2026 | Debe ser ch573/WomenCon_2026 para este badge |
PWNPET_SPECIES_SPEC | example_spec | Especie instanciada (example_spec = "Pwn Cat") |
PWNPET_DEV_MODE | 1 | 0 para build de producción (quita los comandos DEV:) |
Para el badge de evento se recomienda PWNPET_DEV_MODE=0, que elimina los
comandos de depuración capaces de forzar misiones y flags.
Documentación completa del firmware: build, protocolo BLE/CDC, seguridad y flags, hardware.
Con HTTPS:
git clone https://github.com/ElectronicCats/Badge_WomenCON_2026.git
Con SSH:
git clone git@github.com:ElectronicCats/Badge_WomenCON_2026.git
Electronic Cats invests time and resources providing this open source design, please support Electronic Cats and open-source hardware by purchasing products from Electronic Cats!
Designed by Electronic Cats.
Hardware released under an CERN Open Hardware Licence v1.2. See the LICENSE file for more information.
Electronic Cats is a registered trademark, please do not use if you sell these PCBs.
No comments yet. Be the first to ask about this board.