Файл TITLE.DB со всеми данными загружается по постоянному адресу ОЗУ 0х20800000. Это означает, что можно использовать целую программу для запуска вслед за exploit в файле TITLE.DB и определения места загрузки!
Программа frnd_title_params() определяет три параметра: адрес загрузки файла TITLE.DB (title db), адрес строковой переменной для приема значений параметров (params) и имя (title_name). Она выполняет один цикл для поиска каждой строки (заканчивается на перевод строки в коде ASCII, ввод или оба) для идентификационного имени.
При определении имени она сканирует остальные данные в строке после имени для вычленения оконечных знаков. После их обнаружения она копирует эти данные в строковую переменную params.
Теоретически, значение параметра, связанное с именем, должно содержать порядка 25 байт, включая оконечные знаки. В программе load_mc_title_db() программисты компании Sony выделили 256 байт для сохранения данного значения. Эти байты хранятся в ОЗУ рядом с очень важным регистром ЕЕ, адресом возврата или регистром $ra. В архитектуре MIPS, когда одна программа выполняет другую программу, она сохраняет $ra в ОЗУ, так как ЦП автоматически обновляет $ra для указания на последние данные программы вызова. После завершения выполнения вызываемой программы $ra все еще ссылается на эти данные. Поэтому, прежде чем завершить программу вызова, необходимо восстановить $ra из ОЗУ. В программе load_mc_title_db() $ra, сохраняемый до вызова программы frnd_title_ params(), расположен после строковой переменной params.
Когда программа find_title_params() копирует строку параметров в params, она использует функцию С strcpy(), которая копирует одну строку произвольной длины на другую строку. Функция strcpy() не предусматривает проверку границ, поэтому она копирует всю строку до тех пор, пока не найдет оконечный знак NUL (ASCII 0). Это означает, что если бы нам требовалось создать строку в рамках файла TITLE.DB длиннее 256 байт, выделенных для params, мы могли бы перезаписать сохраненный регистр $ra (так как он сохранен в ОЗУ после значений params). Любое значение, на которое будет перезаписан регистр $ra, становится следующим адресом, выполняемым после завершения load_mc_title_db(). Это может быть любой адрес ОЗУ, доступный для ЕЕ.
Данный тип exploit, называемый «переполнение буфера», как правило, является неотъемлемой частью программного обеспечения, которое не предусматривает проверку границ строк или других значений, загруженных из файлов данных. Он просто в обращении, как, например, Independence exploit в PS1DRV. При помощи стандартной функции С strncpy() можно задать максимальную длину копируемой строки. Если бы компания Sony изначально использовала функцию strncpy() с максимальной длиной 256 байт, использование exploit было бы невозможно.
Так как мы создали данную строку в рамках файла TITLE.DB, куда мы направим регистр $ra? Следует помнить, что программа load_mc_title_db() загружает все данные файла TITLE.DB в ОЗУ по фиксированному адресу 0х20800000. Мы можем установить $ra на любой адрес после адреса загрузки файла TITLE.DB. В Independence exploit я использовал фиксированный адрес 0х20810110 для обеспечения достаточного пространства для 200 записей в файле TITLE.DB. После завершения выполнения программы load_mc_title_db() регистр $ra указывает на данный адрес, и мой код принимает на себя управление над приставкой PS2.
Опубликовал katy
March 20 2015 08:20:21 ·
0 Комментариев ·
2424 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.