Частина 10 - Стековий вказівник
Для повного змісту всіх уроків натисніть нижче, оскільки це надасть вам короткий зміст кожного уроку, а також теми, які будуть розглянуті.
Стек — абстрактний тип даних, який є LIFO (Last In First Out). Коли ми надсилаємо значення на стек, воно потрапляє в стековий вказівник, а коли воно видаляється з стека, воно видаляється зі стека і потрапляє в регістр вашого вибору.
Код час! Опять же, не розчаровуйтеся, якщо ви не розумієте всього в прикладі коду тут. Він стане ясним протягом наступних кількох уроків.
Для компіляції:
Як завжди, завантажуємо бінарний файл в GDB, щоб побачити, що відбувається.
Давайте крок за кроком увійдемо в одне.
Давайте крок за кроком увійдемо знову.
Ми бачимо hex 30 або 48 десятичний переміщений в r7. Давайте крок за кроком увійдемо знову.
Ми бачимо зміну значення sp від 0x7efff3a0 до 0xefff39c. Це зміна на 4 байти назад. Чому стековий вказівник рухається назад, ви можете запитати!
Відповідь полягає в тому, що стек зростає НИЗКАРОК. Коли ми кажемо про верхівку стека, можна уявити собі ряд тарілок, які розміщені НИЖЧЕ одна від одної.
Оригінально sp був у 0x7efff3a0.
Коли ми надіслали r7 на стек, нове значення Стековий вказівник тепер 0x7efff39c, тому ми бачимо, що Стек справжньо зростає НИЗКАРОК в пам'яті.
Давайте крок за кроком увійдемо знову.
Ми бачимо зміну значення hex 10 або 16 десятичний переміщений в r7. Побачте, що sp не змінився.
Перед тим, як крок за кроком увійти знову, давайте подивимося на значення всередині sp.
Давайте крок за кроком увійдемо знову.
Ми бачимо зміну значення в стеку була виведена зі стека і повернута в r7, тому значення hex 30 знову знаходиться в r7, а також sp знову знаходиться в 0x73fff3a0.
Будь ласка, візьміть час, щоб написати код, скомпільте його і зв'язайте його, а потім крок за кроком пройдіть бінарний файл в GDB. Стекові операції критичні для розуміння відтворення інженерії і аналізу шкідливого програмного забезпечення, а також будь-якої розробки будь-якого типу.
Наступна неділя ми вийдемо в ARM Процедури завантаження фірмового програмного забезпечення.