Частина 21 - Як скомпільовувати програму
Для повного змісту змісту всіх уроків, будь ласка, натисніть нижче, оскільки це надасть вам короткий зміст кожного уроку, а також теми, які будуть обговорені. https://github.com/mytechnotalent/Reverse-Engineering-Tutorial
Давайте ще раз розглянемо попередній тижневий C-програму та візьмімо глибший погляд на те, як ми перетворюємо цей джерельний код у виконуваний file.
Щоб скомпільувати цю програму в C, ми просто набираємо:
Цей єдиний крок створить exit.o який є бінарним об'єктом file і exit який є бінарним виконуваним file. Якщо ми бажаємо перетворити цей C-джерельний код на збірку, нам потрібно використовувати GNU-компілятор за допомогою нижче вказаного способу. Давайте почнемо виконувати нижчий команду в терміналі:
Давайте почнемо з ключа -S. Ключ -S створить порівнянну збірку AT&T Syntax джерельний код. Ключ -m32 створить виконуваний 32-бітовий файл, а ключ -O0 скаже компілятору, скільки оптимізації використовувати під час компіляції бінарного файлу. Той капітальний О і цифрова 0. Цифрова 0 у цьому випадку означає відсутність оптимізації, тобто найбільш читабельний інструкційний набір. Якщо ви заміните 1, 2 або 3, кількість оптимізації зростає відповідно до зростання значень.
Цей крок вище створює exit.s який є еквівалентним збірковому джерельному коду, про який ми згадували раніше. Потім нам потрібно скомпільувати збірковий джерельний код у бінарний об'єкт file який створить exit.o file.
Нарешті, нам потрібно використовувати лінкер для створення справжнього бінарного виконуваного коду з бінарного об'єкта file який створить виконуваний файл під назвою exit.
У попередньому тижні, коли ми досліджували виконуваний файл file exit у програмі objdump, і досліджували головну область, ми побачили наступне нижче, окрім цього разу ми використовуємо збірковий джерельний код AT&T Syntax:
Ця команда вище створить наступний вивід нижче:
Давайте дослідимо код у дебагері. Давайте почнемо GDB який є GNU-дебагером і перерахуйте джерельний код, потім встановіть зупинку на головній області та запустіть програму. Нарешті, ми розіб'ємо та переглянемо вивід нижче:
У кожному з трьох вище вказаних досліджень ви побачите майже такий самий набір інструкцій, про який ми візьмемо глибший погляд у майбутніх навчальних матеріалах. У цій навчальній серії до цього часу ми досліджували збірковий джерельний код Intel Syntax. Тепер ми змінюємо свій фокус на збірковий джерельний код AT&T Syntax, про який я вже згадував раніше, оскільки це природний синтаксис, який використовується в Linux з GNU-компілятором та GNU-дебагером. Найбільша різниця, яку ви побачите, полягає в тому, що в збірковому джерельному коді AT&T Syntax джерельні та призначення змінені місцями. AT&T Синтаксис: movl %esp, %ebp [This означає перемістити esp у ebp.]
Інтел Синтаксис: mov esp, ebp [This означає перемістити ebp у esp.]
Також ви побачите деякі додаткові варіації, оскільки AT&T використовує додаткові варіації, які ми розглянемо пізніше в іншому навчанні. Якщо ми бажаємо створити чистий код збірки, який робить те саме, що й вище, ми б написали:
Для компіляції цього ми використовували б GAS збірник і лінкер:
Щоб запустити будь-який виконуваний файл в Linux, потрібно написати./ і ім'я виконуваного файлу. У цьому випадку ми написали./exit і натиснули Enter. Коли ми робимо це, нічого не відбувається. Це добре, оскільки ми лише створили програму, яка вийшла до ОС. Я чекаю на побачення з вами наступної тижня, коли ми глибше вивчимо асемблерний код!