Частина 11 - ARM Фірмове завантаження
Для повного змісту змісту всіх уроків натисніть нижче, оскільки це надасть вам короткий зміст кожного уроку, а також теми, які будуть обговорені. https://github.com/mytechnotalent/Reverse-Engineering-Tutorial
Давайте зупинимося на тому, що відбувається, коли ми першим включаємо нашу приставку Raspberry Pi. Відразу після того, як Pi отримує живлення, графічний процесор стає першим, який виконує код, оскільки процесор знаходиться в стані перезавантаження, після чого GPU починає виконувати код. ROM читає з картки SD і читає bootcode.bin , який завантажується в пам'ять в C2 кеші і включає решту RAM, після чого start.elf завантажується. start.elf — це операційна система для графічного процесора і читає config.txt , який можна змінити. kernel.img потім завантажується в 0x8000 в пам'яті, яка є ядром Linux. Після завантаження kernel.img включає процесор і починає виконувати код в 0x8000 в пам'яті. Якщо ми бажаємо, ми можемо створити власне kernel.img, в якому можна закодувати машинний код в file і замінити оригінальний образ, після чого перезавантажити. Увага! Слово ARM має довжину 32 біта, які починаються з біта 0 і закінчуються на біта 31. Як було вказано, коли kernel.img завантажується, перша байта, яка складається з 8 біта, завантажується в адресу 0x8000. Давайте відкриємо редактор HEX і напишемо наступне:
FE FF FF EA
Зберегти file як kernel.img і перезавантажити. “Нічого не відбувається, це жахливо!”
Насправді щось відбулося, ви створили свій перший бідний фірмовий код! Час вийти з шампанського! Коли приставка запускається, нижчий код, коли він досяг kernel.img завантажується наступне:
FE FF FF EA
@ адресі 0x8000, 0xfe завантажується.
@ адресі 0x8001, 0xff завантажується.
@ адресі 0x8002, 0xff завантажується.
@ адресі 0x8003, 0xea завантажується.
“Що ж відбувається насправді?”
Ця серія команд просто виконує нескінченний цикл. Перегляньте технічну документацію:
https://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf
Наведений вище код складається з трьох частин:
1)Conditional – Set To Always
2)Op Code – Branch
3)Offset – Як далеко переміститися в поточному місці
Condition – біта 31-28: 0xe або 1110
Op Code – біта 27-24: 0xa або 1010
Offset – біта 23-0 -2
Я знаю, що це багато для того, щоб зрозуміти, але дуже важливо, щоб ви витратили час і прочитали технічну документацію, яку вказано вище. Не обхідно скорочувати час, якщо ви справжньо бажаєте зрозуміти вище. ЧИТАЙТЕ ТЕХНІЧНУ ДОКУМЕНТАЦІЮ! Я зроблю всі можливі зусилля, щоб розбити все на кроки, але є завдання, такі як вище, які я просуваю вас прочитати технічну документацію вище, щоб ви краще зрозуміли, де шукати, коли ви зупиняєтеся на певній операції або серії машинного коду. Цей є однією з тих хвилин, коли я просив вас, будь ласка, прочитайте та дослідіть дані в таблиці вище! «Я заспокоївся! Чому цей хуйня має значення?»
Дякую за запит! Найбільш небезпечний вірус на планеті сьогодні сьогодні є різновидом root-kit. Якщо ви не маєте базової розуміння вище, ви ніколи не почнете навіть розуміти, що таке root-kit, коли ви продовжуєте свій розвиток. Кожен може просто заміняти kernel.img file власною зміненою версією і ви зможете мати повний контроль над усіма процесами з моменту завантаження. Наступна неділя ми вийдемо в тему архітектури Вон Ноймана.