< Return to Video

#rC3 - Hacking the Nintendo Game & Watch

  • 0:00 - 0:13
    rC3 Opening Music
  • 0:13 - 0:19
    Herald: So about our next speaker. He's a
    security researcher focused on embedded
  • 0:19 - 0:26
    systems, secure communications and mobile
    security. He was nominated by
  • 0:26 - 0:40
    Forbes for the 30 under 30 in technology
    and also has won a OWASP Appsec CTF.
  • 0:40 - 0:47
    He has also found and disclosed responsibly
    multiple vulnerabilities. And especially
  • 0:47 - 0:52
    for you Nintendo aficionados I want you to
    watch out for the next intro, which is
  • 0:52 - 0:56
    really amazing and you will all love.
    Thank you very much.
  • 0:56 - 1:01
    shows nintendo cartridge
  • 1:01 - 1:06
    plugs cartridge
  • 1:10 - 1:11
    nintendo start sound plays
  • 1:11 - 1:15
    Thomas: Oh, damn it.
    retrieves cartridge
  • 1:15 - 1:20
    blows into cartridge
    plugs cartridge again
  • 1:22 - 1:23
    nintendo start sound plays
  • 1:26 - 1:29
    music plays
  • 2:53 - 2:56
    Thomas Roth: Uff, what a trip.
    Welcome to my talk on
  • 2:56 - 3:01
    hacking the new Nintendo Game & Watch
    Super Mario Brothers. My name is Thomas
  • 3:01 - 3:05
    Roth and I'm a security researcher and
    trainer from Germany. And you can find me
  • 3:05 - 3:11
    on Twitter at @ghidraninja and also on
    YouTube at stacksmashing. Now, this year
  • 3:11 - 3:16
    marks the 35th anniversary of our favorite
    plumber, Super Mario And to celebrate
  • 3:16 - 3:21
    that, Nintendo launched a new game console
    called the Nintendo Game & Watch Super
  • 3:21 - 3:27
    Mario Brothers. The console is lightweight
    and looks pretty nice, and it comes
  • 3:27 - 3:32
    preinstalled with three games and also
    this nice animated clock. The three games
  • 3:32 - 3:37
    are Super Mario Brothers, the original NES
    game, Super Mario Brothers 2 The Lost
  • 3:37 - 3:45
    Levels and also a reinterpretation of an
    old Game & Watch game called Ball. Now, as
  • 3:45 - 3:50
    you probably know, this is not the first
    retro console that Nintendo released. In
  • 3:50 - 3:57
    2016, they released the NES Classic and
    2017 they released the SNES Classic. Now,
  • 3:57 - 4:02
    these devices were super popular in the
    homebrew community, because they make it
  • 4:02 - 4:06
    really easy to add additional ROMs to it.
    They make it really easy to modify the
  • 4:06 - 4:11
    firmware and so on. And you can basically
    just plug them into your computer, install
  • 4:11 - 4:15
    a simple software and you can do whatever
    you want with them. The reason for that is
  • 4:15 - 4:21
    that they run Linux and have a pretty
    powerful ARM processor on the inside. And
  • 4:21 - 4:27
    so it's really a nice device to play with
    and so on. And so when Nintendo announced
  • 4:27 - 4:32
    this new console, a lot of people were
    hoping for a similar experience of having
  • 4:32 - 4:39
    a nice mobile home brew device. Now, if
    you were to make a Venn diagram of some of
  • 4:39 - 4:43
    my biggest interests, you would have
    reverse engineering, hardware hacking and
  • 4:43 - 4:49
    retro computing. And this new Game & Watch
    fits right in the middle of that. And so
  • 4:49 - 4:53
    when it was announced on the 3rd of
    September, I knew that I needed to have
  • 4:53 - 4:59
    one of those. And given how hard the NES
    and SNES classic were to buy for a while,
  • 4:59 - 5:03
    I preordered it on like four or five
    different sites, a couple of which got
  • 5:03 - 5:09
    canceled. But I was pretty excited, because
    I had three preorders and was supposed to
  • 5:09 - 5:15
    ship on the 13th of November. And so I was
    really looking forward to this. And I was
  • 5:15 - 5:20
    having breakfast on the 12th of November,
    when suddenly the doorbell rang and DHL
  • 5:20 - 5:26
    delivered me the new Game & Watch one day
    before the official release. Now, at that
  • 5:26 - 5:30
    point in time, there was no technical
    information available about the device
  • 5:30 - 5:35
    whatsoever. Like, if you searched for Game
    & Watch on Twitter, you would only find
  • 5:35 - 5:41
    denouncements or maybe a picture of the
    box of someone who also received it early.
  • 5:41 - 5:45
    But there were no teardowns, no pictures
    of the insides and most importantly,
  • 5:45 - 5:50
    nobody had hacked it yet. And this gave
    me, as a hardware hacker, the kind of
  • 5:50 - 5:56
    unique opportunity to potentially be the
    first one to hack a new Nintendo console.
  • 5:56 - 6:00
    And so I just literally dropped everything
    else I was doing and started investigating
  • 6:00 - 6:06
    the device. Now, I should say that
    normally I stay pretty far away from any
  • 6:06 - 6:11
    new console hacking. Mainly, because of the
    piracy issues. I don't want to enable
  • 6:11 - 6:19
    piracy. I don't want to deal with piracy.
    And I don't want to build tools that
  • 6:19 - 6:24
    enable other people to pirate stuff,
    basically. But given that on this device,
  • 6:24 - 6:29
    you cannot buy any more games and that all
    the games, that are on there, were basically
  • 6:29 - 6:34
    already released over 30 years ago. I was
    not really worried about piracy and felt
  • 6:34 - 6:39
    pretty comfortable in sharing all the
    results of the investigation and also
  • 6:39 - 6:44
    the... basically the issues we found that
    allowed us to customize the device and so
  • 6:44 - 6:49
    on. And in this talk, I want to walk you
    through, how we managed to hack the device
  • 6:49 - 6:55
    and how you can do it at home using
    relatively cheap hardware. And, yeah, hope
  • 6:55 - 7:03
    you enjoy it. Now, let's start by looking
    at the device itself. The device is
  • 7:03 - 7:08
    pretty lightweight and comes with a nicely
    sized case. And so it really... for me, it
  • 7:08 - 7:15
    sits really well in my hand. And it has a
    nice 320 by 240 LCD display, a d-pad, A
  • 7:15 - 7:20
    and B buttons and also three buttons to
    switch between the different game modes.
  • 7:20 - 7:24
    On the right side we also have the power
    button and the USB-C port. Now, before you
  • 7:24 - 7:29
    get excited about the USB port, I can
    already tell you that unfortunately,
  • 7:29 - 7:33
    Nintendo decided to not connect the data
    lines off the USB port. And so you can
  • 7:33 - 7:39
    really only use it for charging. Also,
    because we are talking about Nintendo
  • 7:39 - 7:44
    here, they use their proprietary tri-point
    screws on the device. And so to open it
  • 7:44 - 7:49
    up, you need one of those special tri-
    point bits. Luckily, nowadays, most bit
  • 7:49 - 7:54
    sets should have them, but it still would
    suck, if you order your unit and then you
  • 7:54 - 8:00
    can't open it up, because you're missing a
    screwdriver. After opening it up, the
  • 8:00 - 8:04
    first thing you probably notice is the
    battery. And if you've ever opened up a
  • 8:04 - 8:08
    Nintendo switch joycon before, you might
    recognize the battery, because it's the
  • 8:08 - 8:13
    exact same one that's used in the joycons.
    This is very cool, because if down the
  • 8:13 - 8:17
    line, like, let's say in two or three
    years, your battery of your Game & Watch
  • 8:17 - 8:21
    dies, you can just go and buy a joycon
    battery, which you can have really
  • 8:21 - 8:27
    cheaply, almost anywhere. Next to the
    battery, on the right side, we have a
  • 8:27 - 8:32
    small speaker which is not very good. And
    underneath we have the main PCB with the
  • 8:32 - 8:38
    processor, all the storage and so on and
    so forth. Let's take a look at those. Now,
  • 8:38 - 8:45
    the main processor of the device is an
    STM32H7B0. This is a Cortex M7 from
  • 8:45 - 8:53
    STMicroelectronics with 1.3 MB of RAM and
    128 kB of flash. It runs at 280 MHz and is
  • 8:53 - 8:59
    a pretty beefy microcontroller. But it's
    much less powerful than the processor in
  • 8:59 - 9:04
    the NES or SNES classic. Like this
    processor is really just a microcontroller
  • 9:04 - 9:09
    and so it can't run Linux. It can't run,
    let's say, super complex software. Instead
  • 9:09 - 9:14
    it'll be programed in some bare metal
    way. And so we will have a bare metal
  • 9:14 - 9:21
    firmware on the device. To the right of
    it, you can also find a 1 MB SPI flash.
  • 9:21 - 9:26
    And so overall, we have roughly 1.1 MB of
    storage on the device. Now, most
  • 9:26 - 9:31
    microcontrollers or basically all
    microcontrollers have a debugging port.
  • 9:31 - 9:36
    And if we take a look at the PCB, you can
    see that there are five unpopulated
  • 9:36 - 9:41
    contacts here. And if you see a couple of
    contacts, that are not populated close to
  • 9:41 - 9:48
    your CPU, it's very likely, that it's the
    debugging port. And luckily, the datasheet
  • 9:48 - 9:54
    for the STM32 is openly available. And so
    we can check the pinouts in the datasheet
  • 9:54 - 9:59
    and then use a multimeter to to see
    whether these pins are actually the
  • 9:59 - 10:04
    debugging interface. And turns out they
    actually are. And so we can find the SWD
  • 10:04 - 10:12
    debugging interface as well as Vcc and
    ground exposed on these pins. Now this
  • 10:12 - 10:17
    means that we can use a debugger. So, for
    example, a J-link or ST-link or whatever
  • 10:17 - 10:22
    to connect to the device. And because the
    the contacts are really easy to access,
  • 10:22 - 10:26
    you don't even have to solder. You can
    just hook up a couple of test pins and
  • 10:26 - 10:33
    they will allow you to easily hook-up
    your debugger. Now, the problem is, on most
  • 10:33 - 10:37
    devices, the debugging interface will be
    locked during manufacturing, this is done
  • 10:37 - 10:43
    to prevent people like us to basically do
    whatever with the device and to prevent us
  • 10:43 - 10:47
    from being able to dump the firmware,
    potentially reflash it and so on. And so I
  • 10:47 - 10:52
    was very curious to see, whether we can
    actually connect to the debugging port.
  • 10:52 - 10:56
    And when starting up J-link and trying to
    connect, we can see it can actually
  • 10:56 - 11:01
    successfully connect. But, when you take a
    closer look, there's also a message that
  • 11:01 - 11:09
    the device is active read protected. This
    is because the chip, the STM32 chip,
  • 11:09 - 11:16
    features something called RDP protection
    level or readout protection level. This is
  • 11:16 - 11:20
    basically the security setting for the
    debugging interface and it has three
  • 11:20 - 11:27
    levels. Level zero means no protection is
    active. Level one means that the flash
  • 11:27 - 11:32
    memory is protected and so we can't dump
    the internal flash of the device. However,
  • 11:32 - 11:37
    we can dump the RAM contents and we can
    also execute code from RAM. And then
  • 11:37 - 11:42
    there's also level two, which means that
    all debugging features are disabled. Now,
  • 11:42 - 11:47
    just because a chip is in level two,
    doesn't mean that you have to give up.
  • 11:47 - 11:52
    For example, in our talk wallet.fail a couple
    of years ago, we showed how to use fault
  • 11:52 - 11:56
    injection to bypass the level two
    protection and downgrade a chip to level
  • 11:56 - 12:01
    one. However, on the Game & Watch, we are
    lucky and the interface is not fully
  • 12:01 - 12:07
    disabled. Instead, it's in level one. And
    so we can still dump the RAM, which is a
  • 12:07 - 12:11
    pretty good entry point, even though we
    can't dump the firmware yet. Now, having
  • 12:11 - 12:17
    dumped the RAM of the device, I was pretty
    curious to see, what's inside of it. And
  • 12:17 - 12:22
    one of my suspicions was, that potentially
    the emulator, that's hopefully running on
  • 12:22 - 12:29
    the device, loads the original Super Mario
    Brothers ROM into RAM. And so, I was
  • 12:29 - 12:35
    wondering whether maybe we can find the
    ROM that the device uses in the RAM-dump.
  • 12:35 - 12:40
    And so I opened up the RAM-dump in a hex
    editor and I also opened up the original
  • 12:40 - 12:44
    Super Mario Brothers ROM in a second
    window in a hex editor and tried to find
  • 12:44 - 12:49
    different parts of the original ROM in the
    RAM-dump. And it turns out that, yes, the
  • 12:49 - 12:55
    NES ROM is loaded into RAM and it's always
    at the same address. And so it's probably
  • 12:55 - 13:00
    like during boot up, it gets copied into
    RAM or something along those lines. And so
  • 13:00 - 13:05
    this is pretty cool to know, because it
    tells us a couple of things. First off, we
  • 13:05 - 13:10
    know now that the debug port is enabled
    and working, but that it's unfortunately
  • 13:10 - 13:16
    at RDP level one and so we can only dump
    the RAM. And we also know that the NES ROM
  • 13:16 - 13:21
    is loaded into RAM. And this means that
    the device runs a real NES emulator. And
  • 13:21 - 13:26
    so if we get lucky, we can, for example,
    just replace the ROM that is used by
  • 13:26 - 13:30
    the device and play, for example,
    our own NES game.
  • 13:31 - 13:33
    little pause
  • 13:34 - 13:37
    Next, it was time to dump the flash chip
  • 13:37 - 13:41
    of the device. For this, I'm using a
    device called Mini Pro and I'm using one
  • 13:41 - 13:47
    of these really useful SOIC8 clips. And so
    these ones you can simply clip onto the
  • 13:47 - 13:52
    flash chip and then dump it. Now, one
    warning though, the flash chip on the device,
  • 13:52 - 13:56
    is running at 1.8 volts. And so you want to
    make sure that your programmer also
  • 13:56 - 14:02
    supports 1.8 volt operation. If you
    accidentally try to read it out at 3.3 volts,
  • 14:02 - 14:07
    you will break your flash. Trust
    me, because it happened to me on one of my
  • 14:07 - 14:13
    units. Now, with this flash dump from the
    device, we can start to analyze it. And
  • 14:13 - 14:17
    what I always like to do first, is take a
    look at the entropy or the randomness of
  • 14:17 - 14:23
    the flash dump. And so using binwalk with
    the -E option, we get a nice entropy
  • 14:23 - 14:27
    graph. And in this case, you can see we
    have a very high entropy over almost the
  • 14:27 - 14:33
    whole flash contents. And this mostly
    indicates, that the flash contents are
  • 14:33 - 14:37
    encrypted. It could also mean compression,
    but if it's compressed, you would often
  • 14:37 - 14:44
    see more like dips in the entropy. And in
    this case, it's one very high entropy
  • 14:44 - 14:49
    stream. We also noticed, that there are no
    repetitions whatsoever, which also tells
  • 14:49 - 14:53
    us that it's probably not like a simple
    XOR based encryption or so and instead
  • 14:53 - 14:58
    something like AES or something similar.
    But, just because the flash is encrypted
  • 14:58 - 15:02
    doesn't mean we have to give up. On the
    contrary, I think now it starts to get
  • 15:02 - 15:07
    interesting, because you actually have a
    challenge and it's not just plug and play,
  • 15:07 - 15:13
    so to say. One of the biggest questions I
    had is, is the flash actually verified?
  • 15:13 - 15:18
    Like does the device boot, even though the
    flash has been modified? Because, if it
  • 15:18 - 15:25
    does, this would open up a lot of attack
    vectors, basically, as you will see. And
  • 15:25 - 15:31
    so to verify this, I basically try to
    put zeros in random places in the flash
  • 15:31 - 15:36
    image. And so, I put some at adress zero,
    some at 0x2000 and so on. And then I
  • 15:36 - 15:40
    checked whether the device would still
    boot-up. And with the most flash
  • 15:40 - 15:44
    modifications, it would still boot just
    fine. This tells us, that even though the
  • 15:44 - 15:49
    flash contents are encrypted, they are not
    validated, they are not checksummed or
  • 15:49 - 15:55
    anything. And so we can potentially trick
    the device into accepting a modified flash
  • 15:55 - 15:59
    image. And this is really important to
    know, as you will see in a couple of
  • 15:59 - 16:05
    minutes. My next suspicion was, that maybe
    the NES ROM we see in RAM, is actually
  • 16:05 - 16:13
    loaded from the external flash. And so to
    find out whether that's the case, I again
  • 16:13 - 16:19
    took the flash and I inserted zeros at
    multiple positions in the flash image.
  • 16:19 - 16:25
    Flashed that over, booted-up the game,
    dumped the RAM and then compared the NES
  • 16:25 - 16:30
    ROM that I'm now dumping from RAM with the
    one that I dumped initially and checked
  • 16:30 - 16:35
    whether they are equal. Because my
    suspicion was that maybe I can overwrite a
  • 16:35 - 16:42
    couple of bytes in the encrypted flash and
    then I will modify the NES room. And after
  • 16:42 - 16:47
    doing this for, like, I don't know, half
    an hour, I got lucky and I modified 4
  • 16:47 - 16:51
    bytes in the flash image and 4 bytes in the
    RAM...sorry...in the ROM that was loaded
  • 16:51 - 16:57
    into RAM changed. And this tells us quite
    a bit. It means that the ROM is loaded
  • 16:57 - 17:04
    from flash into RAM and that the flash
    contents are not validated. And what's
  • 17:04 - 17:10
    also important is, that we change 4
    bytes in the flash and now 4 bytes in
  • 17:10 - 17:16
    the decrypted image changed. And this is
    very important to know, because if we take
  • 17:16 - 17:20
    a look at what we would expect to happen
    when we change the flash contents, there
  • 17:20 - 17:24
    are multiple outcomes. And so, for
    example, here we have the SPI-flash
  • 17:24 - 17:29
    contents on the left and the RAM contents
    on the right. And so the RAM contents are
  • 17:29 - 17:35
    basically the decrypted version of the
    SPI-flash contents. Now let's say we
  • 17:35 - 17:42
    change 4 bytes in the encrypted flash
    image to zeros. How would we expect the
  • 17:42 - 17:48
    RAM contents to change, for example, if we
    would see that now 16 bytes in the RAM are
  • 17:48 - 17:53
    changing, this means that we are
    potentially looking at an encryption
  • 17:53 - 17:58
    algorithm, such as AES in electronic
    codebook mode. Because, it's a block based
  • 17:58 - 18:03
    encryption and so if we change four bytes
    in the input data, a block size, in this
  • 18:03 - 18:10
    case 16 bytes, in the output data would
    change. The next possibility is, that we
  • 18:10 - 18:16
    change 4 bytes in the SPI-flash and all
    data afterwards will be changed. And in
  • 18:16 - 18:22
    this case, we would look at some kind of
    chaining cipher such as AES in the CBC
  • 18:22 - 18:28
    mode. However, if we change 4 bytes in
    the SPI-flash and only 4 bytes in the
  • 18:28 - 18:34
    RAM changed, we are looking at
    something such as AES in counter mode. And
  • 18:34 - 18:40
    to understand this, let's take a better
    look at how AES in CTR works. AES-CTR
  • 18:40 - 18:46
    works by having your cleartext and xoring
    it with an AES encryption stream, that is
  • 18:46 - 18:53
    generated from a key, a Nonce and the
    counter algorithm. Now, the AES stream,
  • 18:53 - 18:57
    that will be used to xor your your
    cleartext will always be the same, if key
  • 18:57 - 19:03
    and Nonce is the same. This is why it's
    super important, that if you use AES-CTR,
  • 19:03 - 19:09
    you always select a unique Nonce for each
    encryption. If you encrypt similar data
  • 19:09 - 19:15
    with the same Nonce twice, large parts of
    the resulting ciphertext will be the same.
  • 19:15 - 19:20
    And so the cleartext gets xored with the
    AES-CTR stream and then we get our
  • 19:20 - 19:27
    ciphertext. Now, if we know the cleartext,
    as we do, because the cleartext is the ROM,
  • 19:27 - 19:32
    that is loaded into RAM and we know the
    ciphertext, which we do, because it's the
  • 19:32 - 19:38
    contents of the encrypted flash we just
    dump. We can basically reverse the
  • 19:38 - 19:45
    operation and as a result, we get the AES-
    CTR stream, that was used to encrypt the
  • 19:45 - 19:52
    flash. And now this means, that we can
    take, for example, a custom ROM, xor it
  • 19:52 - 19:58
    with the AES-CTR stream we just
    calculated and then generate our own
  • 19:58 - 20:02
    encrypted flash image, for example, with a
    modified ROM. And so I wrote a couple of
  • 20:02 - 20:08
    Python scripts to try this. And after a
    while, I was running Hacked Super Mario
  • 20:08 - 20:14
    Brothers instead of Super Mario Brothers.
    So, wohoo, we hacked the Nintendo Game &
  • 20:14 - 20:19
    Watch one day before the official release.
    And we can install modified Super Mario
  • 20:19 - 20:24
    Brothers ROMs. Now, you can find the
    scripts that I used for this on my Github.
  • 20:24 - 20:28
    So it's in a repository called "Game &
    Watch Hacking". And I was super excited,
  • 20:28 - 20:34
    because it meant, that I succeeded and that
    I basically hacked a Nintendo console one
  • 20:34 - 20:38
    day before the official release.
    Unfortunately, I finished the level, but
  • 20:38 - 20:43
    Toad wasn't as excited. He told me that
    unfortunately, our firmware is still in
  • 20:43 - 20:50
    another castle. And so on the Monday after
    the launch of the device, I teamed up with
  • 20:50 - 20:55
    Konrad Beckman, a hardware hacker from
    Sweden who I met at the previous Congress.
  • 20:55 - 21:00
    And we started chatting and throwing ideas
    back and forth and so on. And eventually
  • 21:00 - 21:06
    we noticed that the device has a special
    RAM area called ITCM-RAM, which is a
  • 21:06 - 21:11
    tightly coupled instruction RAM that is
    normally used for very high performance
  • 21:11 - 21:15
    routines such as interrupt handlers and so
    on. And so it's in a very fast RAM area.
  • 21:15 - 21:22
    And we realized that we never actually
    looked at the contents of that ITCM-RAM.
  • 21:22 - 21:27
    And so we dumped it from the device using
    the debugging port. And it turns out that
  • 21:27 - 21:33
    this ITCM-RAM contains ARM code. And so,
    again, the question is, where does this
  • 21:33 - 21:38
    ARM code come from, does it maybe just
    like the NES ROM come from the external
  • 21:38 - 21:46
    flash? And so basically, I repeated the
    whole thing that we also did with the NES
  • 21:46 - 21:52
    ROM and just put zeros at the very
    beginning of the encrypted flash. Rebooted
  • 21:52 - 21:58
    the device and dumped the ITCM-RAM and I
    got super lucky on the first try already
  • 21:58 - 22:04
    the ITCM contents changed. And because the
    ITCM contains code, not just data, so
  • 22:04 - 22:09
    early we only had the NES-ROM, which is
    just data, but this time the RAM contains
  • 22:09 - 22:15
    code. This means that with the same x or
    trick we used before, we could inject
  • 22:15 - 22:22
    custom ITCM code into the external flash,
    which would then be loaded into RAM when
  • 22:22 - 22:28
    the device boots. And because it's a
    persistent method, we can then reboot the
  • 22:28 - 22:33
    device and let it run without the debugger
    connected. And so whatever code we load
  • 22:33 - 22:38
    into this ITCM area will be able to
    actually read the flash. And so we could
  • 22:38 - 22:43
    potentially write some code that gets
    somehow called by the firmware and then
  • 22:43 - 22:50
    copies the internal flash into RAM from
    where we then can retrieve it using the
  • 22:50 - 22:58
    debugger. Now, the problem is, let's say
    we have a custom payload somehow in this
  • 22:58 - 23:05
    ITCM area. We don't know which address of
    this ITCM code gets executed. And so we
  • 23:05 - 23:09
    don't know whether the firmware will jump
    to adress zero or adress 200 or whatever.
  • 23:09 - 23:14
    But there's a really simple trick to still
    build a successful payload. And it's
  • 23:14 - 23:19
    called a NOP slide. A NOP, or no
    operation, is an instruction that simply
  • 23:19 - 23:25
    does nothing. And if we fill most of the
    ITCM-RAM with NOPs and put our payload at
  • 23:25 - 23:32
    the very end, we build something that is
    basically a NOP-slide. And so when the
  • 23:32 - 23:37
    CPU, indicated by Mario here, jumps to a
    random address in that whole NOP-slide, it
  • 23:37 - 23:44
    will start executing NOPs and slide down
    into our payload and execute it. And so
  • 23:44 - 23:49
    even if Mario jumps right in the middle of
    the NOP-slide, he will always slide down
  • 23:49 - 23:55
    the slide and end up in our payload. And
    Konrad wrote this really, really simple
  • 23:55 - 23:58
    payload, which is only like 10
    instructions, which basically just copies
  • 23:58 - 24:04
    the internal flash into RAM from where we
    can then retrieve it using the debugger.
  • 24:04 - 24:08
    So wohoo, super simple exploit. We have a
    full firmware backup and a full flash
  • 24:08 - 24:14
    backup and now we can really fiddle with
    everything on the device. And we've
  • 24:14 - 24:18
    actually released tools to do this
    yourself. And so if you want to back up
  • 24:18 - 24:23
    your Nintendo Game & Watch, you can just
    go onto my GitHub and download the game
  • 24:23 - 24:28
    and watch backup repository, which
    contains a lot of information on how to
  • 24:28 - 24:33
    back it up. It does check something and
    so on to ensure that you don't
  • 24:33 - 24:38
    accidentally brick your device and you can
    easily back up the original firmware,
  • 24:38 - 24:44
    install homebrew, and then always go back
    to the original software. We also have an
  • 24:44 - 24:51
    awesome support community on Discord. And
    so if you ever need help, I think you will
  • 24:51 - 24:55
    find success there. And so far we haven't
    had a single bricked Game & Watch and so
  • 24:55 - 25:02
    looks to be pretty stable. And so I
    was pretty excited because the quest was
  • 25:02 - 25:11
    over. Or is it? If you ever claim on the
    internet that you successfully hacked an
  • 25:11 - 25:18
    embedded device, there will be exactly one
    response and one response only: but does
  • 25:18 - 25:24
    it run Doom? Literally my Twitter DMs, my
    YouTube comments, and even my friends were
  • 25:24 - 25:29
    spamming me with the challenge to get Doom
    running on the device. But to get Doom
  • 25:29 - 25:34
    running, we first needed to bring up all
    the hardware. And so we basically needed
  • 25:34 - 25:40
    to create a way to develop and load
    homebrew onto the device. Now, luckily for
  • 25:40 - 25:45
    us, most of the components on the board
    are very well documented and so there are
  • 25:45 - 25:50
    no NDA components. And so, for example,
    the processor has an open reference manual
  • 25:50 - 25:57
    and open source library to use it. The
    flash is a well-known flash chip. And so
  • 25:57 - 26:00
    on and so forth. And there are only a
    couple of very proprietary or custom
  • 26:00 - 26:06
    components. And so, for example, the LCD
    on the device is proprietary and we had to
  • 26:06 - 26:13
    basically sniff the SPI-bus that goes to
    the display to basically decode the
  • 26:13 - 26:19
    initialization of the display and so on.
    And after a while, we had the full
  • 26:19 - 26:25
    hardware running, we had LCD support, we
    had audio support, deep support, buttons
  • 26:25 - 26:29
    and even flashing tools that allow you to
    simply use an SWD debugger to dump and
  • 26:29 - 26:34
    rewrite the external flash. And you can
    find all of these things on our GitHub.
  • 26:34 - 26:39
    Now, if you want to mod your own Game &
    Watch, all you need is a simple debugging
  • 26:39 - 26:47
    adapter such as a cheap, three dollar ST-
    link, a J-link or a real ST-link device,
  • 26:47 - 26:51
    and then you can get started. We've also
    published a base project for anyone who
  • 26:51 - 26:55
    wants to get started with building their
    own games for the Game & Watch. And so
  • 26:55 - 26:59
    it's really simple. It's just a frame
    buffer you can draw to, input is really
  • 26:59 - 27:04
    simple and so on. And as said, we have a
    really helpful community. Now with all the
  • 27:04 - 27:10
    hardware up and running, I could finally
    start porting Doom. I started by looking
  • 27:10 - 27:15
    around for other ports of Doom to an
    STM32. And I found this project by floppes
  • 27:15 - 27:22
    called stm32doom. Now the issue is,
    stm32doom is designed for a board with
  • 27:22 - 27:28
    eight megabytes of RAM and also the data
    files for Doom were stored on external USB
  • 27:28 - 27:38
    drive. On our platform, we only have 1.3
    MB of RAM, 128 kB of flash and only 1 MB
  • 27:38 - 27:43
    of external flash and we have to fit all
    the level information, all the code and
  • 27:43 - 27:51
    so on in there. Now, the Doom level
    information is stored in so-called WAD -
  • 27:51 - 27:57
    Where's All my Data files. And these data
    files contain the sprites, the textures,
  • 27:57 - 28:03
    the levels and so on. Now the WAD for Doom
    1 is roughly four megabytes in size and
  • 28:03 - 28:11
    the WAD for Doom 2 is 40 MB in size. But
    we only have 1.1 MB of storage. Plus we
  • 28:11 - 28:16
    have to fit all the code in there. So
    obviously we needed to find a very, very
  • 28:16 - 28:22
    small Doom port. And as it turns out,
    there's a file called Mini-WAD, which is a
  • 28:22 - 28:28
    minimal Doom, I wrote, which is basically
    all the bells and whistles are stripped
  • 28:28 - 28:34
    from the WAD file and everything replaced
    by simple outlines and so on. And while
  • 28:34 - 28:38
    it's not pretty, I was pretty confident
    that I could get it working as it's only
  • 28:38 - 28:46
    250 kB of storage, down from 40 megabytes.
    Now, in addition to that, a lot of stuff
  • 28:46 - 28:51
    on the Chocolate Doom port itself had to
    be changed. And so, for example, I had to
  • 28:51 - 28:56
    rip out all the file handling and add a
    custom file handler. I had to add support
  • 28:56 - 29:01
    for the Game & Watch LCD, button input
    support. And I also had to get rid of a
  • 29:01 - 29:05
    lot of things to get it running somewhat
    smoothly. And so, for example, the
  • 29:05 - 29:11
    infamous Wipe effect had to go and I also
    had to remove sound support. Now, the next
  • 29:11 - 29:16
    issue was that once it was compiling, it
    simply would not fit into RAM and crash
  • 29:16 - 29:23
    all the time. Now on the device, we have
    roughly 1.3 MB of RAM in different RAM
  • 29:23 - 29:28
    areas. And for example just the frame
    buffer, that we obviously need, takes up
  • 29:28 - 29:36
    154 kB off that. Then we have 160 kB of
    initialized data, 320 kB of uninitialized
  • 29:36 - 29:42
    data and a ton of dynamic allocations that
    are done by Chocolate Doom. And these
  • 29:42 - 29:47
    dynamic allocations were a huge issue
    because the Chocolate Doom source code
  • 29:47 - 29:52
    does a lot of small allocations, which are
    only used for temporary data. And so they
  • 29:52 - 29:59
    get freed again and so on, and so your
    dynamic memory gets very, very fragmented
  • 29:59 - 30:03
    very quickly, and so eventually there's
    just not enough space to, for example,
  • 30:03 - 30:10
    initialize the level. And so to fix this,
    I took the Chocolate Doom code and I
  • 30:10 - 30:15
    changed a lot of the dynamic allocations
    to static allocations, which also had the
  • 30:15 - 30:22
    big advantage of making the error messages
    by the compiler much more meaningful.
  • 30:22 - 30:27
    Because it would actually tell you: Hey,
    this and this data does not fit into RAM.
  • 30:27 - 30:32
    And eventually, after a lot of trial and
    error and copying as many of the original
  • 30:32 - 30:39
    assets as possible into the minimal IWAD,
    I got it. I had Doom running on the
  • 30:39 - 30:45
    Nintendo Game & Watch Super Mario Brothers
    and I hopefully calmed the internet gods
  • 30:45 - 30:50
    that forced me to do it. Now,
    unfortunately, the USB port is physically
  • 30:50 - 30:56
    not connected to the processor and so it
    will not be possible to hack the device
  • 30:56 - 31:00
    simply by plugging it into your computer.
    However, it's relatively simple to do this
  • 31:00 - 31:07
    using one of these USB-Debuggers. Now, the
    most requested type of homebrew software
  • 31:07 - 31:13
    was obviously emulators. And I'm proud to
    say that by now we actually have kind of a
  • 31:13 - 31:19
    large collection of emulators running on
    the Nintendo Game & Watch. And it all
  • 31:19 - 31:23
    started with Conrad Beckman discovering
    the Retro Go Project, which is an emulator
  • 31:23 - 31:30
    collection for a device called the Odroid
    Go and the Odroid Go is a small handheld
  • 31:30 - 31:36
    with similar input and size constraints as
    the Nintendo Game & Watch. And so it's
  • 31:36 - 31:41
    kind of cool to port this over because it
    basically already did all of the hard
  • 31:41 - 31:48
    work, so to say. And Retro Go comes with
    emulators for the NES, for the Gameboy and
  • 31:48 - 31:53
    the Gameboy color and even for the Sega
    Master System and the Sega Game Gear. And
  • 31:53 - 31:58
    after a couple of days, Conrad actually
    was able to show off his NES emulator
  • 31:58 - 32:03
    running Zelda and other games such as
    Contra and so on, on the Nintendo Game &
  • 32:03 - 32:09
    Watch. This is super fun and initially we
    only had really a basic emulator that
  • 32:09 - 32:13
    could barely play and we had a lot of
    frame drops, we didn't have nice scaling,
  • 32:13 - 32:18
    VSync and so on. But now after a couple of
    weeks, it's really a nice device to use
  • 32:18 - 32:24
    and to play with. And so we also have a
    Gameboy emulator running and so you can
  • 32:24 - 32:29
    play your favorite Gameboy games such as
    Pokémon, Super Mario Land and so on on the
  • 32:29 - 32:35
    Nintendo Game & Watch if you own the
    corresponding ROM Backups. And we also
  • 32:35 - 32:39
    experimented with different scaling
    algorithms to make the most out of the
  • 32:39 - 32:43
    screen. And so you can basically change
    the scaling algorithm that is used for the
  • 32:43 - 32:48
    display, depending on what you prefer. And
    you could even change the palette for the
  • 32:48 - 32:54
    different games. We also have a nice game
    chooser menu which allows you to basically
  • 32:54 - 32:59
    have multiple ROMs on the device that you
    can switch between. We have safe state
  • 32:59 - 33:04
    support and so if you turn off the device,
    it will save wherever you left off and you
  • 33:04 - 33:09
    can even come back to your save game once
    the battery run out. You can find the
  • 33:09 - 33:14
    source code for all of that on the Retro
    Go repository from Conrad. And it's
  • 33:14 - 33:21
    really, really awesome. Other people build
    for example emulators for the CHIP-8
  • 33:21 - 33:25
    system and so the CHIP-8 emulator comes
    with a nice collection of small arcade
  • 33:25 - 33:31
    games and so on, and it's really fun and
    really easy to develop for it. And so
  • 33:31 - 33:37
    really give this a try if you own a Game &
    Watch and want to try homebrew on it. Tim
  • 33:37 - 33:42
    Schuerwegen is even working on an
    emulator for the original Game & Watch
  • 33:42 - 33:46
    games. And so this is really cool because
    it basically turned the Nintendo Game &
  • 33:46 - 33:53
    Watch into an emulator for all Game &
    Watch games that were ever released. And
  • 33:53 - 33:58
    what was really amazing to me is how the
    community came together. And so we were
  • 33:58 - 34:02
    pretty open about the progress on Twitter.
    And also Conrad was Twitch streaming a lot
  • 34:02 - 34:06
    of the process. And we opened up a discord
    where people could join who were
  • 34:06 - 34:12
    interested in hacking on the device. And
    it was amazing to see what came out of the
  • 34:12 - 34:17
    community. And so, for example, we now
    have a working storage upgrade that works
  • 34:17 - 34:21
    both with homebrew but also with the
    original firmware. And so instead of one
  • 34:21 - 34:25
    megabyte of storage, you can have 60
    megabytes of flash and you just need to
  • 34:25 - 34:31
    replace a single chip, which is pretty
    easy to do. Then for understanding the
  • 34:31 - 34:36
    full hardware. Daniel Cuthbert and Daniel
    Padilla provided us with high resolution x
  • 34:36 - 34:41
    ray images, which allowed us to fully
    understand every single connection, even
  • 34:41 - 34:46
    of the PGA parts, without desoldering
    anything. Then Jake Little of Upcycle
  • 34:46 - 34:53
    Electronics traced on the x rays and also
    using a multimeter every last trace on the
  • 34:53 - 34:58
    PCB, and he even created a schematic of
    the device, which gives you all the
  • 34:58 - 35:02
    details you need when you want to program
    something also and it was really, really
  • 35:02 - 35:07
    fun. Sander van der Wel for example even
    created a custom backplate and now there
  • 35:07 - 35:13
    are even projects that try to replace the
    original PCB with a custom PCB with an
  • 35:13 - 35:20
    FPGA and an ESP 32. And so it's really
    exciting to see what people come up with.
  • 35:20 - 35:25
    Now, I hope you enjoyed this talk and I
    hope to see you on our discord if you want
  • 35:25 - 35:35
    to join the fun. And thank you for coming.
  • 35:35 - 35:41
    Herald: Hi. Wow, that was a really amazing
    talk. Thank you very much Thomas. As
  • 35:41 - 35:48
    announced in the beginning we do accept
    questions from you and we have quite a
  • 35:48 - 35:54
    few. Let's see if we manage to make it
    through all of them. The first one is:
  • 35:54 - 36:00
    Q: Did you read the articles about
    Nintendo observing hackers, like private
  • 36:00 - 36:05
    investigators, et cetera and are you
    somehow worried about this?
  • 36:05 - 36:08
    Thomas: Oh, what's going on with my
    camera? Looks like Luigi messed around
  • 36:08 - 36:18
    with my video setup here. Yeah, I so I've
    read those articles, but so I believe that
  • 36:18 - 36:22
    in this case, there is no piracy issue,
    right? Like, I'm not allowing anyone to
  • 36:22 - 36:27
    play any new games. If you wanted to to
    dump a Super Mario ROM, you would have
  • 36:27 - 36:32
    done it 30 years ago or on the NES Classic
    or on the Switch or on any of the hundred
  • 36:32 - 36:37
    consoles Nintendo launched in between. And
    so I'm really not too worried about it, to
  • 36:37 - 36:41
    be honest.
    Herald: I also think the aspect of the
  • 36:41 - 36:50
    target audience is to be seen here. So off
    to the next question which is: Do you
  • 36:50 - 36:55
    think that there is a reason why an
    external flash chip has been used?
  • 36:55 - 37:03
    Thomas: Yeah. So the internal flash of the
    STM32-H7B0 is relatively small. It's only
  • 37:03 - 37:08
    128 kB. And so they simply couldn't
    fit everything in, like basically even
  • 37:08 - 37:13
    just the frame buffer. Even just a frame
    buffer picture also is larger than the
  • 37:13 - 37:19
    internal flash. And so I think that's why
    they did it and I'm glad they did.
  • 37:19 - 37:27
    Herald: Sure. And is the decryption done
    in software or is it a feature of the
  • 37:27 - 37:30
    microcontroller?
    Thomas: So the microcontroller has an
  • 37:30 - 37:36
    integrated feature called OTF-DEC and
    basically the flash is directly mapped
  • 37:36 - 37:41
    into memory and they have this chip
    prefill called OTF DEC that automatically
  • 37:41 - 37:45
    provides the decryption and so on. And so
    it's done all in hardware and you can even
  • 37:45 - 37:48
    retrieve the keys from hardware,
    basically.
  • 37:48 - 37:58
    Herald: OK, very nice. And also, the next
    question is somehow related to that: Is in
  • 37:58 - 38:04
    your opinion the encryption Nintendo has
    applied even worth the effort for them?
  • 38:04 - 38:07
    It feels like it's just there to give
    shareholders a false sense of security.
  • 38:07 - 38:13
    What would you think about that?
    Thomas: I think from my perspective, they
  • 38:13 - 38:16
    choose just the right encryption because
    it was a ton of fun to reverse engineer
  • 38:16 - 38:22
    and try to to bypass it and so it was an
    awesome challenge and so I think they did
  • 38:22 - 38:27
    everything right. But I also think in the
    end, it's such a simple device and it's
  • 38:27 - 38:32
    like if you take a look at what people are
    building on top of it with like games and
  • 38:32 - 38:37
    all that kind of stuff. I think they did
    everything right, but probably it was just
  • 38:37 - 38:42
    a tick markup. Yeah, we totally locked
    down JTAG and yeah, but I think it's fun
  • 38:42 - 38:45
    because again, it doesn't open up any
    piracy issues.
  • 38:45 - 38:51
    Herald: Sure. The one thing is related to
    the NOP slide, which you very, very well
  • 38:51 - 39:01
    animated. So wouldn't starts of
    subroutines be suitable as well for that,
  • 39:01 - 39:11
    for that goal. The person asking says that
    a big push R4, R5, etc. instructions are
  • 39:11 - 39:21
    quite recognizable. How would ... Yeah
    Thomas: Yeah. So absolutely. The time from
  • 39:21 - 39:25
    finding the data in the ITCM-RAM and
    actually exploiting it was less than an
  • 39:25 - 39:30
    hour. And so if we would have tried to
    reverse engineer it, it would be more
  • 39:30 - 39:34
    work. Like absolutely possible and also
    not difficult, but just filling the RAM
  • 39:34 - 39:39
    with NOP took a couple of minutes and so
    was really the easiest way and the fastest
  • 39:39 - 39:45
    way without fiddling around in Ghidra or so.
    Herald: OK, cool, thanks. And this is more
  • 39:45 - 39:54
    a remark than a question. The person says
    it's strange that an STAN5281 does not
  • 39:54 - 40:00
    mention a single time that the data is not
    verified during encryption. I think it's
  • 40:00 - 40:06
    more a fault on STs than Nintendos site.
    What would you think about that?
  • 40:06 - 40:11
    Thomas: Yeah, I would somewhat agree
    because in this case, even if you don't
  • 40:11 - 40:18
    have JTAG, like an ARM thum instruction is
    2-4 bytes and so you have a relatively small
  • 40:18 - 40:22
    space to brute force to potentially get an
    interesting branch instruction and so on.
  • 40:22 - 40:28
    So I think it's yeah, I mean, it's
    not perfect, but also doing verification
  • 40:28 - 40:33
    is very expensive, computational wise and
    so I think it should just be the firmware
  • 40:33 - 40:37
    that actually verifies the contents of the
    external flash.
  • 40:37 - 40:44
    Herald: OK, so I think we should ask 2
    questions more and then we can go back to
  • 40:44 - 40:52
    the studio. There is a question about the
    AS encryption keys. Have you managed to
  • 40:52 - 40:57
    recover them?
    Thomas: Yes, we did. But so it's an
  • 40:57 - 41:02
    applicational AST, and they do some crazy
    shifting around with the keys but I think
  • 41:02 - 41:07
    even just today, like an hour before the
    talk, a guy, sorry I'm not sure it's a
  • 41:07 - 41:13
    guy, a person on our discord actually
    managed to rebuild the full encryption.
  • 41:13 - 41:17
    But we, I personally wasn't never
    interested in that because after you've
  • 41:17 - 41:22
    downgraded to RTP 0, the device. You can
    just access the memory mapped flash and
  • 41:22 - 41:25
    get the completely decrypted flash
    contents basically.
  • 41:25 - 41:32
    Herald: Sure. Thanks. And a last question
    about the LCD-Controller, whether it's
  • 41:32 - 41:38
    used by writing pixels over SPI or if it
    has some extra features, maybe even
  • 41:38 - 41:41
    background or sprites or something like
    that?
  • 41:41 - 41:47
    Thomas: So the the LCD itself doesn't have
    any special features. It has one SPI bus
  • 41:47 - 41:51
    to configure it and then a parallel
    interface where - so it takes up a lot
  • 41:51 - 41:57
    of pins. But the chip itself has a
    hardware called LTDC, which is an LCD
  • 41:57 - 42:01
    controller, which provides two layers with
    alpha blending and some basic windowing
  • 42:01 - 42:07
    and so on.
    Herald: OK, cool then thank you very, very
  • 42:07 - 42:12
    much for the great talk and the great
    intro. And with that, back to our main
  • 42:12 - 42:15
    studio in the orbit. Thank you very much.
    Back to orbit.
  • 42:15 - 42:18
    rC3 postroll music
  • 42:18 - 42:56
    Subtitles created by c3subtitles.de
    in the year 2020. Join, and help us!
Title:
#rC3 - Hacking the Nintendo Game & Watch
Description:

more » « less
Video Language:
English
Duration:
42:56

English subtitles

Revisions