Навигация
Наши каталоги
PSP Обои
Реклама
Облако тегов

Блок использует технологию Flash.
Для полноценного просмотра
требуется более новая версия
Adobe Flash Player.


Топ новостей
 

Создание бинарного загрузчика

автор: Flyer | 6-03-2010, 00:49 | Просмотров: 13084
Создание бинарного загрузчикаАвтор оригинального текста: wololo
Автор перевода: Flyer

Первый шаг в запуске homebrew на PSP - написание эксплойта с пользовательскими правами доступа (user mode exploit), который создается за счет нахождения уязвимости в сохранениях, библиотеке по работе с TIFF изображениями и так далее.



Представим, что вы уже нашли такую уязвимость и у вас есть полный контроль над переменной $ra (адрес возврата – return address). Следующий шаг - создать доказательство концепта. Идея состоит в том, чтобы написать бинарный загрузчик (bin loader), который является кодом, загружающим другой код из файла на карте памяти, а затем и исполняющий его. В принципе, написание такого загрузчика - процесс не тяжелый, но он требует достаточно много различного рода знаний. Я предполагаю, что вы уже умеете использовать psplink, у вас установлен minimalist sdk, умеете пользоваться HEX-редактором и более-менее знаете языки программирования.

В этой инструкции я предполагаю, что у вас уже есть полный контроль над $ra и вы можете менять его на что угодно. Я рассказываю, как писать бинарный загрузчик на примере сохранения игры. Некоторые шаги немного отличаются, если вы нашли уязвимость в XMB, но принцип тот же.

Написание бинарного загрузчика на основе эксплойта в сохранение игры состоит из семи шагов:

1. Поиск места для прыжка
2. Поиск адресов импортируемых функций
3. Скомпилировать бинарный загрузчик
4. Вставить скомпилированный код бинарного загрузчика в сохранение игры
5. Написать SDK под вашу игру
6. Создание маленького доказательства концепции (так называемый “Hello world”)
7.Зашифровать заново сохранение игры

Шаг №1 - Поиск места для прыжка

Запустите psplink и воссоздайте ваш креш:

Создание бинарного загрузчика


У вас есть контроль над $ra и вам нужно заставить «прыгнуть» его туда, куда вы вставите код загрузчика. Вам нужно вставить код в сейв (сохранение игры), поэтому вам нужно узнать в каком месте в оперативной памяти заканчивается кусок вашего сейва. Для этого вам нужно визуально сравнить RAM и сейв. Делаем дамп памяти – сразу после креша в psplink’е пишем savemem 0×08800000 20000000 memdump.bin . Таким образом, мы создали дамп памяти, который будет занимать примерно 20 МБ. Теперь откройте сейв в HEX-редакторе и найдите что-то такое, что можно легко заметить. Теперь найдите этот же фрагмент в вашем дампе памяти. На картинке ниже слева дамп памяти, а справа сейв.

Создание бинарного загрузчика


Как только вы нашли то, что искали в дампе памяти, вы уже знаете, куда вы хотите «прыгнуть» и в каком месте вы вставите свой код в сейве. На этом примере код, который я искал, начинается на 0x43F0 в сейве и на 0x32C3E0 в дампе. Последний на самом деле 0×8800000 + 0×32C3E0= 0×08B2C3E0, так как мы начали дамп с 0×8800000. Итак, первый шаг позади: мы нашли хорошее место для прыжка (0×08B2C3E0), и где в сейве мы вставим наш код бинарного загрузчика (0x43F0).

Шаг №2 - Поиск адресов импортируемых функций

Хоть и звучит это очень тяжело, не все так плохо. У нас есть программа для этого smile. Открываем образ вашей игры (WinRar`ом, например) и идем в папку \PSP_GAME\SYSDIR и извлекаем файл EBOOT.BIN. Скорее всего, ваш файл зашифрован, поэтому нужно его декриптировать программой prxdecrypter

prxdecrypter_2-3a.rar [52,73 Kb] (cкачиваний: 164)


Теперь, когда у вас есть декриптированый EBOOT.BIN, качаем prxtool, извлекаем его в любую пустую папку. В эту же папку закидаем декриптированый EBOOT.BIN и файл с ассоциациями имен функций (скачать по второй ссылке ниже), и изменяем его имя с 500_psplibdoc_191008.xml на 1.xml, например. Теперь в папке должно лежать 3 файла: EBOOT.BIN, 1.xml и prxtool.exe. Открываем консоль из папки, где лежат эти 3 файла. (Заходим в консоль и пишем cd и путь к папке) теперь в консоли пишем prxtool -f -n 1.xml EBOOT.BIN. Полученные данные сохраняем, они еще будут нужны.

500_psplibdoc.zip [112,67 Kb] (cкачиваний: 130)


prxtool_win32_1.1.zip [324,57 Kb] (cкачиваний: 180)


Шаг №3 - Скомпилировать бинарный загрузчик

Качаем файл loader.s и открываем его блокнотом.

Создание бинарного загрузчика

Нам нужно здесь поменять всего несколько значений (обведены красным). Открываем список адресов функций, полученных в prxtool на прошлом этапе, и меняем значения в файле на ваши значения. На моем примере заменяем 0×08A69854 на 0×08C88590 для sceIoClose и т.д.
Также, вам нужно изменить адрес, где хранится имя файла. Это имя файла, в котором хранится код, который должен загрузить бинарный загрузчик. Традиционно это ms0:/h.bin Вы должны добавить эту строчку в сейв где то в районе прыжка и вставить адрес в код. В примере это 44E0-43F0=0xF0, поэтому я заменяю 0xC0 на 0xF0.

Примечание! Строчка должна заканчиваться значение 00. То есть, HEX-код вашей строчки должен иметь вид 6D73303A2F682E62696E00


Это все, что вам нужно изменить. Теперь мы скомпилируем код и вставим его в сейв. Закидаем наш файл loader.s в папку /pspsdk/bin и открываем консоль из этой папки. Пишем в консоли

psp-as loader.s
psp-objcopy -O binary a.out a.bin


После этих манипуляций мы получим 2 файла – a.out и a.bin. Открываем второй HEX-редактором и видим код нашего загрузчика.

loader.zip [503 b] (cкачиваний: 129)


Шаг №4 - Вставить скомпилированный код бинарного загрузчика в сохранение игры

Как только у вас есть скомпилированный код лоадера (он в файле a.bin) его легко вставить в сейв. Единственная вещь, которую нужно помнить – вы должны вставить код в то место, которое вы нашли выше в этой статье.

Шаг №5 - Написать SDK под вашу игру

Это не так тяжело как кажется. Как только у вас есть адреса функций (из шага №2) это довольно легко.
Качаем файл sdk.s и sdk.h и переписываем его под себя. Стираем все кроме

.macro AddNID funcname, nid

.globl \funcname
.ent \funcname
\funcname = \nid
.end \funcname

.endm

.file 1 "sdk.c"
.section .mdebug.eabi32
.section .gcc_compiled_long32
.previous
.text
.align 2


в начале и

.ident "MOH-SDK"


в конце. Открываем адреса функций со 2 шага и делаем все по такому же принципу. Например, в prxtool’е функция 0x42EC03AC [0x08C88568] – sceIoWrite в разделе IoFileMgrForUser. То в файле sdk.s она будет иметь вид:

# IoFileMgrForUser
AddNID sceIoWrite, 0x08C88568

И так нужно проделать с каждой функцией, которую выдал prxtool. Примечание! Заметьте, имя библиотеки нужно только перед первой функцией в ней. Теперь у вас есть файлы sdk.s (написанный под вашу игру) и sdk.h (который редактировать не нужно)

sdk.rar [1,31 Kb] (cкачиваний: 100)


Шаг №6 - Создание доказательства концепции (так называемый “Hello world”)

Для того чтобы просто проверить на работоспособность наш sdk и bin loader мы создадим очень простенький дампер. Все что надо, это файлы из архива поместить в пустую папку и закинуть туда файлы sdk.s и sdk.h. Теперь открываем консоль из этой папки и напишем в ней make. Это создаст пару файлов. Вам нужен h.bin. Копируем его в корень карты памяти. Воспроизводим свой креш. Пишем в psplink reset vsh, подсоединяем PSP к компьютеру и смотрим в корне карты, появился ли файл umem.bin. Если появился, то поздравляю вас, ваш загрузчик работает прекрасно.

dumper.rar [1,06 Kb] (cкачиваний: 109)


Шаг №7 - Зашифровать заново сохранение игры

Это последний шаг чтобы удостоверится, что ваш эксплойт работает на официальных прошивках. Мы будем использовать программу под название SED, Переведенную нашим участником myhouse_1991, за что ему огромнейшее спасибо! Как расшифрировать сейв, подробно описано все тем же myhouse_1991 в этой новости.


Ключевые теги: bin loader, exploit, hello world
 
  • Вы не вошли или уже голосовали
  • Рейтинг: 20 (Голосов: 22)
 
Новинки
Комментарии