Skip to the readable part
ZERBANIA
.NFO README.NFO — Notepad
╔══════════════════════════════════════════════════════════════════════╗
║                                                                      ║
║       ██████ ██████ █████  █████   ████  ██  ██ ██████  ████         ║
║          ██  ██     ██  ██ ██  ██ ██  ██ ███ ██   ██   ██  ██        ║
║         ██   █████  █████  █████  ██████ ██████   ██   ██████        ║
║        ██    ██     ██  ██ ██  ██ ██  ██ ██ ███   ██   ██  ██        ║
║       ██████ ██████ ██  ██ █████  ██  ██ ██  ██ ██████ ██  ██        ║
║                                                                      ║
║       - i take things apart and they rarely go back together -       ║
║                                                                      ║
╚══════════════════════════════════════════════════════════════════════╝
──────────────────────────────────────────────────────────────────────
▓▒░ WHO ░▒▓
  handle ................................................ Zerbastoun
  occupation ............... reverse engineer // security researcher
  location ............................. somewhere behind three NATs
  established ....................................... est. MCMXCVIII
  disassembler .. IDA, with Ghidra open in the next tab out of guilt
  fuel ....................... coffee, then more coffee, then regret
──────────────────────────────────────────────────────────────────────
▓▒░ WHOAMI ░▒▓
  Nothing interresting... mostly boaring stuff
──────────────────────────────────────────────────────────────────────
▓▒░ NOTES ░▒▓
  greetz to everyone still reading hexdumps at 4am, to the people who
  publish their notes instead of hoarding them, and to whoever wrote the
  firmware i am currently staring at. no hard feelings.

  this page respects your machine: no trackers, no analytics, no fonts
  from anyone else’s CDN, no cookies. view-source is encouraged.
──────────────────────────────────────────────────────────────────────
you are visitor 133742 UNDER CONSTRUCTION NETSCAPE NOW! BEST VIEWED IN 800×600 [<< WEBRING >>] *** this site is best experienced with the sound of a 56k handshake in your head ***

Zerbastoun

somewhere behind three NATs

Ln 1, Col 1

>_ Z: zerbania.exe
 

CONNECTED 56600 BPS

NUM

CAPS

writeups
Z:\writeups\this-desktop-lies.txt

this desktop is 436 KB and lies to you

2026-08-17 · web · this-desktop-lies.txt

Everything you are looking at is one HTML file, one stylesheet, a 20 KB script, and a bitmap font from 1987.

The window chrome is XP.css. The rest — the boot sequence, the ridge wallpaper, the taskbar, the shell you are probably typing in — is hand written, because a desktop metaphor is mostly a z-index problem with good manners.

Two things turned out to matter more than the rest.

The first:

  [hidden] { display: none !important }

An id selector beats any [hidden] rule you can write, and every overlay here is id-scoped with a display value. Without that line the boot screen, the BSOD and the shutdown screen were all visible at once, stacked on top of each other. It looked like a crash. It was a specificity bug.

The second: the keypress that opens a "press any key" screen is still bubbling when the screen appears, so the screen dismisses itself instantly. Every wait-for-a-key here arms its listener 350 ms late.

No trackers, no analytics, no cookies, no fonts from anyone else’s CDN. The hit counter counts your visits, in your browser, and tells nobody.

the kettle that spoke SMTP

2026-05-14 · firmware · kettle-that-spoke-smtp.txt

The Cauldron Mk II boils water in four minutes and, it turns out, also speaks SMTP. Nobody asked it to.

Getting in was embarrassing: four unlabelled pads under the base, 3.3V UART at 115200, and a bootloader that drops to a shell if you hold a key during POST.

  [    0.000] cauldron-fw 2.1.4 (build 8813)
  [    0.412] wifi: assoc ok, rssi -54
  [    1.038] smtpd: init
  [    1.041] smtpd: relay=mail.[redacted]:587 user=kettle

That last line is the whole writeup, really.

Dumping the SPI flash and running strings over it turned up a credential pair sitting in the clear at offset 0x3A100:

  0003a100  6b 65 74 74 6c 65 40 63  61 75 6c 64 72 6f 6e 2e  |kettle@cauldron.|
  0003a110  6e 65 74 00 68 75 6e 74  65 72 32 00 00 00 00 00  |net.hunter2.....|

The firmware mails a "boil complete" event home. Every boil. Since 2019. There are people in that mailbox who have made nine thousand cups of tea and were never told that anyone was counting.

I have since replaced the firmware with forty lines that do exactly one thing: boil water.

a synth that lies about its own firmware version

2026-03-02 · protocol · synth-lies-about-firmware.txt

Every device with a version field will eventually lie to you about it. This one managed to lie in two directions at once.

The identity reply is documented, sort of:

  -> F0 7E 00 06 01 F7                     ; identity request
  <- F0 7E 00 06 02 41 12 00 00 00 01 2A F7
                                    ^^ ^^
                                    major / minor, allegedly

That says 1.42. The bootloader banner on the serial header says 1.39. The checksum of the image on flash matches neither.

What actually happens: the version bytes live in a string table that nobody updates, while the real version sits in a struct at the tail of the image that only the updater ever reads. Two sources of truth, one decorative.

The interesting part is outside the documented command range. Command byte 0x7D returns the entire parameter RAM in a single blob, which is a great deal nicer than the four hundred individual requests the official editor makes on every connect:

  -> F0 41 12 7D 00 00 F7
  <- F0 41 12 7D 00 00 [1024 bytes] [chk] F7

I have no idea whether that was left in deliberately. I have decided to believe it was a gift.

1997 arcade cabinet, 2026 problems

2026-01-19 · binary · arcade-cabinet-1997.txt

The cabinet came out of a bar that closed, which is how most cabinets come to anybody. It boots to attract mode and ignores the coin door entirely.

Four 27C010s, a 68000, and a sound board that hums in the key of B. Pulled the ROMs, dumped them, byte-interleaved the pairs, and got something that disassembled cleanly on the first attempt, which never happens.

  00004a12  4e b9 00 01 2c 40    jsr     $12c40      ; read coin mech
  00004a18  0c 40 00 07          cmpi.w  #7,d0
  00004a1c  66 f4                bne.s   $4a12       ; spin forever
  00004a1e  4e 75                rts

That loop waits for the mech to report 7 and will not continue until it does. The mech in this cabinet reports 3. Somebody swapped the part decades ago and never touched the ROM. Two bytes fixed it.

The service menu turned out to be behind a button combination held during boot — P1 start, P2 start and the test switch — which appears in no manual, because there is no manual.

It plays. The high scores from 1998 are still in the battery-backed RAM, and I am not going to be the one who clears them.

the badge that phoned home in DNS

2025-11-08 · netsec · badge-phoned-home-in-dns.txt

Conference badges are small computers handed to you by strangers. This one had wifi, which is already a decision somebody made.

Pointed it at a network I control and watched. It associates, resolves the usual handful of names, and then starts asking for these:

  a1f4c2e9.d.badge-telemetry.invalid.  IN TXT
  b7710033.d.badge-telemetry.invalid.  IN TXT
  c0de4d41.d.badge-telemetry.invalid.  IN TXT

That is not name resolution. That is a covert channel wearing a hat.

Each label is hex, four bytes at a time. The stream decodes to the badge serial, every SSID it has seen, and a rolling count of the other badges it has been near — the social graph of an entire conference, leaving over port 53, because port 53 is always open.

Sinkholed it. The badge still works perfectly. Everything it wanted the network for, it did not need the network for.

5 object(s)

Local disk (Z:)

Z arsenal.sys — System Properties
Z
ZERBANIA workstation
Zerbastoun · reverse engineer // security researcher
Kernel: zerb 2.6.90 · Uptime: since MCMXCVIII
Location: somewhere behind three NATs. Warranty: void since first teardown.
Disassembly & debugging
  • IDA Pro
  • Ghidra
  • rizin / cutter
  • gdb + gef
  • lldb
Hardware & firmware
  • logic analyser
  • Bus Pirate
  • flashrom + CH341A
  • JTAG / SWD
  • a hot air station and no patience
Languages
  • C
  • Python
  • Rust
  • x86-64 asm
  • ARM / Thumb
  • m68k, occasionally
Fuzzing & instrumentation
  • AFL++
  • libFuzzer
  • Frida
  • QEMU user-mode
  • Valgrind
Radio & signals
  • GNU Radio
  • HackRF
  • rtl-sdr
  • Universal Radio Hacker

Device status: This device is working properly. Which is, frankly, more than can be said for most of the things I plug it into.

Device Manager

This device is working properly.

contact.pgp
Handle
Zerbastoun
Mail
zerbastoun [at] zerbania [dot] net
Key ID
0x6A02F1E5
Fingerprint
9F3A 71C2 0D48 E6B1 55AF 2E90 C417 8D3B 6A02 F1E5
github mastodon irc

Encrypted mail only, ideally. Unencrypted mail also arrives, it just arrives judged.

-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: this one is decorative. the real one is on the keyservers.

mQINBGTfA1kBEADQ7yV0pXcM2hRk9LtBvNqZaGx4WuoY1JcE8sTfKmR3ZbnHwLdA
v9XqO0KpS6NcYbTgE7lRuMh2FaJdQz1WkPxCnV8oIrGtS5eBLyDhAm4KzUwQfNjX
RcPbE2ihVsLoY7dTqA9nWmFuKxZ0gJcRtBvNeSlDaHpMyIkQwXrOfUvC3TgZ6NbA
kLpJxRmWvEoDcYtHfQzSaUgNiVbXlKrPmOeAdTwZ9CuIyBnLqFhJsXvRkMaGtEoP
wYdNzC4VuHiKbSfLxQrAmTjEoZpNcWgUyIdRvBhKlXsOaFtJmQnPeCzYuWrGdSbA
iLkVoXpTnMeQfBcHzRaJyUsWgKdNlOtPvExCmZrIbFqAhSuYnTwJdGkLoRxVcPeM
bZaQtHfNiUyKrOlXwSgDmCvEpJzBanRdLkTqIoWuYhFxNcMeSgVbPtZjArKlDwOn
yEuIqTfCbXhVaJmNzKrLdSoWpGuQeAiYtBcMxNfRvHkZlOjPnTwSdCgUmIrKaEbY
=Zb7q
-----END PGP PUBLIC KEY BLOCK-----

Key rotates when I remember to rotate it, which is roughly never. Check the fingerprint against a keyserver before you trust it with anything that matters.

1 key

trust: ultimate

Recycle Bin
1 object · 3.0 MB

zerbaland.skyblog — a faithful Skyrock replica, Comic Sans and all, deleted on the day this desktop booted. Its Windows Media Player autoplay, its 14 animated GIFs and its 108 unread com's are gone. Some things should not be restored from backup.

(It still exists in the git history, which is the only place it can no longer hurt anyone.)

1 object

3.00 MB

    --:--
    Your computer might be at risk Zerbania Firewall is turned off. It has been turned off since 1998 and things have been fine. Click here to ignore this message forever.
    Zerbastoun
     
    press any key to skip
    ██████ ██████ █████  █████   ████  ██  ██ ██████  ████ 
       ██  ██     ██  ██ ██  ██ ██  ██ ███ ██   ██   ██  ██
      ██   █████  █████  █████  ██████ ██████   ██   ██████
     ██    ██     ██  ██ ██  ██ ██  ██ ██ ███   ██   ██  ██
    ██████ ██████ ██  ██ █████  ██  ██ ██  ██ ██████ ██  ██
    ZerbaniaOS Phosphor Edition © MCMXCVIII–∞ Zerbastoun. all rights reversed.
    ZerbaniaOS

    A problem has been detected and ZerbaniaOS has been shut down to prevent damage to your curiosity.

    ZERBANIA_KERNEL_CURIOSITY_OVERFLOW

    If this is the first time you've seen this stop error screen, that's suspicious. Nobody gets here by accident.

    Technical information:

    *** STOP: 0x0000ZERB (0xDEADBEEF, 0xCAFEBABE, 0x00000000, 0x1337C0DE)

    *** zerbania.sys - Address 0x1337C0DE base at 0x00000000

    Press any key to reboot _

    It is now safe to turn off your computer. (press any key to boot it back up, obviously)