Readit News logoReadit News
Posted by u/jstrieb 2 years ago
Show HN: Tetris, but the blocks are ARM instructions that execute in the browserofrak.com/tetris/...
OFRAK Tetris is a project I started at work about two weeks ago. It's a web-based game that works on desktop and mobile. I made it for my company to bring to events like DEF CON, and to promote our binary analysis and patching framework called OFRAK.

In the game, 32-bit, little-endian ARM assembly instructions fall, and you can modify the operands before executing them on a CPU emulator. There are two segments mapped – one for instructions, and one for data (though both have read, write, and execute permissions). Your score is a four byte signed integer stored at the virtual address pointed to by the R12 register, and the goal is to use the instructions that fall to make the score value in memory as high as possible. When it's game over, you can download your game as an ELF to relive the glory in GDB on your favorite ARM device.

The CPU emulator is a version of Unicorn (https://www.unicorn-engine.org/) that has been cross-compiled to WebAssembly (https://alexaltea.github.io/unicorn.js/), so everything on the page runs in the browser without the need for any complicated infrastructure on the back end.

Since I've only been working on this for a short period of time leading up to its debut at DEF CON, there are still many more features I'd eventually like to implement. These include adding support for other ISAs besides ARM, adding an instruction reference manual, and lots of little cleanups, bug fixes, and adjustments.

My highest score is 509,644,979, but my average is about 131,378.

I look forward to feedback, bug reports, feature requests, and strategy discussions!

once_inc · 2 years ago
As a programmer with practically 0 experience in working with assembly, this is a pretty cool tool to learn! I've been holding a cheatsheet in another tab to find out what each instruction is doing.

Kudos for building this, very cool!

edit: getting -4.8 billion as a high score because of my first segfault was... a disappointment, though. :-P

LoganSnow · 2 years ago
This is really cool! So far I have a high score of 65612 :)

Some feedback:

- When opening the help menu, it wasn't obvious how to close it (I think the only way is by pressing '?')

- I like the Goblin music!

- It's a pretty nice interface to play with the instructions and I appreciate the color coding. It would be neat if there was a "sandbox mode" where you could preview the effects of running an instruction, and maybe modify your program once the game is over. I could see this being pretty useful for someone learning ARM assembly.

jstrieb · 2 years ago
I like the idea of sandbox mode!

I'm definitely much quicker at reading ARM assembly after playing a few hours of this game over the course of making it.

mpeg · 2 years ago
This is so clever, I couldn't help but smile when I saw "Your score is stored in memory at the address pointed to by R12" :)

Thanks for sharing, it does makes me miss DEFCON, maybe next year...

velosol · 2 years ago
Is the reason for R12 making you smile something you could share?
mpeg · 2 years ago
It's the fact that the score is handled within the game mechanics itself – so the way to get a high score is not just to play but to play with the goal of modifying R12 (so it points to a high value)

They could have easily made score be handled outside the game and you get a point per every executed statement within the time limit etc – but that would not be as fun

Jerry8538 · 2 years ago
> Your score is stored in memory at the address pointed to by R12

As someone who has very little idea of what instructions or addresses are, what is this a reference to?

Edit: I had the page loaded before your reply, so I didn't see it until I replied, reloading the page lol

justsid · 2 years ago
It's not a reference, it's just a really neat game mechanic. Normally the high score is guarded by the game and changes only if the game deems it fit to change it. In this game, because the high score is accessible within the game and you can execute arbitrary instructions, you can use that to modify the high score.

It's as if in a more normal game the high score was kept in a big chest somewhere in the game world and once discovered you can start messing with the contents of it all within the rules of the world itself.

jstrieb · 2 years ago
So far, I've used two good strategies:

- Spray PC into as many registers as possible, try to add those registers together as many times as possible, and store the sum at zero (or wherever the score ends up)

- Load an assembled instruction from an old value of PC as an int into a register, then do some subtraction to make it non-negative (since it's usually negative in my experience), then store in the score location

I'm curious what other strategies people have tried?

stavros · 2 years ago
I've had a lot of success segfaulting the game, as I don't know any assembly.
tiborsaas · 2 years ago
Very cool concept, but my assembly understanding is really poor :)

It says that my score is stored in R12, but then why do I have a score of 16 of R12 is zero?

https://imgur.com/a/RY5jhTu

jstrieb · 2 years ago
R12 contains the address of your score. In this case, that is address 0 - the start of the data segment.

The score register is yellow, and the corresponding memory region it points to (the actual bytes of your score) are also yellow.

tiborsaas · 2 years ago
Thank you, it makes sense now.

If you'd like to do a video tutorial how to play this well that could be a great resource to learn assembly intuitively.

personjerry · 2 years ago
I'm computer literate (and know some basic assembly) but wow I did not get it
jstrieb · 2 years ago
Hey, any specific questions? I'd be happy to explain anything that needs clarification.

More broadly, any thoughts on how to make the game clearer? I know that a manual describing the instructions would help. But other ideas are welcome as well!

LLyaudet · 2 years ago
You could add a puzzle mode with a fixed set of instructions introducing gameplay elements like rotate after a few puzzles to make it easier and more interesting to learn the game. My first play, I got a lot of sub instructions and my registers had all zero value. It was somehow partly pointless: Should I rotate and do sub R1, R2, R3 or do sub R2, R3, R4 to get a nop somewhere ? ;) XD
joshxyz · 2 years ago
i code frontend and backend web apps in javascript and typescript, very comfy with cloud stufd

but oh boy these assembly stuff these are heiroglyphs to me haha

ithkuil · 2 years ago
I don't understand what "rotate the instruction order" keys do. I tried pressing them in many circumstances and nothing happens
rpgwaiter · 2 years ago
Maybe a way to break down a game after it happened, or maybe a sandbox mode to try arbitrary things
shaunxcode · 2 years ago
Beautiful brutalist ui/ux!
Lapsa · 2 years ago
yeah... wanted to leave a comment I dig the aesthetics.
latexr · 2 years ago
Before trying it I hit “About” and it opened a new page which says:

> By continuing to use this site, you agree to the use of cookies.

You seem to be in violation of the GDPR. There must be a way to refuse the cookies that is as simple as accepting them. Especially since yours are not needed for the site to function:

> The Services use cookies and similar technologies such as pixel tags, web beacons, clear GIFs and JavaScript (collectively, “Cookies”) to enable our servers to recognize your web browser, tell us how and when you visit and use our Services, analyze trends, learn about our user base and operate and improve our Services. (…) We may also supplement the information we collect from you with information received from third parties, including third parties that have placed their own Cookies on your device(s).

https://ofrak.com/privacy/#tracking-tools-and-opt-out

Telling people to delete cookies via their browser settings (further down that page) is not an acceptable solution.

fuomag9 · 2 years ago
Unfortunately this practice has been happening with a lot of websites, and many companies are not complaining with the cookie law

https://www.cnil.fr/en/refusing-cookies-should-be-easy-accep...

sabas123 · 2 years ago
Not sure if it's an error from using autocorrect, but you probably want to use complying instead of complaining.
chronogram · 2 years ago
It's not even storing anything illegal on my end, only the game settings, so I don't know why it shows that banner.
hooch · 2 years ago
Telling site visitors to disable cookies via their browser is precisely how apple.com does it.
latexr · 2 years ago
Even if Apple is in violation, that doesn’t make it acceptable or within the law. Big companies (notably Meta) frequently don’t comply with GDPR and are beginning to pay the price for it and making changes.

https://noyb.eu/en/5-years-litigation-meta-apparently-switch...

I was pleasantly surprised to see Apple’s cookie policy is considerably less intrusive than the submitted website’s.

https://www.apple.com/legal/privacy/en-ww/cookies/

matsemann · 2 years ago
GDPR doesn't care about cookies. It depends on what they're used for. If they're not used for tracking or storing personal information, GDPR doesn't apply.

It's easy to read the original comment as if you need to ask permission for any cookie usage. But that's not what they're saying. They're saying it applies for this site's cookies, as the site specify they use cookies in a way that GDPR would say you need consent for.