Le dernier firmware en date, le 2.1.0-3E, a été dumpé.
Un dump, c’est quoi ? Un dump permet donc de vider la mémoire d’une base de données. C’est comme créer une image de la mémoire afin que des développeurs puissent trouver un dysfonctionnement dans un programme. Dans le domaine du jeu vidéo, cela permet plusieurs choses comme créer des sauvegardes de jeux ou encore permettre à des développeurs en herbe de trouver une faille dans un système d’exploitation, tel qu’un firmware d’une console.
Les informations concernant le hack de la Nintendo 3DS ne sont pas nombreuses. Mais le côté obscur de la console avance tout doucement. En effet, si vous avez suivi les dernières nouvelles avec nous, la team Legacy avait réussi le dump des premiers jeux 3DS. Aujourd’hui, c’est au tour d’UpSilon de nous dévoiler les entrailles du dernier firmware 2.1.0-3 E. Un grand pas donc du côté underground de la portable pour découvrir les failles de ce système qui résiste depuis maintenant près de quatre mois. Voici donc les structures du Metadata pour ceux qui peuvent les comprendre.
Structure des metadata
_Header
DEBUT | |LONGUEUR |DESCRITPION
RSA 2048|RSA 4096 | |
0x000 | 0x000 |4 |Signature type
0x004 | 0x004 |256 / 512 |Signature
0x104 | 0x204 |60 |Padding modulo 64
0x140 | 0x240 |64 |Issuer
0x180 | 0x280 |1 |Version
0x181 | 0x281 |1 |ca_crl_version
0x182 | 0x282 |1 |signer_crl_version
0x183 | 0x283 |1 |Padding modulo 64
0x184 | 0x284 |8 |System Version
0x18C | 0x28C |8 |Title ID
0x194 | 0x294 |4 |Title type
0x198 | 0x298 |2 |Group ID
0x19A | 0x29A |62 |reserved
0x1D8 | 0x2D8 |4 |Access rights
0x1DC | 0x2DC |2 |Title version
0x1DE | 0x2DE |2 |Number of Contents
0x1E0 | 0x2E0 |64 |Content Records
0x220 | 0x320 |40 |Padding modulo 64
0x248 | 0x348 |4 |Boot content
0x252 | 0x352 |4 |Banner content
0x256 | 0x356 |4 |Banner size
0x260 | 0x360 |32 |Hash
_Content Records
DEBUT |LONGUEUR |DESCRIPTION
0x00 |4 |Content ID
0x04 |32 |SHA-256 Hash
_Certificates
DEBUT |LONGUEUR |DESCRIPTION
0x000 |4 |Signature type
0x004 |* |Signature
0x104 |64 |Issuer
0x124 |4 |Tag
0x128 |64 |Name
0x168 | |Key
Exemple de Code Source pour Programme.
===================================
typedef struct {
u32 cid; // Content ID
u8 hash[0x20]; // SHA-256 hash
} content_record; // Taille: 0x24 bytes
enum sig_type {
RSA_2048_SHA256 = 0x00010004,
RSA_4096_SHA256 = 0x00010003,
RSA_2048_SHA1 = 0x00010001,
RSA_4096_SHA1 = 0x00010000
};
typedef struct {
u32 sig_type;
u8 sig[*]; // * = Taille de la Signature
u8 fill1[60];
u8 issuer[64]; // Root-CA%08x-CP%08x
u8 version;
u8 ca_crl_version;
u8 signer_crl_version;
u8 fill2;
u64 sys_version;
u64 title_id;
u32 title_type;
u16 group_id; // Editeur
u8 reserved[62];
u32 access_rights;
u16 title_version;
u16 num_contents;
content_record contents[0x40];
u8 padding[0x28];
u32 boot_content;
u32 banner_content;
u32 banner_size;
u8 hash[0x20]; /* Inconnu */
} tmd;
//Le tmd est alors suivi par une chaîne de certificats.
typedef struct {
u32 sig_type;
u8 sig[*]; // * = Taille de la Signature
u8 issuer[64];
u32 tag; // Identifie ce qui est signé.
u8 name[64]; // Nom de chose étant signée.
u8 key[...];
} certificate;