« Nintendo 3DS Architecture (index)

Nintendo 3DS Architecture

Chapter 11: Anti-Piracy and Homebrew


Table of Contents

  1. Main targets
  2. The card reader front
  3. The Operating System front
    1. Dedicated hardware
    2. Chain of trust
    3. Operating system functions
    4. Flaws
  4. Defeat
    1. The DS flashcard era (2011-2013)
    2. The 3DS flashcard era (2013-2016)
      1. The first real 3DS Flashcard
      2. Inside the Gateway3DS
      3. Subsequent anecdotes
    3. Nintendo acts fast
    4. The dawn of homebrew (2014)
      1. Open-source SDKs
      2. Ninjhax chain
      3. Gaining Kernel11 access
    5. Most-wanted tools
    6. New console, permanent mods (2015)
      1. arm9loaderhax
      2. The effects of arm9loaderhax
    7. The Golden Age (2016-2017)
      1. Extracting Boot9
      2. Sighax
      3. Boot9strap
      4. Ntrboot
    8. The remaining years (2018-present)
      1. The Safe Mode route
      2. The HOME Menu route
      3. Post-2023 and conclusions

The history of hacking this console is a long and interesting sequence of events. At first, interests focused on cracking game card readers (in an attempt to replicate the success of the Nintendo DS) and then shifted towards more sophisticated approaches, only involving the operating system.

Main targets

First things first, let's start by describing the two main targets of this system:

They may look like two independent fronts (similar to the Xbox 360 and Wii U), but in the case of this console, both are intertwined. You'll see it in a bit.

The card reader front

The card reader is the interface between the CPUs and the Gamecards' memory chip. Its only job is to simplify the communication with the use of commands.

Inside the ROM/Flash of CTR Carts, the system will find a block of data in a secured format called NCSD, this will be handled by the operating system, who will be in charge of authenticating, validating and decrypting it.

In conclusion, it seems the OS is solely responsible for the communication with the card reader, so let's move on to the next front.

The Operating System front

Before we continue, if you're not familiar with symmetric and asymmetric encryption systems, I recommend reading previous articles of this series. They will also explain why systems like this rely so much on asymmetric encryption systems (such as RSA and ECDSA).

Dedicated hardware

You'd be right if you suspected that the ARM11 lacks the powerhouse to protect the whole system. Nintendo knew that too, so they took extra care and bundled extra components to compensate:

To top it off, everything is sealed in an SoC, including the two boot ROMs (Boot9 and Boot11). These are unencrypted, but since they're inaccessible, they don't represent a concern.

Chain of trust

This should come as no surprise considering we've already introduced RSA, AES and the boot ROM as part of the security system. To give you an overview of the Nintendo 3DS' change of trust:

  1. ARM9's boot ROM (Boot9) bundles the public key for decrypting and validating the contents of the NAND. The AES engine will be initialised with the keys stored in Boot9. With this, the contents of OTP memory will be accessed.
  2. The contents of eMMC are decrypted using Boot9's AES keys combined with the eMMC CID.
  3. NAND and CTR cards are formatted using the NCSD format . NCSD stores a header and a collection of up to eight partitions. The NCSD header contains a signature using RSA-2048 and SHA-256, which is quite strong. To decrypt this signature, the system finds its public RSA key in the boot ROM or ITCM memory (the latter was previously decrypted and copied from OTP). The choice depends on where the NCSD block came from (NAND or CTR card).
  4. Once the NCSD block is validated, the system accesses each partition. These are structured using the NCCH (Nintendo Content Container Header) format. Independently whether the data was pulled from NAND, the CTR card or the SD card, the NCCH block also contains an RSA-2048 + SHA-256 signature , and its payload is encrypted with AES-128 CTR.
  5. Furthermore, installed software is catalogued in the form of Titles (similar to the Wii System). In this case, all titles are signed with either RSA-2048, RSA-4096 or ECDSA; plus SHA256 . The public keys are stored in NATIVE_FIRM.
    • It does surprise me that some signatures are in the form of ECDSA, considering there's no hardware accelerator installed for it.
  6. Once the payload is verified and decrypted, the system will find either an executable, library or asset (i.e. manual, icon or banner) that the ARM11 can read.

Please note, this explanation focuses on the main 3DS firmware (NATIVE_FIRM). Yet, TWL_FIRM and AGB_FIRM will also have their share of cryptography implemented.

As time passed by and hackers got the handle on how this console was protected, Nintendo shuffled the chain of trust further to deter the decryption of NCCH data. In some ways, it achieved its purpose, but in others, Nintendo ended up revealing too much. You'll see it in the following sections.

Operating system functions

Once NATIVE_FIRM is up and running, in addition to the aforementioned chain of trust, the following security mechanisms are present:

Flaws

Even though the Nintendo 3DS enjoyed modern protection techniques, such as asymmetric cryptography and lots of hardware at its disposal, there were some fundamental flaws in its implementation. Take a look at the following findings discovered by the hacking community:

This will not only pave the way to the first exploitation attempts, but will also act as a constraint for Nintendo when they try to patch their system.

Defeat

The history of the Nintendo 3DS and Homebrew is a successful one. Tons of video tutorials can attest to that. Yet, the passage exposes very clever discoveries, which evolved from initially requiring proprietary and expensive equipment to just a couple of clicks on your computer.

The DS flashcard era (2011-2013)

Where to begin? Well, from where the Nintendo DSi left it off: Flashcards.

After the release of the Nintendo DSi in 2008, Nintendo incorporated a new element to fight against Flashcards: A whitelist file listing every single licensed card and thereby blocking the 'unauthorised ones' . By no means Flashcard manufacturers ceased their production, they just shipped new variants of their old Flashcards that allowed the user to re-program the cartridge header, enabling the card to identify as a different authorised game whilst Nintendo kept amending the list (through software updates).

This method encompassed the Nintendo 3DS as well, following the same process as the Nintendo DSi. On no account they would get access to the exclusive 3DS hardware, yet this is how Homebrew started in this console.

The 3DS flashcard era (2013-2016)

There wasn't much progress during the first two years of this console (a big achievement for Nintendo!). Yet, things took a turn in August 2013...

The first real 3DS Flashcard

Image
The Gateway3DS package .

Ignoring teasers of '3DS Flashcards' that never appeared . Gateway3DS can be considered the first 3DS Flashcard to reach the stores. The instructions were not as simple as DS counterparts, however. You can sense this by looking at the contents of the box:

After completing the installation process, users would have to follow these instructions to run any game:

  1. Insert the Red Gateway card. Nothing will appear, yet.
  2. Open the 3DS settings app and navigate to the DS profile editor screen.
  3. For some reason, the 3DS will restart and the flashed 3DS game will show up.
  4. After finishing playing a game, returning to the HOME Menu will create a savefile in the 3DS' SD card.

And just like that, users were now able to download 3DS ROMs from the net and run them on their consoles... but how was all of this possible? How did anyone manage to extract decrypted games? What exploits did Gateway3DS employ (or even discover)?

Truth is, there's a lot of hidden functionality within this product. Let's analyse it step by step.

Inside the Gateway3DS

Image
The DS Message editor found on the 3DS settings app. The character limit is solely enforced by the graphical interface.

Sometime in 2012, hacker 'ichfly' discovered interesting behaviour in the Nintendo DS' old profile editor, found on both NATIVE_FIRM and TWL_FIRM. In one of its text fields, you can enter a 'Message' value, which will then be displayed as a greeting on PictoChat rooms . The 3DS' settings app won't allow you to enter more characters than allowed. Yet, nothing prevents a Nintendo DS game from doing so. When that happens, opening the 3DS' System Settings app (called MSET) will crash, and what makes it interesting is that this is caused by stack overflow . Does this remind you of a certain horse name?

Now, the mysterious Launcher.dat by Gateway is a configuration file that the Settings app normally reads. What happened is that Gateway crafted their own Launcher.dat to embed data used for the next stages of their exploit. Curiously enough, Launcher.dat is stored in NAND (not in the SD), so the initial exploit chain also alters where the Settings app loads this from.

If you combine this with a Process9/Kernel9 exploit, you get full execution privileges on this console and can start fiddling with system services. Some hardware like OTP and the boot ROMs will still be out of reach. Yet, this is a significant milestone.

So far so good? Let's now connect this information with Gateway's package:

Subsequent anecdotes

All seemed jolly for Gateway until November 2013, when a stream of clones of their card landed. 'R4i Gold 3DS Deluxe' came for some healthy competition, albeit by using some of Gateway's firmware code. In retaliation, Gateway3DS took drastic measures: Subsequent firmware updates of Gateway3DS corrupted the 3DS NAND if a clone was detected. The irony!

In October 2013, hacker 'Smealum' published a video showing his own MSET-based implementation that instead booted a copy of NATIVE_FIRM stored in the 3DS' SD . This meant that consoles stuck on system 4.5.0 could boot newer system versions without losing the ability to run exploits. Smealum called this function redNAND (from 'redirected NAND') and, while it wasn't publicly released, Gateway later incorporated this functionality (now referred to as emuNAND) with their CFW released in December 2013 . This became a strong selling point for Gateway3DS.

It's not known what Process9/Kernel9 exploit Gateway employed. Yet, in December 2013, Fierce_Waffle, Xerpi and Megazig reversed engineered and open-sourced Gateway's payload in the form of a tool called '3DS Toolkit' .

In the following years, a second generation of 3DS flashcards will appear in the market. Examples include Stargate, Sky3DS and dozens of clones. This time, they didn't rely on an operating system exploit to work and could load multiple games from their microSD. However, their utility will be entirely based on replicating retail 3DS games (including their signatures), in other words, for solely piracy purposes.

Nintendo acts fast

Having an updatable system software meant Nintendo didn't have to stand there and watch how its system got cracked:

As always, this marked the start of another cat-and-mouse game. Though, to make a long story short, system update 9.3.0 (released in December 2014) finally put an end to Gateway3DS by patching their private Kernel exploit . Since then, Gateway3DS' firmware updates only improved emuNAND support with the latest system versions (for those who didn't update past the breaking update). In 2016, Gateway's last update was released. Meanwhile, Sky3DS enjoyed support until system software 11.0 (released in May 2016) , when Nintendo blacklisted it for good.

I think now it's fair to say that the 3DS flashcard market ended up being too turbulent and unreliable for the average user, compare this to the 'plug & play' experience Nintendo DS flashcard offered. Finally some good news for Nintendo, so far.

The dawn of homebrew (2014)

2014 saw an emergence of homebrew-focused solutions in a circle populated by piracy-oriented developments . Hacking a 3DS still required an old system version, a Gateway3DS card and emuNAND - but that would slowly shift once alternative tools gained traction.

Image
Plutoo, Derrek and Smealum presenting their findings at the 32nd Chaos Communication Congress (2015) , the following paragraphs will explain most of them.

Open-source SDKs

Initial Homebrew appeared in the form of Laucher.dat files, these were produced with the help of devkitARM (a general-purpose toolchain for ARM-based CPUs) and a set of scripts. Fierce Waffle provided 'ROP Loader', a toolkit that included a DS program to install the MSET exploit; and a Launcher.dat that triggered a Kernel11 exploit. It's worth pointing out that there wasn't any tool available, yet, that helped access the 3DS' exclusive hardware.

At the start of 2014, Smealum, with the collaboration of yellows8, ichfly, WinterMute, fincs, mtheall and plutoo, released ctrulib, an open-source C library to facilitate Homebrew development . This is now known as libctru and maintained by the devkitPro group, who have incorporated it into their toolchain.

A year later, neobrain released nihstro , a PICA200 shader assembler a disassembler, making the job of programming the PICA200 a bit more enjoyable.

To run Homebrew, users had the option to flash a homebrew binary into a microSD, and then use the Gateway3DS to boot it (as their CFW already disabled signature checks) .

Ninjhax chain

Image
The Homebrew Launcher, inspired by the iconic Wii counterpart. Its arrival marked the sophistication of 3DS Homebrew.

The poisoned updates of Gateway left a bitter mark on their users. The time had come to look for nonproprietary alternatives.

Thankfully, people were working on this. During the second half of 2014, a new milestone awaited for the Homebrew community: Smealum published Ninjhax, a package composed of the following components :

  1. A crafted QR code to be scanned by 'Cubic Ninja', a game that allows to share user-designed levels using QR codes. This served as a new entry point exploit.
  2. GSPWN: A userland vulnerability where the GPU's DMA is used to write over the HOME Menu's heap. Furthermore, the combination with ROP leads to privilege escalation. This resulted in the ability to create & kill processes, SD card access, decrypt & dump titles and override executable data.
  3. Homebrew launcher: A new service running under the HOME Menu process thanks to GSPWN. It provides a graphical user interface to load unsigned Homebrew apps (using a new portable .3dsx format) and take over processes. The launcher loads homebrew by opening an official application with enough privileges and then hijacks it with GSPWN, replaces the code with Homebrew code and finally executes it.
    • With its ability to alter user data, the Homebrew launcher can also be used to install alternative entry points as they're discovered (i.e. OotHax, Ironhax and so forth). Thus, reducing its dependency on Cubic Ninja. A notable aftermarket exploit was MenuHax, which exploited a vulnerability in the HOME Menu theme engine and was triggered at boot, making it a permanent solution to launch a payload.
    • If you are curious, the Wii U also experienced similar methodologies as early attempts to run Homebrew.

Notice how Gateway3DS is, for once, out of the equation. Be as it may, the Homebrew Launcher was still under the scope of userland (meaning homebrew apps could only access 64 MB of RAM and had no access to the audio DSP ).

Gaining Kernel11 access

Turns out that before the publication of Ninjhax, in February 2014, yellows8 made a very important discovery: An exploit leading to Kernel11 privileges.

Kernel11 keeps track of the unused memory pages in FCRAM using a structure called memchunk header. This data is stored as a linked list, where each header contains the address of the previous and next header. Well, it so happens memchunk headers are stored in FCRAM, which may be overwritten thanks to other exploits like GSPWN. Consequently, memchunk headers can be modified to grant userland access to AXI WRAM. In doing so, the attacker can eventually modify the Kernel11's page table to grant all FCRAM access to user-space, leading to arbitrary control of Kernel11. This discovery was called memchunkhax.

Nevertheless, Nintendo patched it in December 2014 . However, another hacker by the name of derrek found a race condition where the 'next' pointer of a memchunk header may be replaced with the location of a crafted one. So, when Kernel11 tries to access the crafted memchunk header, it will end up executing arbitrary code with Kernel11 privileges. Ipso facto, memchunkhax2 came into existence.

Thanks to the new privilege escalation, Homebrew software gained complete control of the system up to the ARM9 area... but why stop there?

Most-wanted tools

Considering the availability of Gateway3DS' emuNAND, Ninjhax, CTRLib and the new Kernel exploits, the flood of new software was too great to ignore. To mention a few:

New console, permanent mods (2015)

While homebrew developers were busy fiddling with their system, Nintendo released a new product to the surprise of everyone: The New 3DS.

Apart from the extra hardware (already mentioned throughout this article), a new stage was added to the boot process: arm9loader. With this, Nintendo enhanced their chain of trust by adding new keys, which must be decrypted with the help of a hash of OTP memory (therefore, using console-unique values) . However, arm9loader and the new keys are still stored in NAND, meaning that the contents may be overwritten. This led to one of the most disrupting vulnerabilities of 2015, involving Plutoo, Yellows8 and Delebile.

arm9loaderhax

The first implementation of arm9loader was flawed: the decryption key for the ARM9 system was never removed from the AES engine. So, with the help of additional exploitation, one could reconstruct part of the encryption keys . Consequently, Nintendo quickly tried again with arm9loader v1.1 (found on system update 9.6.0). As luck would have it, this led to a more powerful exploit: Plutoo discovered that the key used to decrypt the ARM9 system was never verified. Hence, arm9Loader will boot NATIVE_FIRM even if the decrypted data is wrong (a.k.a. garbage). Plus, if Firm0 (the first copy of NATIVE_FIRM) fails to boot, Boot9 will try to load Firm1 while the remains of Firm0 stay in the ARM9's RAM.

All in all, if:

... you got yourself arm9loaderhax, a permanent exploit that provides arbitrary code execution with Kernel9 privileges at boot time!

Since Kernel9 access was now possible, albeit through difficult means, work was put into simplifying the process (i.e. developing an automated installer).

The effects of arm9loaderhax

New discoveries meant new developments. Over the following months, more advanced tools will become part of the 'must have' list of every homebrew user.

To start with, a new CFW to-rule-them-all shipped: Luma3DS . Among many features, Luma3DS provides:

Initially, Luma3DS was bootstrapped with BootCtr, but that changed once arm9loaderhax became the de-facto hack for any 3DS. Thus, the arm9loaderhax + Luma3DS combination became part of any hacking tutorial.

Along it, other software appeared:

It's worth mentioning that, at the time of this writing, these are the most popular utilities to install on a hacked 3DS.

The Golden Age (2016-2017)

While a universal and powerful solution, installing arm9loaderhax was still considered a complicated and dangerous activity. Not only does this require dumping the console's OTP memory beforehand (using other exploits), but neglecting any step could potentially turn a working Nintendo 3DS into a rock.

But fear not as new developments were in the works (a mighty effort considering Nintendo was still battling to protect their console).

Image
naehrwert, nedwill and derrek presenting a new set of findings at the 33nd Chaos Communication Congress (December 2016) .

At the 33C3 conference, derrek unveiled two major discoveries , which led to subsequent milestones.

Extracting Boot9

For some reason, the contents of ARM9's RAM are not cleared upon reset. Thus, Derrek discovered that, with the use of external hardware, he could override the exception vectors from ARM9's RAM (previously copied from Boot9) with arbitrary code. Then, reset the system, glitch it at very precise timing (also using external hardware) to trigger an exception and hope for the ARM9 to have executed the new code. This will have included something like 'Copy all contents of Boot9 to X location in RAM'.

Lo and behold, this did work. With this, Derrek and others managed to analyse the contents of the Boot9 ROM, allowing new vulnerabilities to be found.

Sighax

One vulnerability from Boot9 was Sighax , a flaw in Boot9's RSA-2048 signature verification. RSA signatures of type 'PKCS #1 v1.5' (adopted by this system) contain an area called padding to prevent being reversed. Additionally, they store an SHA-256 hash encoded with a model called 'ASN.1', this guarantees the authenticity of the data being decrypted.

Now, the respective parser found in Boot9 lacks several protections, including bounds checking. In the end, this allowed Derrek to produce a crafted RSA signature (through brute-forcing) that will always succeed on any data. In doing so, the entirety of the chain of trust was nullified.

For the curious, I recommend reading a comprehensive post in GBATemp describing the theory more calmly .

With this, one would now be allowed to craft a firmware for the ARM9 core, sign it with a crafted RSA signature, install it on NAND and Boot9 will 'just run it'. The question now is, how can the average user do this using an unmodified console?

Boot9strap

The year is 2017. Most know about the existence of Sighax but only a handful can apply it, all because the new method requires a crafted RSA signature and writing access to the NAND, none of which is easy to come by (and let's not forget Nintendo was still clamping down hard on userland exploits through system updates). Luckily, Sighax was in the process of being democratised.

Even though Derrek's announcement didn't include a suitable RSA signature or a copy of Boot9 (due to copyright reasons, I'm guessing), that didn't stop hackers SciresM and Myria from finding alternative resources that would enable them to craft an RSA signature.

In summary, they discovered that system versions before 1.0.0 shared similar flaws to those previously exposed with Sighax and, thanks to this, they were able to begin brute-forcing RSA signatures. The result was a success, a match was eventually found with the help of plenty of Nvidia GPUs .

Now that they could craft an alternative firmware that Boot9 would accept, they needed to find a way to redirect Boot9 to their payload. The challenge was to redirect execution before Boot9 hides its Boot ROM. To tackle this, the duo found a route through the ARM9's exception handlers. The ARM9 can't override these, but the NDMA can - and the CPU can command the NDMA to do so.

All in all, the team were able to use the NDMA to fill the exception handlers with a jump to arbitrary code, and then instruct the ARM9 to copy to NULL, resulting in an exception that would execute the payload with unrestricted access. In the end, this was packaged in a solution called boot9strap and served as an alternative bootloader that could either load a payload from the SD card or continue to boot normally. Consequently, Godmode9 added new options to backup OTP and the Boot ROMs.

And so, boot9strap quickly displaced arm9loaderhax as the de facto solution for loading arbitrary code with maximum privileges.

Ntrboot

Image
Some DS Flashcards sold after the discovery of ntrboot came with a switch to enable a '3DS mode' (see the top corner of the photo), this enables trigger ntrboot.

At this point, there was only one question left: How could users install boot9strap?

Well, the team didn't stop there. By taking a look at their recent Boot ROM dumps, they found an interesting routine: During boot, Boot9 will query if a specific key combination is pressed and the lid is closed. If so, Boot9 will redirect execution to the inserted Nintendo DS card (with full privileges).

Thus, ntrboot came to fruition: Flash a sighax-signed payload into a Nintendo DS flashcard, use a magnet to simulate a closed shell and press the required key combination. Instant Boot9 privileges.

If this wasn't enough, Nintendo couldn't fix any of these vulnerabilities through software updates, as they're hardwired into the Boot ROM. A possible solution would've been to ship new hardware revisions, yet, none ever appeared.

The remaining years (2018-present)

Now that the homebrew community has achieved its magnum opus, the remaining years of the Nintendo 3DS will only see the streamlining of hacking methods, all of which share the same objective: Install boot9strap.

Image
As the methodologies used to hack a 3DS drastically evolve, sometimes too quickly for new users, community-maintained websites like 3ds.hacks.guide currently holds a reputation as the most reliable and updated set of tutorials.

By this point in time, there were many exploits in the wild: 'SoundHax', 'Safehax', 'Browserhax'... too many to mention here. For the curious, 3DBrew provides a comprehensive list .

To give you an idea of how elegant exploitation became by 2023, let me show you a common method users relied on and didn't require extra hardware. This process was called 'seedminer + BannerBomb3' and combined the following vulnerabilities, the majority of them authored by zoogie:

  1. seedminer: User data installed in the 3DS' SD card is encrypted using AES-128-CTR. Its key is constructed from other keys found in a file called movable.sed (console-unique, stored in NAND). Well, it was discovered that this file can be re-constructed by using the console's Friend Code, subdirectory names in the SD card (generated by the console) and short-term brute-forcing. Once extracted, the keys allowed to tamper with DSiWare data in the SD card.
  2. BannerBomb3: An exploit that overflows the stack of the Settings app while it tries to parse the banner of an installed DSiWare title . Combined with seedminer, this serves as an entry-level exploit with Kernel11 privileges.
  3. Now, how to take advantage of BannerBomb3 (i.e. which payload to use) depended on the tutorial the user was following at the time. For simplicity purposes, there were two routes:
The Safe Mode route

This route consisted of exploiting SAFE_FIRM and was described in earlier tutorials:

  1. unSAFE_MODE: Users can boot into Safe Mode by pressing a combination of buttons during the console's boot, the alternative firmware then enables the user to perform a system update, which is useful for repairing the console. Well, zoogie discovered that the proxy settings can be overflowed . Hence, providing userland execution within Safe Mode.
  2. safehax: a port of 'firmlaunch-hax' to work under SAFE_FIRM. Nintendo originally patched it with system update 9.5.0 released in February 2015 . Yet, SAFE_FIRM is an immutable replica of the factory firmware, and thus it features old exploits NATIVE_FIRM once enjoyed.
    1. firmlaunch-hax: When the firmware is booting, the ARM9 stores the firmware's header in FCRAM for verifying and then parsing. With the help of a race condition, execution can take control of the ARM9, so the boot9strap installer can be launched. Nintendo fixed this by keeping the header in ARM9 RAM instead, although this stayed unpatched on SAFE_FIRM.
The HOME Menu route

Sometime later, a new route was proposed by new tutorials. This exploited the HOME Menu with a new Menuhax-style hack:

  1. menuhax67: The screen brightness configuration value can be overflown , leading to userland control from the HOME Menu.
  2. nimdsphax: An modern exploit chain combining 'ctr-httpwn', 'nimhax' and 'dsp pwn' .
    1. ctr-httpwn by yellows8: The HTTP service used for network connections can be controlled by overriding its heap memory (using the old GPU DMA exploit) .
    2. nimhax by luigoalma: Uses ctr-httpwn to escalate and take over the services that control the user file system, console configuration and application management .
    3. dsp pwn by luigoalma: Uses nimhax to take control of the DSP, which in turn uses the GPU's DMA to override the Kernel9 memory space. Thus, obtaining ARM9 privileges.
Post-2023 and conclusions

Be as it may, at the time of this writing, Nintendo hasn't quite surrendered to the cat-and-mouse game. In May 2023, system update 11.17.0 patched BannerBomb3, nullifying one of the last entry points that didn't require additional materials . This means users will now need to either obtain a legitimate 3DS game (which can then be exploited), an ntrboot-compatible DS flashcard; or wait for a WebKit exploit (there's one only left for the New 3DS browser ).


Previous: 10. Games

Next: 12. That's all folks


Rodrigo Copetti © 2026 RSS Feed

Switch to modern edition

Home · Writings · Support · About author · About website