Поскольку
поддержка TIFF изображений была убрана из последних версий официальной
прошивки Sony PSP, то наиболее реальным способом нахождения
уязвимостей, способных в последствии перерасти в эксплоит и HEN,
остается, как и прежде, нахождение ошибок в системе сохранения игр.
Данная инструкция поможет вам на практике опробовать простейший, но,
тем не менее, достаточно эффективный способ их выявления.
Наиболее
популярный способ поиска такой ошибки – записать очень длинную строку
(например, This is spartaaaaaaaaaaaaaaaaaaaaa) в строку имени игрока
внутри самого сохранения.
В
большинстве случаев игра просто сообщит, что сохранение игры
повреждено. Но если игра зависнет, то ВОЗМОЖНО удастся найти что-нибудь
полезное. Данное зависание означает, что в коде игры содержится ошибка.
А с помощью программы PSPLink можно узнать, получится ли эту ошибку
превратить в эксплоит или нет.
Запуск игры совместно с PSPLink
Потребуется PSP с модифицированной прошивкой и установленный PSPLink. В
архиве PSPLink содержится несколько prx файлов, плагины usbhostfs.prx и
psplink.prx нужно установить и активировать для игры. Читаем статью – «PSP Кодинг, Часть 2 – Повести дилетанта».
Когда
все установлено, запустите на компьютере usbhostfs_pc и psph, соедините
PSP с компьютером через USB и запустите игру. Если все прошло удачно,
то usbhostfs_pc выведет «connected to device», а pspsh выведет «all
modules loaded» а затем выведет «/host0:>».
После загрузки сохранения, игра должна зависнуть, а дамп памяти должен отобразиться в окне psph.
Что нас интересует?
PSPLink
показывает значения регистров памяти до краха игры. Регистры – это
32-битные целочисленные данные, которые могут быть как символами, так и
адресами памяти, в зависимости от того, как их обрабатывает программа.
При
написании эксплоита требуется найти возможность совершить переход на
произвольный участок памяти. Наиболее известный вариант – это
перезаписать содержимое регистра $ra (ra – return address, то есть
адрес возврата). Это адрес, куда перейдет выполнение кода, после
завершения подпрограммы по команде «j $ra» (переход на $ra). Значение
регистра $ra обычно берется из регистра $sp. Если можно изменить
значение $sp, то это тоже хорошо.
Другие регистры не являются бесполезными, они могут влиять на значение регистров $ra и $sp, но это слишком сложно.
Почему же уязвимость в игре GripShift – это эксплоит, а уязвимость в игре Phantasy Star – просто крах?
Сравним дампы памяти при возникновении ошибки (крах игры).
GripShift:
Мы
поместили много символов «a» в имя игрока. Смотрим в дамп и видим, что
$ra равно 0×61616161, а символ «a» в шестнадцатеричном виде равен 61.
Ура!
Мы нашли простой способ для перехода к произвольному участку памяти.
Для этого символы «ааааа» надо заменить на адрес, по которому будет
расположен исполняемый код.
Как вы должно быть знаете, под
эту уязвимость действительно был написан работающий эксплоит и HEN,
однако его публичный релиз так и не состоялся в виду конфликта,
разгоревшегося между его авторами.
Phantasy Star:
Мы видим несколько значений «61», но ничего интересного в $sp и $ra. Посмотрим, может $a1, $a2,$a3 принесут какую-либо пользу.
К
сожалению, $a1, $a2,$a3 не связаны с $sp и потому пользы от них нет.
Возможно, данную уязвимость все-таки можно превратить в эксплоит, но
лучше заняться следующей игрой. Удачных вам поисков .