Caralynx
banner
sudo.caralynx.com
Caralynx
@sudo.caralynx.com
Reverse engineering, Japanese toy hacking, constantly distracted. Is ordinarily a tufty cat. Icon by @rokuromon.bsky.social, banner by @hackmonthegoat.bsky.social‬

Teardowns: @teardowns.caralynx.com | Ko-fi: https://ko-fi.com/caralynx
Looks like I'm going to #39c3 this year
November 3, 2025 at 8:27 PM
I received a virtual prepaid debit card as a part of a promo, and selected to convert it to plastic. In the meantime, I spent it, and apparently they issued the card after that, because they printed a value of $0.00 on the card. Funniest thing I've seen all day.
October 29, 2025 at 4:06 PM
I tried to turn on my PowerEdge R630 that has been sitting around turned off for like half a year, and it is no longer turning on. Getting a ton of errors about voltage levels and CPU thermal trip when trying to turn it on. I think it might be a system board issue. Anyone got any ideas?
October 26, 2025 at 7:18 PM
Here's the code for generating that hash. Way too much SHA256 and SHA512 IMO, they could probably have made this simpler. Or used an HMAC.
September 26, 2025 at 3:57 PM
Finally, we get into the actual scrambling logic. First is a generator function that returns the X/Y coordinate (in terms of tiles, not pixels) of the tiles to swap. It passes the array [0, 1, ..., numTiles ** 2] to the generate scramble map function, and generates which tile to copy in dest order.
September 26, 2025 at 3:57 PM
The tile size is calculated by first finding the LCM of the number of tiles horizontally and vertically (defined as 4 by the caller) and 8. Not sure why it needs to be a multiple of 8, but that's what they specified.
September 26, 2025 at 3:57 PM
Let's look at the unscramble function. It draws the scrambled image, gets the tile size and checks whether it and the scramble seed (supplied by the web API) is valid, clears the scrambled region (we'll see why it draws the image first later), then draws each tile according to a generator.
September 26, 2025 at 3:57 PM
The page sets up a Vue component for displaying a canvas of the unscrambled image. That then creates a class that generates said canvas, and exposes functions for loading the scrambled image and drawing to the unscrambled canvas. Here's the code for drawing the canvas.
September 26, 2025 at 3:57 PM
Sudo has a winter coat too
September 17, 2025 at 5:02 AM
Converted the full color textures to masks
September 17, 2025 at 5:02 AM
I made a mod for @crittercove.bsky.social for loading custom skins. The loading part is easy; next step is to figure out how to export the model and texture from the current body parts selection so people can have a reference to work from.
September 11, 2025 at 2:14 PM
Here's what the help command prints. You can see it trailing with a prompt, except that gets clobbered by the success message at the end of command processing.
September 8, 2025 at 11:30 PM
For some reason if the command is one character, it checks the character directly, but if it's two, it uses memcmp(). I'm not sure if the compiler optimized the one-character the case, but using memcmp() is pretty wasteful when you could just check two characters directly.
September 8, 2025 at 11:30 PM
The number length is capped to 8 characters, which is fine, but it'll be truncated counting from the left, which isn't exactly how numbers usually work. Here's hex2int(), which doesn't seem to check whether you enter letters above F.
September 8, 2025 at 11:30 PM
Now let's look at argument handling. Nifty code, though still buggy. The code splits arguments by spaces, and records the index of each space. It's a pretty naive approach, though. If multiple spaces are entered in a row, they count as blank arguments.
September 8, 2025 at 11:30 PM
Here's the start of the function. The buffer is 4KB. No idea why it's so large, because none of the commands use that much space. First thing to note in the code is it immediately accessing a negative array index. For some reason whoever that wrote the console code is allergic to bounds checking.
September 8, 2025 at 11:30 PM
Continued looking through SNC7330's bootrom, and here's a perplexing piece of code that I reconstructed. It's supposed to return the block (or page?) to read the load table from (basically a bad block table), but I'm pretty sure it doesn't actually work.
September 1, 2025 at 4:54 AM
Managed to find the code in question in the SDK. `over_sampling` is a power of 2, so they could have easily done a shift with one less bit, checked that bit, and rounded up instead of doing any floating point operations.
September 1, 2025 at 4:53 AM
What I've been working on recently: figuring out how to create custom items for Tamagotchi Paradise

Download icon by @ponah.bsky.social, dot sprite by @rayjt9.bsky.social
August 16, 2025 at 9:00 PM
Stupid code found in the runtime for a course produced with Articulate Rise 360. This is not minimized. What's wrong with `arr.indexOf(val) !== -1`?
August 1, 2025 at 12:05 AM
No cheating, post your lock screen!
July 26, 2025 at 7:42 PM
Congrats to 1k!
July 3, 2025 at 11:02 PM
I played Critter Cove Demo (@crittercove.bsky.social) yesterday, and the character customization is pretty good. Was able to make a fairly good approximation of Sudo (colors adjusted manually in the save file). Wish it was possible to import custom textures for exact markings.
June 22, 2025 at 8:08 PM
Who TF returns an exception instead of throwing it?
May 23, 2025 at 4:20 PM
Definitely not suspicious at all
May 10, 2025 at 11:49 PM