Частина 4 - Дебагування "Вітання світу"
Для повного змісту змісту всіх уроків, будь ласка, натисніть нижче, оскільки це надасть вам короткий зміст кожного уроку, а також теми, які будуть розглянуті. https://github.com/mytechnotalent/hacking\_c-\_arm64
Сьогодні ми будемо дебагувати наш перший програмний продукт, використовуючи нашу розробницьку збірку Radare2. Для початку відкрийте нашу бінарну файлову систему Radare2.
radare2./0x01_asm_64_helloworld
Давайте використаємо Radare2, щоб автоматично аналізувати наш код.
aaa
Наступним кроком буде запуск програми в режимі дебагування, щоб вона відображала машинний код з диска в робочий процес.
ood
Тепер, коли ми маємо працюючий екземпляр, ми можемо звернутися до головної точки входу бінарної файлової системи.
s main
Давайте зробимо початковий аналіз, виконавши наступні дії.
v
Вихід з Radare2 надто великий, щоб відображати його в цьому курсі, але коли ви слідуєте за цим в своєму власному середовищі, ви зможете слідувати за цим. Ми збережемо цю конвенцію протягом всього цього курсу для кращої чіткості документації. Пам'ятайте, що є різниця між виконуваним файлом на диску та тим, що знаходиться в роботі, коли він відображається. Коли він знаходиться на диску, він називається не відображеним. Ми розглянемо це наприкінці уроку. Тепер ми розглядаємо відображену версію, як ви бачите, це відображення відображеної кодової системи, яку ми розглянемо пізніше. Чи помітили ви, що ваші відображені значення пам'яті відрізняються від моїх? Це відбувається через ALSR. Address Space Layout Randomization (ASLR) - це техніка безпеки, яка використовується в операційних системах, вперше реалізована в 2001 році. Поточні версії всіх основних операційних систем (iOS, Android, Windows, macOS, Linux) мають захист ASLR. ASLR використовується головним чином для захисту від атак з переповнення буфера. У разі переповнення буфера атакувальник надсилає функцію якомога більше бруту, потім шкідливий вміст. Ми помітили в моїй відображеній пам'яті, що на адресі 0x55629cab48 ми бачимо нашу стрічку "Вітання світу!". Ви матимете різну зміну адреси, як ми вже обговорювали, але знайдете такий же результат. Давайте повернемося до вікна консолі, виконавши наступні дії.
q
Давайте перевіримо наш початковий аналіз.
[0x55629ca9e4]> ps @0x55629cab48 Hello World! [0x55629ca9e4]>
Ми бачимо, що це справді вірно, що на відображеній адресі пам'яті 0x55629cab48 ми бачимо стрічку "Вітання світу!". Давайте також розглянемо відображену версію, щоб краще зрозуміти, що відбувається на рівні машинного коду.
px @0x55629cab48
Ми бачимо нашу стрічку "Вітання світу!" і знову бачимо, що вона існує з початку відображеної адреси пам'яті 0x55629cab48. Ми бачимо, що наш машинний код складається з 16 бітових значень або 64-бітових значень, як ми бачимо перший стовпець починається з 48 і закінчується 00. Важливо розуміти кілька ключових речей. Перше - те, що окремий шістнадцятковий цифровий символ становить 4 біта або нібель або половину байта. У нашому випадку 4 є половинкою байта, а 8 — інша половинка байта. Разом вони утворюють байт і у нашому випадку — валідний ASCII-код символу. Давайте відвідаємо онлайн-таблицю ASCII. http://www.asciitable.com
Друге, нам потрібно зрозуміти, що машина-код перекладається. Давайте побачимо, що 48 у вигляді шістнадцяткового числа означає. Ви бачите, що це велика літера 'H'. Це ідеально підходить, як ви бачите у правій колонці зображення ви бачите 0 і нижче літеру H. Відповідно 65 у вигляді шістнадцяткового числа означає 'e' і так далі. Ви можете продовжити самостійно тепер, коли маєте базову уяву про те, що бачите. Давайте тепер встановимо точку зупинки на main і виконуватимемо цей байнівний файл, щоб перевірити, чи справді коли ми продовжимо виконання від main воно виведе "Hello World" у stdout.
[0x55629ca9e4]> db 0x55629ca9e4 [0x55629ca9e4]>
Давайте продовжимо і перевіримо нашу гіпотезу. Спочатку продовжимо і зупинимося на main.
[0x55629ca9e4]> dc hit breakpoint at: 0x55629ca9e4 [0x55629ca9e4]>
Тепер знову крокуємо далі і оскільки немає інших точок зупинки, ми закінчимо виконання і перевіримо свій результат у stdout.
[0x55629ca9e4]> dc Hello World! (59575) Process exited with status=0x0 [0x7fb146cb8c]>
Давайте вийдемо Radare2.
q y y
Давайте знову запустимо Radare2 і цього разу не запустимо байнівний файл і просто подивимося на неозначений байнівний файл, який знаходиться на диску.
radare2./0x01_asm_64_helloworld
Давайте зробимо автоматичну аналітику.
aaa
Давайте спробуємо дійти до main.
s main
Тоді подивимося.
v
Помітимо, що ми маємо "Hello World!" цей раз на неозначеній адресі пам'яті 0xb48. Ви помітите, що коли ви запустили байнівний файл, виконуваний файл мав зміщення до цієї адреси, але LSB були 48 у вигляді шістнадцяткового числа. Надіюся, ця лекція допоможе вам зрозуміти основи 64-бітового ARM-асемблера і як правильно відтворювати його. У наступній лекції ми навчимося змінювати значення.