Translated by Markus Aurala
(KYBS2004 course assignment at JYU.FI)
rC3-intromusiikkia
Herald: Seuraavasta puhujastamme... Hän
on tietoturvatutkija, joka on erikoistunut
sulautettuihin järjestelmiin, viesti-
liikenteeseen ja matkapuhelimiin.
Forbes nimesi hänet alle 30-vuotiaiden
teknologiavaikuttajien listalleen ja
hän on voittanut OWASP Appsec CTF:n.
Hän on myös löytänyt ja raportoinut
vastuullisesti haavoittuvaisuuksia.
Ja erityisesti toivon teidän Nintendo-
intoilijoiden katsovan seuraavan videon,
joka on todella uskomaton ja jota
tulette rakastamaan. Kiitos paljon.
näyttää Nintendo-pelikasettia
laittaa sen sisään konsoliin
Nintendo päästää ääniä
Thomas: Voi himpskatti.
ottaa pelikasetin
puhaltaa siihen
laittaa sisään uudelleen
Nintendo päästää ääniä
musiikki soi
Thomas Roth: Voi, mikä matka.
Tervetuloa esitykseeeni
"Uuden Nintendo Game & Watch Super
Mario Brothersin hakkerointi". Nimeni
on Thomas Roth. Olen tietoturvatutkija
ja -kouluttaja Saksasta. Löydät minut
Twitteristä nimellä @ghidraninja ja
YouTubesta nimellä stacksmashing.
Tämä vuosi on suosikkiputkimiehemme,
Super Marion, 35-vuotisjuhlavuosi.
Juhlan kunniaksi Nintendo julkaisi uuden
pelikonsolin, Nintendo Game & Watch Super
Mario Brothersin. Konsoli on höyhenen-
kevyt ja näyttää kivalta. Ja siinä on
valmiiksi asennettuna kolme peliä ja myös
tämä animoitu kello. Kolme peliä ovat
Super Mario Brothers (alkuperäinen NES-
peli), Super Mario Brothers 2 The Lost
Levels, ja myös uudelleensovitus
vanhasta Game & Watch -pelistä, Ballista.
Tiedätkin varmasti ettei tämä ole
Nintendon ensimmäinen retrokonsoli.
Vuonna 2016 he julkaisivat NES Classicin
ja vuonna 2017 SNES Classicin. Nyt nuo
laitteet ovat todella suosittuja
harrastelijakehittäjien keskuudessa,
koska niihin on todella helppo lisätä
ROM:eja. Niiden laiteohjelmistoja on
helppo muokata jne. Voit vain pistää
piuhat kiinni koneeseesi, asentaa
yksinkertaisen ohjelmiston ja tehdä
mitä haluat sillä. Syy on se, että ne
ne ajavat Linuxia ja niissä on
melkoisen tehokas ARM-prosessori.
Niillä on kiva puuhastella.
Ja kun Nintendo julkaisi tämän
uuden konsolin, monet ihmiset
toivoivat siitä mobiilia
laitetta harrastelijaohjelmoijille.
Jos tekisimme nyt Venn-kaavion
minun suurimmista kiinnostuksistani,
siinä olisi takaisinmallinnus, laite-
hakkerointi ja retrokoneilu. Tämä
uusi Game & Watch olisi näitä kaikkia.
Kun se julkistettiin 3. syyskuuta,
tiesin, että minun oli pakko saada
sellainen. Ja tietäen miten hankala NES-
ja SNES-retrokonsoleita oli aluksi ostaa,
ennakkotilasin sen 4-5 eri
sivustolta. Pari niistä peruttiin.
Mutta olin melko innoissani, koska minulla
oli kolme ennakkotilausta, joiden piti
lähteä 13. marraskuuta.
Ja minä niin odotin sitä.
Söin aamiaista 12. marraskuuta kun
ovikello soi ja DHL:n kuriiri
toimitti minulle uuden Game & Watchin
päivää ennen virallista julkaisua.
Siinä vaiheessa laitteesta ei ollut
mitään teknistä tietoa saatavilla.
Ei kerrassaan mitään. Jos etsit "Game &
Watch" Twitteristä, et löytänyt muuta
kuin julkaisun tai ehkä kuvan, jonka
joku toinen ennakkotilaaja oli ottanut.
Ei ollut mitään purkamisesta, ei kuvia
sisuskaluista. Ja mikä tärkeintä,
kukaan ei ollut vielä murtanut sitä.
Ja tämä antoi minulle, laitehakkerille,
ainutlaatuisen tilaisuuden olla ehkäpä
ensimmäinen joka murtaa uuden konsolin.
Ja minä kirjaimellisesti jätin
kaiken muun kesken ja aloin tutkimaan
laitetta. Nyt minun täytyy sanoa,
että normaalisti pysyn kaukana
uusien konsolien murtamisesta. Pääasiassa
piratismin takia. En halua olla tekemässä
siitä mahdollista. En halua olla
osallinen. Enkä halua rakentaa
työkaluja, joilla toiset piratisoivat.
Mutta koska tähän laitteeseen ei voinut
ostaa pelejä ja kaikki
siinä olevat pelit olivat
julkaistu jo yli 30 vuotta sitten, en
ollut huolissani piratismista eikä
minulla ollut ongelmaa jakaa kaikkea
tutkimusteni tietoa eikä myöskään
niitä ongelmia, joiden avulla
pystyimme muokkaamaan laitetta.
Tässä esityksessä kerron teille
miten me mursimme laitteen
ja miten sinä voit tehdä sen kotona
suhteellisen halvoilla laitteilla.
Toivottavasti nautit siitä. Katsotaan
alkuun sitä laitetta. Laite on
höyhenenkevyt ja kotelo on mukavan
kokoinen. Joten se todella... Se todella
istuu hyvin käteeni. Siinä on 320 x 240
pikselin LCD-näyttö, ristiohjain, A- ja
B-napit ja lisäksi vielä kolme nappia,
joilla vaihdetaan pelimoodien välillä.
Oikealla sivulla on virtanäppäin
ja USB-C -portti. Mutta ennen kuin
innostut USB-portista, voin
kertoa, että valitettavasti
Nintendo on päättänyt olla
kytkemättä USB-portin datalinjoja.
Joten sitä voi käyttää vain
lataamiseen. Ja koska on kyse
Nintendosta, he käyttävät omia
Tri-Point -ruuvejaan. Avataksesi
laitteen, tarvitset meisseliin tuon
erikoiskärjen. Onneksi tuo löytyy
nykyisin useimmista seteistä. Mutta se
on silti ikävää kun tilaat laitteen ja
sitten et voikaan avata sitä työkalun
puuttuessa. Kun olet avannut laitteen,
huomaat ensimmäisenä varmastikin
akun. Ja jos olet koskaan avannut
Nintendo Switchin peliohjaimen,
saatat tunnistaa akun, koska se
on täsmälleen sama kuin peliohjaimessa.
Tämä on siistiä, koska jos joskus,
sanotaan kahden-kolmen vuoden
päästä Game & Watchin akku kuolee,
voit korvata sen peliohjaimen
akulla, joita voit ostaa
halvalla melkein mistä vain. Akun
vieressä, oikealla puolella, on
pieni kaiutin, joka ei ole kovinkaan
hyvä. Ja sen alla on pääpiirilevy
prosessorilla, kaikilla muisteilla
ja niin edelleen. Katsotaanpa niitä.
Laitteen pääprosessori on STM32H7B0.
Tämä on Cortex M7 STMicroelectronicsilta,
1.3 megatavulla keskusmuistia ja 128 kilo-
tavulla flash-muistia. Se toimii 280 MHz:n
kellotaajuudella ja on aika tehokas mikro-
kontrolleri, mutta se häviää prosessori-
tehossa NES- ja SNES-retrokonsoleille.
Tämä prosessori on todellakin vain mikro-
kontrolleri, eikä se voi ajaa Linuxia tai
erityisen monimutkaisia ohjelmistoja.
Koodia kirjoitetaan suoraan raudan
päälle. Laitteessa on raudalle koodattu
laiteohjelmisto. Siitä oikealle
näette 1 megatavun SPI flash -muistin.
Yhteensä tässä laitteessa on
n. 1,1 megatavua tallennustilaa.
Useimmissa - tai oikeastaan kaikissa -
mikrokontrollereissa on debuggausportti.
Jos katsot piirilevyä, voit nähdä
viisi liitintä, jotka eivät ole käytössä.
Ja pari niistä käyttämättömistä
liittimistä on sijoitettu lähelle
prosessoria. Se on todennäköistä, että
siinä on debuggausportti. Ja onneksi
STM32:n tuotetietolomake on julkisesti
saatavilla. Ja voimme tarkistaa kytkennät
ja tarkistaa yleismittarilla
onko nämä pinnit todellakin
debuggausliittymä. Ja niinhän se oli.
Sitten löysimme SWD-debuggausliittymän,
kuten myös VCC:n ja maan näistä
pinneistä. Tämä tarkoitti, että
voimme käyttää debuggeria. Pystyimme
kytkeytymään laitteeseen esimerkiksi
J-Linkillä tai ST-Linkillä. Ja koska
nämä liitännät ovat hyvin esillä,
sinun ei tarvitse edes juottaa. Voit
vain liittää pari testipinniä ja
kytkeä ne debuggeriisi. Seuraava
ongelma on, että useimmissa laitteissa
debuggausliittymä lukitaan valmistus-
prosessin aikana. Tämä tehdään, jotta
ihmiset kuten me emme voisi tehdä
laitteella mitä haluamme ja estääkseen
meitä näkemästä laiteohjelmistoa,
ehkä uudelleenohjelmoimasta sitä jne.
Joten minä olin utelias näkemään jos
voisin ottaa yhteyttä debuggausporttiin.
Kun käynnistin J-Linkin ja yritin
ottaa yhteyttä, voimme nähdä sen
onnistuvan. Mutta kun tutkit asiaa
tarkemmin, huomaat viestin jonka
mukaan laite aktiivisesti lukusuojattu.
Tämä siksi, että STM32-sirussa on
ominaisuus nimeltään RDP-suojaustaso,
readout protection level. Tämä on
periaatteessa tietoturva-asetus
debuggausliittymälle ja siinä on kolme
tasoa. Taso 0 tarkoittaa, että suojaus on
pois päältä. Tasolla 1 flash-muisti on
suojattu ja me emme pysty
kopioimaan sen sisältöä. Kuitenkin,
me voimme kopioida keskusmuistin sisällön
ja myös ajaa koodia keskusmuistissa. Ja
sitten on myös taso 2, joka estää
kaikki debuggaustoiminnallisuudet.
Vaikka siru olisi tasolla 2,
meidän ei pidä antaa periksi.
Esimerkiksi esityksessämme "wallet.fail"
parin vuoden takaa, näytimme miten
generoimalla virheitä ohitimme tason 2
suojauksen ja tiputimme sirun tasolle 1.
Kuitenkin, Game & Watchin tapauksessa,
olimme onnekkaita ja liittymää ei oltu
täysin estetty. Se oli tasolla 1 eli me
pystyimme kopioimaan keskusmuistin, mikä
on hyvä aloituspiste, vaikka emme vielä
pystykään kopiomaan laiteohjelmistoa.
Nyt kun saimme keskusmuistin laitteelta,
olin kiinnostunut sen sisällöstä.
Yksi epäilyistäni oli, että se oli ehkä
emulaattori, joka toimii laitteella,
lataa alkuperäisen Super Mario
Brothersin ROM:in keskusmuistiin.
Ja minä ihmettelin jos voisin löytää
ROM:in keskusmuistin kopiosta.
Ja minä avasin heksaeditoriin sen
keskusmuistin kopion ja alkuperäisen
Super Mario Brothersin ROMin.
Yritin etsiä sen ROM:in osia
keskusmuistin kopiosta. Ja kävi
ilmi, että kyllä, se NES-ROM
ladataan keskusmuistiin ja aina
samaan osoitteeseen. Luultavasti
se kopioidaan keskusmuistiin
käynnistyksen yhteydessä tai jotain.
Ja tämä on kiva tietää, koska se kertoo
meille parikin asiaa. Ensiksikin
tiedämme nyt, että debuggausportti
on toiminnassa, mutta valitettavasti
vain RDP-tasolla 1 ja voimme kopioida vain
keskusmuistin. Ja me tiedämme myös, että
NES:in ROM ladataan keskusmuistiin.
Siellä täytyy olla oikea NES-emulaattori.
Ja jos me olemme onnekkaita, voimme
esimerkiksi korvata ROM:in laitteella
toisella ROM:illa ja pelata siten
vaikka omaa NES-peliämme.
pieni tauko
Seuraavaksi oli aika
kopioida laitteen
flash-muistisiru. Käytän tähän
laitetta nimeltä Mini Pro ja yhtä
näistä hyödyllisistä SOIC-8 -siruista.
Voit kiinnittää nämä flash-muistisiruun
ja kopioida sen sisällön. Varoitus:
laitteen flash-muistisiru toimii
1,8 voltin jännitteellä. Haluat varmasti
varmistaa, että ohjelmointilaitteesi
tukee 1,8 V:n jännitettä. Jos vahingossa
yrität lukea muistia 3,3 V:n jännitteellä,
hajotat sen muistin. Usko pois -
se tapahtui yhdelle minun
laitteistani. Nyt kun meillä on tämä
kopio flash-muistista, voimme analysoida
sitä. Ensimmäiseksi tykkään katsoa
kopion entropiaa tai satunnaisuutta.
Käyttämällä binwalkia optiolla
"-E", saamme hienon entropiakuvaajan.
Tässä tapauksessa voitte nähdä, että
entropia on hyvin korkealla melkein koko
sisällön osalta. Yleensä tämä
indikoi sitä, että muistin sisältö on
kryptattu. Se voisi myös tarkoittaa
pakkausta, mutta jos se olisi pakattu,
näkisimme siinä enemmän tiputuksia.
Tässä tapauksessa se on yhtä korkean
entropian virtaa. Huomasimme myös, että
siinä ei ole minkäänlaisia toistoja, mikä
kertoo meille, että todennäköisesti
kyseessä ei ole yksinkertainen XOR-salaus
vaan pikemminkin AES tai vastaava.
Se, että flash-muisti on salakirjoitettu
ei tarkoita, että meidän pitäisi antaa
periksi. Päinvastoin. Nyt tästä vasta
tuleekin mielenkiintoista, koska tässä on
haaste joka ei ole ihan itsestään selvä.
Yksi suurimmista kysymyksistäni oli:
onko flash-muistin sisältö varmistettu?
Eli käynnistyykö tämä laite jos flash-
muistin sisältöä on muutettu? Jos se
käynnistyisi, se avaisi useita
hyökkäysvektoreita, kuten pian näette.
Varmistaakseni asian, kirjoitan
nollia satunnaisiin paikkoin muistissa.
Niinpä laitoin niitä osoitteeseen 0,
vähän osoitteeseen 0x2000 jne.
Ja sitten kokeilin käynnistyykö
laite vielä. Useimmilla flash-muistin
muutoksilla se käynnistyi ihan OK.
Tämä kertoo meille, että vaikka
flash-muistin sisältö on salattu, sitä ei
ole varmistettu, ei tarkistussummilla
eikä muutenkaan. Joten me voimme ehkä
huijata laitteen hyväksymään muunnellun
kopion flash-muistista. Tämä on tosi
tärkeä tieto, kuten pian huomaat.
Seuraava epäilykseni oli, että ehkä
se NES-ROM, jonka näimme keskusmuistissa
oli ladattu ulkoiselta flash-muistilta.
Ja selvitääkseni tämän, otin sen
flash-muistin kopion ja lisäsin
siihen nollia eri kohtiin.
Kirjoitin sen laitteelle, käynnistin sen,
kopioin keskusmuistin ja vertasin sitä
NES-ROM:iin, jonka löysin keskus-
muistin kopiosta. Vertasin, ovatko
ne identtisiä. Koska epäilykseni oli,
että voisin ehkä ylikirjoittaa
muutaman tavun salatussa flash-muistissa
ja sitten muokata NES-ROM:ia. Sen jälkeen
kun olin tehnyt sen, ehkä puoli tuntia
myöhemmin, minua onnisti ja sain
muutettua neljä tavua flash-nuistissa ja
keskusmuistissa... Sori... ROM:issa,
jonka latasin keskusmuistiin. Ja tämä
kertoo meille melkoisesti. Se tarkoittaa,
että ROM ladataan keskusmuistiin flash-
muistilta, eikä sen sisältöä validoida.
Ja mikä on myös tärkeää on se, että
muutimme neljä tavua flash-muistissa
ja neljä tavua muuttui puretussa ROM:issa.
Tämä on tärkeää tietää, koska jos me
katsomme mitä odotimme tapahtuvan flash-
muistin sisältöä muutettaessa, se olisi
voinut päättyä eri lopputuloksiin. Ja
tässä meillä on SPI flash -muistin
sisäsltö vasemmalla ja keskusmuistin
sisältö oikealla. Ja keskusmuistin
on purettu versio SPI flash -muistin
sisällöstä. Sanotaan, että muutamme
neljä tavua salatusta flash-kopiosta
nolliksi. Kuinka odottaisimme keskus-
muistin sisällön muuttuvan jos,
esimerkiksi, 16 tavua keskusmuistista
muuttuisi. Tämä tarkoittaisi, että
käytössä on ehkä salausalgoritmi
kuten AES ECB-moodissa (Electronic
Codebook). Koska jos se on lohko-
pohjainen salaus ja me muutamme
4 salattua tavua, koko puretun lohkon
eli 16 tavun pitäisi muuttua. Toinen
mahdollisuus on, että muutamme 4
tavua flash-muistissa ja kaikki niitä
seuraava data muuttuisi. Tässä
tapauksessa käytössä olisi ehkä AES
CBC-moodissa (Chaining Cipher).
Kuitenkin jos muutamme 4 tavua flash-
muistissa ja vain 4 tavua muuttuu
keskusmuistissa, käytössä on ehkä
AES CTR-moodissa (Counter). Ja
ymmärtääksesi tämän, otetaan parempi
näkymä siihen miten AES toimii
CTR-moodissa. Se ottaa salaamattoman
tiedon ja XOR:aa sen AES-salausvirran
kanssa, joka on generoitu avaimella,
noncella ja Counter-algoritmilla.
Se AES-virta, jolla tietosi
XOR:ataan, on aina sama jos avain
ja nonce ovat samat. Tämän takia on
huipputärkeää, että käyttäessäsi
AES-CTR:ää, valitset aina uniikin noncen
jokaiseen salaukseen. Jos käytät samaa
noncea kahdesti samankaltaisen datan
salaamiseen, lopputulos näyttää samalta.
Salaamaton data XOR:ataan
AES-CTR -virralla ja niin saamme
salatun datan. Jos tiedämme mitä
salaamaton data oli, eli keskusmuistiin
ladattu ROM-tiedosto, ja meillä
on se salattu koodi, eli flash-muistin
kopio, voimme suorittaa käänteisen
operaation. Lopputuloksena meillä
on AES-CTR -virta, jolla flash-muisti
salakirjoitettiin. Ja tämä tarkoittaa,
että voimme ottaa ROM-tiedoston, XOR:ata
sen juuri selvittämällämme
AES-CTR -virralla ja generoida oman
salatun flash-kopiomme, esimerkiksi
muunnellun ROM:in. Joten kirjoitin
muutamia Python-skriptejä kokeillakseni
tätä. Ja jonkun ajan kuluttua minulla
oli hakkeroitu Super Mario Brothers
alkuperäisen sijasta. Jeejee, hakkeroimme
Nintendo Game & Watchin päivää ennen
virallista julkistusta. Ja voimme asentaa
muokattuja Super Mario Brothers ROM:eja.
Löydät käyttämäni skriptit GitHubistani.
Ne ovat tallennustilassa nimeltään
"Game & Watch Hacking". Olin todella
innoissani, koska olin onnistunut ja olin
murtanut Nintendon konsolin päivää ennen
virallista julkistusta.
Valitettavasti läpäistyäni kentän,
Toad ei ollut yhtä innostunut. Hän kertoi
minulle, että valitettavasti laiteohjelmisto
oli yhä toisessa linnassa. Niinpä heti
maanantaina yhdistin voimani
Konrad Beckmannin kanssa. Hän on hakkeri
Ruotsista. Tutustuimme tapahtumassa.
Me aloimme keskustelemaan ja heittelemään
ideoita puolin ja toisin. Lopulta
me huomasimme, että keskusmuistissa on
erikoisalue nimeltään ITCM-RAM. Se on
kiinteässä yhteydessä keskusmuistiin, jota
käytetään normaalisti korkean suoritus-
kyvyn rutiineihin, kuten keskeytysten
käsittelijöihin. Se on hyvin nopea alue.
Me käsitimme ettemme ole koskaan
tarkastelleet ITCM-muistialueen sisältöä.
Joten me otimme siitä kopion käyttäen
debuggausporttia. Ja kävi ilmi, että
tämä ITCM-muistialue pitää sisällään
ARM-koodia. Joten edelleen kysymys on:
mistä tämä ARM-koodi tulee? Tuleeko se
ulkoisesta flash-muistista, kuten NES-ROM?
Minä toistin toimenpiteen,
jonka teimme NES-ROM:ille.
Laitoin nollia salatun flash-muistin
alkuun, käynnistin laitteen ja
otin kopion ITCM-muistialueesta. Olin
onnekas heti ensimmäisellä yrittämällä,
koska ITCM:n sisältö muuttui. Koska
ITCM:ssä on koodia, ei dataa.
Aiemmin meillä oli ollut vain NES ROM,
joka oli vain dataa, mutta nyt meillä
koodia. Se tarkoitti, että samalla XOR-
kikalla, jota käytimme aiemmin, voisimme
laittaa ulkoiseen flash-muistiin koodia,
joka sitten ladattaisiin keskusmuistiin
laitteen käynnistyessä. Ja koska se on
pysyvä menetelmä, voimme buutata
laitteen ja ajaa sitä ilman debuggeria.
Mikä tahansa koodi, jonka me latasimme
tälle ITCM-alueelle pystyi lukemaan
flash-muistia. Ja me ehkä voisimme
kirjoittaa koodia jota laite-
ohjelmisto jotenkin kutsuisi ja
kopioisi sen keskusmuistiin, josta
me voisimme hakea sen debuggerilla.
Ongelma vain oli, että jos meillä
on oma pätkä koodia tällä
ITCM-alueella, me emme tiedä mistä
osoiteesta ITCM:ssä ajetaan koodia.
Emme tiedä hyppääkö laiteohjelmisto
muistipaikkaan 0 vai 200 vai mihin.
Mutta on olemassa yksinkertainen kikka
oman koodinpätkän rakentamiseen, Se on
nimeltään NOP-liuku. NOP, eli No OPeration,
on prosssorille annettava käsky joka ei
tee mitään. Ja jos me täytämme suurimman
osan ITCM-muistista NOP-käskyillä ja
sijoitamme oman koodimme niiden perään,
me saamme aikaan NOP-liu'un. Ja
kun prosessori, jota kuvaa Mario, hyppää
satunnaiseen osoitteeseen tuossa liu'ussa,
se ryhtyy suorittamaan NOP-käskyjä kunnes
kohtaa koodimme ja suorittaa sen.
Näin vaikka Mario hyppää keskelle
NOP-liukua, hän päätyy aina
meidän koodiimme. Konrad kirjoitti
tämän todella yksinkertaisen
koodin, jossa on ainoastaan noin 10
käskyä, jotka ainoastaan kopioivat
sisäisen flash-muistin keskusmuistiin,
josta me voimme hakea sen debuggerilla.
Jeejee, todella yksinkertainen häkkäys.
Nyt meillä on kopio laiteohjelmistosta ja
koko flash-muistista. Nyt
voimmekin ronkkia koko laitetta.
Olemme julkaisseet työkalut, joilla
sinä voit tehdä saman. Jos haluat
varmuuskopoida Nintendo Game & Watchin,
voit mennä GitHubiini ja ladata
"Game & Watch backup" -säilön, jossa
on paljon tietoa varmuuskopion
tekemisestä. Se tekee tarkistuksen
ja varmistaa tekemättä laitteestasi
tiiliskiveä, että voit helposti
tehdä varmuuskopion laiteohjelmistosta,
asentaa harrastelijaohjelmoijien koodia,
ja kuitenkin palauttamaan alkuperäisen.
Meillä on mahtava tukiyhteisö Discordissa.
Jos ikinä tarvitse apua, luulen että
sitä löytyy sieltä. Toistaiseksi meillä ei
ole vielä yhtään tiiliskiveksi muuttunutta
Game & Watchia, joten koodi näyttää vakaalta.
Olin hyvin innoissani, että tämä haaste
oli nyt ohi. Vai oliko se? Jos joskus
väität netissä murtaneesi onnistuneesti
sulautetun laitteen, siihen on tasan
yksi vastaus: mutta voiko sillä ajaa
Doomia? Kirjaimellisesti saamani
Twitter-viestit, YouTube-kommentit, jopa
ystäväni spämmäsivät minua haasteella
saada Doom toimimaan laitteessa. Mutta
sitä varten meidän pitäisi selvittää
koko laitteen salat. Meidän pitäisi
luoda tapa kehittää omia ohjelmistoja
ja ladata niitä laitteeseen. Onneksi
useimmat komponentit olivat hyvin
dokumentoituja ja siellä ei ollut
mitään vaitiolovelvollisuuden alaisia
komponentteja. Esimerkiksi prosessorista
on avoin käsikirja ja kirjasto.
Flash-muistisiru on hyvin tunnettu.
Ja niin pois päin. Siellä on vain
pari tarkoitukseen suunniteltua
komponenttia. Esimerkiksi laitteen LCD on
tarkoitukseen suunniteltu ja jouduimme
tutkimaan SPI-väylässä näytölle menevää
liikennettä saadaksemme selville mm.
miten näyttö alustetaan. Jonkin
ajan kuluttua meillä oli täysi
laitteisto käytössä. Oli tuki LCD:lle,
audiolle, unitilalle, napeille ja
vieläpä työkalut, joilla pystyit SWD-
debuggeria käyttäen kopioimaan ja
uudelleenkirjoittamaan ulkoisen flash-
muistin. Kaikki löytyy GitHubistamme.
Jos haluat nyt muokata omaa Game &
Watchiasi, kaikki mitä tarvitset on
debuggaussovitin, kuten 3 dollaria maksava
ST-link tai J-Link. Tai oikea ST-Link.
Ja sitten voitkin aloittaa. Olemme
julkaisseet projektipohjan, jolla kuka
tahansa haluava voi aloittaa kehittämään
omia pelejään Game & Watchille.
Se on yksinkertaista. On kuvapuskuri,
johon voit kirjoittaa. Kontrollit ovat
yksinkertaisia jne. Ja kuten sanoin,
meillä on todella avulias yhteisö.
Nyt kun meillä oli koko laitteisto
hallussa, voin viimein työstää Doomia.
Aloitin tutkimalla muita Doomin sovituksia
STM32:lle. Ja löysin nimimerkin floppes
kirjoittaman stm3doomin. Ongelma oli,
että stm32doom on suunniteltu laitteelle,
jossa on 8 megatavua keskusmuistia ja
Doomin vaatimat tiedostot ulkoisella USB-
asemalla. Tässä oli vain 1,3 MB keskus-
muistia, 128 kB flash-muistia ja 1 MB
ulkoista flash-muistia. Meidän pitäisi
mahduttaa siihen kaikki kentät, koodi ja
niin edelleen. Doomin kenttätieto
on tallennettu nk. WAD-tiedostoihin
(WAD = Where's All my Data). Näissä
tiedostoissa on spritet, tekstuurit,
kentät jne. WAD Doom 1:lle on
noin 4 megatavua kooltaan ja
WAD Doom 2:lle on 40 megatavua kooltaan.
Mutta meillä on vain 1,1 megatavua tilaa.
Lisäksi meidän on mahdutettava koodikin
sinne. Joten ilmeisesti meidän on löydettävä
joku tosi pieni Doom-sovitus. Ja kuten
selvisi, on olemassa Mini-WAD. Se on
minimaalinen Doom, jonka WAD-
tiedostosta on riisuttu kaikki
hilavitkuttimet ja kaikki on korvattu
yksinkertaisilla ääriviivoilla jne.
Ja vaikka se ei olekaan nätti, olin
aika varma, että saisin sen toimimaan,
koska se tarvitsee vain 250 kilotavua
40 megatavun sijasta. Lisäksi aika
monta asiaa Chocolate Doom -sovituksesta
piti muuttaa. Esimerkiksi minun piti
poistaa kaikki tiedostoja käsittelevä
koodi ja korvata se omallani.
Minun piti myös lisätä tuki Game &
Watchin LCD:lle ja napeille. Minun piti
hankkiutua eroon monesta asiasta
saadakseni sen toimimaan suht' sujuvasti.
Esimerkiksi pahamainen pyyhkimisefekti
oli pakko tiputtaa, kuten myös äänet.
Seuraava ongelma oli, että kun sitä
käännettiin, se ei mahtunut keskusmuistiin
ja kaatuili kaiken aikaa. Laitteella on
noin 1,3 megatavua keskusmuistia eri
alueilla. Ja esimerkiksi kuvapuskuri,
jota selvästi tarvitsemme, vie siitä
154 kilotavua. Sitten meillä on 160 kilotavua
alustettua dataa, 320 kilotavua alustamatonta
dataa ja tonneittain dynaamisia varauksia,
joita Chocolate Doom tekee. Ja nämä
dynaamiset varaukset olivat iso ongelma,
koska Chocolate Doomin lähdekoodi tekee
paljon pieniä varauksia, joita käytetään
väliaikaiseen tiedonvarastointiin kunnes
ne vapautetaan. Dynaaminen
muisti fragmentoituu pahasti
äkkiä. Lopulta siellä ei ole yhtään
tilaa jäljellä esimerkiksi kentän
alustamiseen. Ja korjatakseni tämän
otin Chocolate Doomin lähdekoodin
ja muutin paljon dynaamisia varauksia
staattisiksi varauksiksi, josta
seurasi se iso etu, että kääntäjän
virheilmoitukset tekivät enemmän järkeä.
Koska se kertoi sinulle: "hei, tämä ja
tämä data ei mahdu keskusmuistiin".
Lopulta useiden yritysten ja erehdysten
sekä kopioituani mahdollisimman monta
alkuperäistä resurssia Mini-WAD:iin,
sain se toimimaan. Minulla oli Doom, joka
toimi tässä Game & Watch -laitteessa
ja toivottavasti rauhoitti Internetin jumalat,
jotka pakottivat minut tekemään sen.
Valitettavasti USB-portti ei ole fyysisesti
kytketty prosessoriin ja siten ei ole
mahdollista hakkeroida laitetta
liittämällä se tietokoneeseen.
Kuitenkin on aika helppo tehdä tämä
käyttäen jotain näistä USB-debuggereista.
Eniten toivottu ohjelmistotyyppi
oli selkeästi emulaattorit. Ja olen ylpeä
sanoessani, että tällä hetkellä meillä
on suurehko kokoelma emulaattoreita, jotka
toimivat Nintendo Game & Watchilla. Ja se
alkoi Konrad Beckmannin aloittamasta
Retro Go -projektista, joka on
kokoelma emulaattoreita laitteelle nimeltä
Odroid Go. Odroid Go on pieni kannettava
laite, jossa on samanlaiset kontrollit ja
kokorajoitukset kuin Game & Watchissa.
Se oli aika siistiä sovittaa tätä koodia,
koska se raskas työ oli jo tehty.
Retro Go sisältää emulaattorit
NES:ille, Gameboylle, Gameboy Colorille,
jopa Sega Master Systemille
ja Sega Game Gearille.
Pari päivää myöhemmin Konrad pystyi
esittelemään NES-emulaattoriaan
ajamassa Zeldaa ja muita pelejä, kuten
Contraa, Nintendo Game & Watchilla.
Tämä on superhauskaa. Aluksi meillä
oli vain perusemulaattori, jolla
pystyi hädintuskin pelaamaan ja se
tiputti frameja. Meillä ei ollut
nättiä skaalausta, VSynciä jne. Mutta
nyt useamman viikon jälkeen se on
aika kiva laite käyttää ja pelata. Meillä
on myös Gameboy-emulaattori, jolla voit
pelata Gameboy-suosikkejasi, kuten
Pokémonia, Super Mario Landia jne.
Nintendo Game & Watchilla jos sinulla
vain sattui ROM:ien varmuuskopiot.
Me kokeilimme erilaisia skaalaus-
algoritmeja hyödyntääkseemme näyttöä.
Sinä voit vaihtaa
käytettyä skaalausalgoritmia
omien mieltymystesi mukaan.
Voit vaihtaa jopa väripalettia
peleille. Meillä on kiva peli-
valikko, joka antaa sinun
pitää laitteella useampia ROM:eja
ja vaihtaa niiden välillä. Meillä on
tuki tilan tallentamiselle, joten laite
tallentaa edistymisesi vaikka
sammuttaisit lalitteen ja voit jatkaa
peliäsi vaikka akku tyhjenisi.
Löydät lähdekoodin kaikkeen tämän
Konradin Retro Go -GitHub-säilöstä.
Ja se todella mahtavaa. Muut
ihmiset kehittävät esimerkiksi
emulaattorin CHIP-8:lle ja siinä on
kiva kokoelma pieniä arcade-pelejä
ja se on todella kivaa ja helppoa
kehittää lisää sitä käyttäen.
Joten kokeile sitä jos sinulla on
Game & Watch ja omatekoiset ohjelmat kiinnostavat.
Tim Schuerwegen jopa työstää emulaattoria
alkuperäisille Game & Watch -peleille.
Tämä on todella siistiä, koska se tekee
Nintendo Game & Watchista emulaattorin
kaikille koskaan julkaistuille
Game & Watch -peleille.
Ja mikä on todella mahtavaa minusta on se
miten yhteisö syntyi. Me olemme aika
avoimia kehityksestämme Twitterissä
ja Konrad striimaa Twitchissä
edistymisestään. Me avasimme Discord-
kanavan, jolle laitteen hakkeroinnista
kiinnostuneet ihmiset voivat liittyä.
Ja oli mahtavaa nähdä mitä yhteisö
sai aikaan. Esimerkiksi nyt meillä on
toimivat tallennuspäivitys, joka toimii
sekä omatekoisten ohjelmien että
virallisen laiteohjelmiston kanssa.
Yhden megatavun tallennustilan sijaan
voit saada 60 megatavua flash-muistia.
Sitä varten sinun on korvattava vain yksi
ainoa siru. Se on aika helppo tehdä.
Raudan täydellistä ymmärtämistä varten
Daniel Cuthbert ja Daniel Padilla ovat
toimittaneet korkean resoluution röntgen-
kuvat, joista näkyy jokainen kytkentä,
jopa PGA-osien. Mitään ei tarvitse
juottaa irti. Sitten Jake Little
Upcycle Electronicsista jäljitti kuvista
ja yleismittarilla piirilevyn
kaavion. Hän jopa loi
piirrustukset, joista selviää kaikki
yksityiskohdat, joita tarvitset kun haluat
ohjelmoida jotain. Se oli todella hauskaa.
Sander van der Wel esimerkiksi on luonut
oman piirilevynsä ja nyt on jopa
projekteja, joissa pyritään korvaamaan
alkuperäinen piirilevy piirilevyllä,
jossa on FPGA ja ESP32. Joten on todella
jännä nähdä mitä ihmiset saavat aikaan.
Toivottavasti nautit tästä esityksestä ja
minä toivon, että näen sinut Discordissa
jos haluat liittyä hauskanpitoon.
Ja kiitos kun olit mukana.
Herald: Hei. Vau, se oli todella uskomaton
esitys. Kiitos paljon, Thomas.
Kuten ilmoitimme alussa, otamme vastaan
kysymyksiä teiltä ja meillä onkin niitä
jo muutama. Katsotaan saammeko käytyä
ne kaikki läpi. Ensimmäinen on:
luitko artikkeleita Nintendosta
tarkkailemassa hakkereita? Yksityis-
etsiviä ja sellaista. Oletko mitenkään
huolissasi tälläisesta?
Thomas: Voi, mitä minun kameralleni
tapahtuu? Näyttää siltä kuin Luigi
olisi sekoillut asetusteni kanssa. Joo,
olen lukenut nuo artikkelit, mutta
tässä tapauksessa ei ole piratismi-
ongelmaa, eihän? En anna kenenkään
pelata uusia pelejä. Jos haluaisit
kopioida Super Mario ROM:in, sinun
olisi pitänyt tehdä se 30 vuotta sitten,
NES Classicilla tai Switchillä tai jollain
niistä sadoista Nintendon siinä välissä
julkaisemista konsoleista. Joten en ole
erityisen huolissani asiasta.
H: Luulen myös, että kohdeyleisön
näkökulma näkyy täällä. Seuraavaan
kysymykseen, joka on: luuletko, että
on olemassa syy siihen miksi
ulkoista flash-sirua käytetään?
Thomas: Jep. STM32H7B0:n sisäinen
flash-muisti on suht' pieni. Se on
vain 128 kilotavua. Ja he eivät olisi
mahduttaneet kaikkea sille, ei edes
kuvapuskuria. Jopa kuvapuskurin
kuva on suurempi kuin sisäinen
flash-muisti. Luulen, että se on syy
ja olen tyytyväinen, että he tekivät niin.
H: Aivan. Onko salauksen purku tehty
koodilla vai onko se mikrokontrollerin
ominaisuus?
T: Mikrokontrollerissa on
integroitu ominaisuus nimeltään OFT-DEC.
Flash-muisti on suoraan mapattu muistiin
ja sirussa on tämä OTF DEC -esitäyttö,
joka tarjoaa automaattisesti
salakirjoituksen purun. Se tehdään
kaikki raudalla ja voit jopa hakea
salausavaimet sieltä raudasta.
Herald: OK, näppärää. Ja myös seuraava
kysymys liittyy siihen:
onko mielestäsi Nintendon käyttämä salaus
siihen käytetyn vaivan arvoinen?
Ikään kuin se olisi siellä antaakseen
valheellista turvallisuudentunnetta.
Mitä sinä ajattelet siitä?
T: Ajattelen omasta näkökulmastani, että
he valitsivat oikean salauksen, koska
sitä oli hauskaa takaisinmallintaa ja
yrittää ohittaa. Se oli mahtava
haaste ja ajattelen, että he tekivät
kaiken oikein. Mutta ajattelen myös, että
loppupeleissä se on yksinkertainen laite
ja jos katsot mitä ihmiset rakentavat
sen päälle - pelejä ja kaikkea muuta -
ajattelen, että he tekivät kaiken oikein.
Luultavasti se oli vain rutiinijuttu
heille. "OK, me lukittiin JTAG."
Jep, mutta luulen että se on hauskaa,
koska e ei avaa piratismiongelmaa.
H: Jep. Yksi juttu liittyy NOP-
liukuun, jonka havainnollistit
todella hyvin. Eikö aliohjelmien
alut olisivat olleet sopivia myös
tämän tavoitteen saavuttamiseen? Kysyjä
sanoo, että rekisterien tallettamiseen
liittyvät komennot ovat aika tunnistettavia.
Kuinka... Jep. T: Joo, todellakin. Datan
löytämiseen ITCM-muistista ja sen
hyväksikäyttöön meni alle tunti aikaa.
Joten jos me olisimme yrittäneet
takaisinmallintaa koodia, se olisi
ollut enemmän työtä. Täysin mahdollista
eikä edes vaikeaa, mutta keskusmuistin
täyttäminen NOP-käskyillä vei vain pari
minuuttia ja oli sekä helpoin että nopein
tapa edetä ilman Ghidraa.
H: OK, siistiä, kiitos. Ja tämä on
enemmän kommentti kuin kysymys. Hän sanoo,
että on outoa ettei ST:n AN5281 mainitse
kertaakaan, että dataa ei verifioida
salauksen aikana. Minusta se on
enemmän virhe ST:n kuin Nintendon
puolelta. Mitä ajattelet tästä?
Thomas: Joo, minä olen jokseeenkin samaa
mieltä tästä. Vaikka sinulla ei olisi
JTAG:ia, ARM:n Thumb-käsky
on 2-4 tavua ja olisi aika pieni
tila bruteforcettaa mahdollisesti
mielenkiintoinen haarautumiskomento.
Joten luulen, että se ei ole täydellistä,
mutta verifiointi on aika
kallista laskentamielessä ja
minusta laiteohjelmiston pitäisi
verifioida ulkoisen flash-muistin sisältö.
H: OK, luulen, että kysymme vielä
kaksi kysymystä ennen kuin palaamme
studioon. Kysymys AES-
salausavaimista... Saitteko
niitä haltuunne?
Thomas: Kyllä saimme. Mutta se on
ST:n sovellus, ja he tekevät jotain hullua
shiftausta avaimille, mutta luulen,
että juuri tänään, vain tunti ennen
tätä esitystä yksi äijä... Sori, en
tiedä, onko kyseessä äijä... Henkilö
Discordissa rakensi uudelleen salauksen.
Mutta me, minä henkilökohtaisesti
en ollut ikinä kiinnostunut siitä,
koska kun olet laskenut laitteen
RTP-tasolle 0, voit lukea mapatun
flash-muistin ja saada salaamattoman
sisällön haltuusi.
H: Aivan, kiitos. Ja viimeinen
kysymys LCD-kontrollerista. Käytetäänkö
sitä kirjoittamalla pikseleitä SPI:n yli
vai onko siinä jotain ominaisuuksia,
ehkä jopa tausta tai spritejä tai jotain
sellaista?
T: LCD:ssä itsessään ei ole mitään
erikoisominaisuuksia. Siinä on SPI-väylä
konfigurointiin ja sitten siinä on
rinnakaisliitäntä - joten se tarvitsee
paljon pinnejä. Mutta siru itsessään
sisältää LTDC:n, joka on LCD-kontrolleri,
joka tarjoaa kaksi tasoa alfasekoituksella
ja jotain perusikkunointia yms.
H: OK, siistiä ja kiitos todella, todella
paljon hienosta esityksestä ja hienosta
introsta. Ja nyt palaamme päästudioomme
kiertoradalle. Kiitos todella paljon.
Takaisin kiertoradalle.
rC3-loppumusiikkia
Subtitles created by c3subtitles.de
in the year 2020. Join, and help us!
Translated by Markus Aurala
(KYBS2004 course assignment at JYU.FI)