Oracle of Ages and Seasons – Уязвимости соединительного кабеля

oracleofagesandseasons8211Уязвимостисоединительногокабеля

Я обнаружил несколько уязвимостей, в том числе серьезную уязвимость удаленного выполнения кода (RCE), в модуле связи по кабелю связи «Легенда о Zelda: Oracle of Seasons» для Game Boy Color. Уязвимость вызвана невозможностью дезинфекции входных данных, полученных по соединительному кабелю.

Oracle of Ages, игра, родственная Oracle of Seasons, также подвержена этим уязвимостям и удаленному выполнению кода. считается возможным. Однако масштабы воздействия уязвимости не были исследованы так глубоко, учитывая, что это программное обеспечение уже имеет незащищенную уязвимость выполнения кода, которая не связана с использованием соединительного кабеля. Напротив, это первая известная уязвимость выполнения кода в Oracle of Seasons.

В этом отчете я продемонстрирую, как ранее известный эксплойт выполнения кода в Oracle of Ages может быть использован для добиться удаленного выполнения кода в Oracle of Seasons, отправив поврежденные данные файла по кабелю связи. Я продемонстрирую экспериментальную эксплуатацию, перейдя непосредственно к титрам в Oracle of Seasons в течение нескольких секунд после первого открытия файла. Спидраннеры из категории « Linked Any% » сочтут это либо тревожным, либо долгожданным событием, в зависимости от их отношения к Oracle of Seasons.

Фон

The Legend of Zelda: Oracle of Ages and Seasons – это пара видеоигр для выпущенной Game Boy Color. в 2003 . Поскольку они были выпущены одновременно, у них есть уникальная система «связывания», которую необходимо использовать, чтобы открыть «истинный» финал двух игр. Поскольку не у всех игроков был кабель Gameboy Link, в играх также можно было общаться с помощью серии «паролей». Я ранее описывал неиспользуемые ошибки в этой системе паролей; однако это первый раз, когда функция Link Cable была тщательно проверена.

Oracle of Ages (left) and Seasons (right).
Оракул веков (слева) и времен года (справа).

Пока эти две игры используют одну и ту же кодовую базу, что удивительно, но в Oracle of Seasons было обнаружено очень мало уязвимых ошибок по сравнению с Oracle of Ages. (В этом контексте «эксплуатируемая ошибка» означает ошибку, которую можно использовать для более быстрого прохождения игры). Единственная известная уязвимая ошибка – это так называемая ошибка « Rooster Adventure », и даже она была исправлена. в обновлении для Европы.

The Rooster Adventure bug in action.
Ошибка «Приключения петуха» в действии.

В отличие от Oracle of Ages эксплуатируемые ошибки, включая дублирование лопатой , деформация текста и печально известная Веранская деформация . В последнее время выполнение произвольного кода (ACE) стало настолько простым, что обычно выполняется спидраннерами для перехода непосредственно к титрам.

VeranWarp has many buggy side-effects.
Veran Warp имеет множество побочных эффектов, связанных с ошибками.

Выполнение произвольного кода (ACE) в Oracle of Ages

Для достижения удаленного кода Выполнение в сезонах сначала требует выполнения произвольного кода в веках, я опишу это в первую очередь.

В последние месяцы были разработаны новые методы ACE, позволяющие записывать любой байт практически в любой адрес памяти, это означает, что можно достичь «полного контроля» над игрой. Учитывая, что наше единственное устройство ввода – это кнопки на самом Gameboy (соединительный кабель для этого не использовался), это немалый подвиг. В демонстрационном видео, показанном ниже, этот метод используется для отключения всех столкновений в игре. Обратите внимание, что японская версия почти всегда используется при выполнении ACE, потому что больший набор символов, используемый для ввода имени, очень полезен при выполнении в виде кода (но в принципе это все еще возможно в других версиях).

Для подготовки эксплойта Link Cable использовалась слегка измененная версия этой техники ACE. Вот как это работает:

Во-первых, при создании файла игрок вводит имя «ズ モ ゲ フ フ» (zumogefufu). Есть также именованный дочерний NPC, которому дали имя «ぇ ヌ フ コ オ» (enufukoo). Это будет выполнено как код позже. Затем игрок должен играть в игру «нормально» до получения предмета «Мелодия веков». На этом этапе у игрока будет оборудование, необходимое для выполнения сбоя «деформации текста» в определенной области и достижения тайла карты за пределами поля.

На этом этапе, если игрок откроет карту, он обнаружит, что его курсор находится за пределами поля. Если они выберут конкретный тайл за пределами границ, программный счетчик (регистр pc) попытается перейти в неопределенное место; это означает, что он помещает некоторое значение, которое не является предполагаемым , чтобы быть адресом в регистре ПК. В конечном итоге компьютер переходит к адресу FAD5 , который находится в середине объектной памяти. Затем, манипулируя объектами на экране, мы можем создать инструкцию «jp» для перехода к адресу E 606 , в котором хранится имя ссылки. Более раннее исследование SBD более подробно описывает, как это достигнуто.

Имя ссылки (ズ モ ゲ フ フ) соответствует на коды операций «xor a, D2; ld (cbcb), а ». Поскольку перед этим значением регистра ‘a’ является D5, мы фактически помещаем значение « »на адрес« cbcb ». (Мы не можем вводить значения между 0x 03 – 0x5f с именем, поэтому иногда нам нужно обойти это).

Адрес «cbcb» соответствует переменной, отслеживающей, какой тип меню открывается. Обычно это «07 »для меню карты, но изменив его на« 15 », мы меняем меню на экран ввода имени для дочернего NPC.

Graphics are corrupted, but it works just fine.
Графика повреждена, но работает нормально.

Это удобно, потому что на самом деле буфер имени дочернего элемента сохраняется напрямую рядом с именем Линка. Это означает, что дальше будет выполнено имя ребенка. Более конкретно, из-за байтов, окружающих это имя, он выполнит код операции «ld bc, XXXX», где «XXXX» – символы в имени ребенка; за ним следуют еще 3 управляемых байта, а затем код операции «ld (bc), a».

Напомним: у нас есть настройка «Выполнение произвольного кода», которая открывает дочернее меню переименования, и который также выполняет имя ребенка как код ; это означает, что мы можем продолжать изменять код, который хотим выполнить. Даже имея всего 5 байтов для работы и даже не имея возможности вводить байты 04 – 5f, этого достаточно, чтобы написать любой значение многие адресов памяти (пока каждый байт адреса находится между 067 – ff).

Осталась только одна проблема: если мы хотим использовать все 5 байтов в имени ребенка , нам нужен какой-то код операции «возврата». В этом случае «первая »Операционный код эффективно работает именно так. Первоначальное имя ребенка, «ぇ ヌ フ コ オ», записывает этот код операции (0xFF) по адресу C 615 (E 614 это зеркало C 615).

Note that address E611 now has opcode 'rst 38'.
Примечание тот адрес E 615 теперь имеет код операции ‘первый 44 ‘.

Теперь у нас есть возможность записывать байты в очень большой диапазон адресов памяти. Теперь, когда я показал, как получить эту способность в Oracle of Ages, я покажу, как ее можно использовать для эксплуатации уязвимостей в Oracle of Seasons через соединительный кабель.

Note that address E611 now has opcode 'rst 38'. Фон кабеля связи

В файле выберите экрана, есть возможность «связать» с другой игрой, если она подключена через соединительный кабель. Например, после завершения файла Oracle of Ages Oracle of Seasons может установить ссылку на него для инициализации нового файла на основе файла Ages. Если этот процесс успешен, 0x – байт «заголовок файла» передается по кабелю связи, и эти данные используются для инициализации файла. Эти данные включают, но не ограничиваются:

Leave a comment

Your email address will not be published. Required fields are marked *