Частина 11: Сегментні регістри
Для повного змісту змісту всіх уроків натисніть нижче, оскільки це надасть вам короткий зміст кожного уроку, а також теми, які будуть обговорені. https://github.com/mytechnotalent/Reverse-Engineering-Tutorial
Сегментні регістри використовуються спеціально для посилання на комірки пам'яті. Існує три різні методи доступу до системної пам'яті, з яких ми зосередимося на плоскій моделі пам'яті, яка є актуальною для наших цілей.
Існує шість сегментних регістрів, а саме:
CS: Регістр сегмента коду зберігає базову комірку секції коду (.text section), яка використовується для доступу до даних.
DS: Регістр сегмента даних зберігає місце розташування за замовчуванням для змінних (секція .data), яке використовується для доступу до даних.
ES: Додатковий регістр сегмента, який використовується під час операцій з рядками.
SS: Регістр сегмента стека зберігає базове місце розташування сегмента стека і використовується при неявній використанні покажчика стека або при явній використанні базового покажчика.
FS: Додатковий регістр сегмента.
GS: Додатковий регістр сегмента.
Кожен сегментний регістр має розмір 16 бітів і містить покажчик на початок сегмента, що відповідає певній області пам'яті. Регістр CS містить покажчик на сегмент коду в пам'яті. Сегмент коду — це місце, де в пам'яті зберігаються коди інструкцій. Процесор отримує коди інструкцій з пам'яті на основі значення регістра CS і значення зміщення, що міститься в регістрі покажчика інструкцій (EIP). Слід пам'ятати, що жодна програма не може явно завантажувати або змінювати регістр CS. Процесор призначає його значення, коли програмі призначається простір пам'яті.
Регістри сегментів DS, ES, FS і GS використовуються для вказівки на сегменти даних. Кожен з чотирьох окремих сегментів даних допомагає програмі розділяти елементи даних, щоб вони не перекривалися. Програма завантажує регістри сегментів даних з відповідним значенням покажчика для сегментів, а потім посилається на окремі комірки пам'яті, використовуючи значення зміщення.
Регістр сегмента стека (SS) використовується для вказівки на сегмент стека. Стек містить значення даних, що передаються функціям і процедурам у програмі.
Реєстри сегментів вважаються частиною операційної системи і в більшості випадків не можуть бути прочитані або змінені безпосередньо. При роботі в захищеному режимі плоскої моделі (32-бітна архітектура x86) ваша програма виконується і отримує 4 ГБ адресного простору, в якому будь-який 32-бітний регістр може потенційно адресувати будь-яке з чотирьох мільярдів місць пам'яті, за винятком захищених областей, визначених операційною системою. Фізична пам'ять може бути більшою за 4 ГБ, однак 32-бітний регістр може виражати лише 4 294 967 296 різних комірок. Якщо у вашому комп'ютері більше 4 ГБ пам'яті, ОС повинна виділити область розміром 4 ГБ у пам'яті, і ваші програми будуть обмежені цією новою областю. Це завдання виконується сегментними регістрами, а ОС здійснює суворий контроль за цим процесом.
У наступній частині ми продовжимо обговорення архітектури IA-32 з регістром покажчика інструкцій.