Информация об OTP

OTP - это 0x100-байтовая область, вероятно, случайных данных, расположенная по адресу 0x10012000. Судя по всему, уникальные ключи приставки генерируются именно в этой области. Как именно это происходит, не совсем понятно. Очень похоже, что эта область у каждой консоли уникальна и расшифровывается бутромом, но это не точно. Понятней будет, когда кому-либо удастся сделать дамп полностью зашифрованного бутрома, но это пока никому не удавалось.

До версии 3.0.0-X, область 0x10012000 (OTP) не была защищена и злоумышленник мог сдампить ее имея права на запуск программного кода на уровне ARM9.

После версии 3.0.0-X, Nintendo стали блокировать эту область с помощью регистра CFG_SYSPROT9, который также блокирует загрузчик. Положение регистра можно менять лишь при загрузке системы, задолго до того, как мы можем выполнять код. Этот регистр может быть изменен ровно один раз, и будет включен до тех пор, пока вы не выключите устройство. Именно поэтому невозможно сдампить OTP на прошивках выше 3.0.0-X.

Существует, однако, способ сдампить хэш OTP на версии 9.6.0-X. Поскольку Kernel9Loader не очищает регистр SHA_HASH после использования, дампинг SHA_HASH даст хэш OTP, который был передан Kernel9 из Kernel9Loader. Кроме того, существует старая уязвимость, позволяющая не очищать RAM после перезагрузки MCU через i2c.

Все это позволяет провести аппаратную атаку. Произвольные данные записываются в nand_sector96 + 0x10 в бекап SysNAND и такой модифицированный бекап пишется в приставку. После этого подаем команду на перезагрузку в MCU через i2c, записываем куда-нибудь в память arm9 загрузчик (который будет писать содержимое 0x1000A040 - 0x1000A060 в файл на SD-карте), и заполняем всю память NOP-ами, за которым идут инструкции JMP указывающие на наш загрузчик. Затем мы можем циклично перезагружать MCU (тем самым увеличивая nand_sector96 + 0х10 на 1 после каждого цикла) до тех пор, пока Kernel9Loader не перейдет к загрузчику.

Из-за сложности и дополнительного аппаратного вмешательства, в этом руководстве решено было рассматривать только метод, подразумевающий даунгрейд до прошивки, ниже, чем 3.0.0-X. Версия 2.1.0-X был выбран потому, что является единственной версией ниже 3.0.0-X, который содержит достаточно уязвимую версию браузера (2.0.0-X тоже имеет подходящую версию браузера, однако, эта версия не подходит по иным причинам).

Процесс включает в себя перепрошивку CTRNAND до версии 2.1.0-4. Все это возможно благодаря установке заранее подготовленного образа CTRNAND, содержащего 2.1.0 и копированию необходимых консоли файлов (moveable.sed и SecureInfo_A, например) прямо в него, а затем реструктуризации базы данных CMACS. В New 3DS мы так же меняем слот шифрования CTRNAND и устанавливаем в NAND NCSD header от Old 3DS, что позволяет нам загрузить в ньюшку прошивку от old 3DS (потому что сами ньюшки никогда не имели прошивки ниже, 9й версии).