Фундаментальные основы хакерства



         

Идентификация локальных стековых переменных - часть 2


Она открывает кадр стека, сохраняя прежнее значение регистра EBP и устанавливает его равным ESP. На правой картинке изображено резервирование 0x14 байт стековой памяти под локальные переменные. Резервирование осуществляется перемещением регистра ESP "вверх" – в область младший адресов. Фактически локальные переменные размещаются в стеке так, как будто бы они были туда запихнуты командной PUSH. При завершении своей работы, функция увеличивает значение регистра ESP, возвращая его на прежнюю позицию, освобождая тем самым паять, занятую локальными переменными, стягивает со стека и восстанавливает значение EBP, закрывая тем самым кадр стека.

Адресация локальных переменных. Адресация локальных переменных очень похожа на адресацию стековых аргументов (см. "Идентификация аргументов функций :: адресация аргументов в стеке"), только аргументы располагаются "ниже" EBP, а локальные переменные "выше". Другими словами, аргументы имеют положительные смещения относительно EBP, а локальные переменные – отрицательные. Поэтому, их очень легко отличить друг от друга. Так, например, [EBP+xxx] – аргумент, а [EBP-xxx] – локальная переменная.

Регистр-указатель кадра стека служит как бы барьером: по одну сторону от него аргументы функции, по другую – локальные переменные. (см. рис. 16). Теперь понятно, почему при открытии кадра стека значение ESP копируется в EBP, иначе бы адресация локальных переменных и аргументов значительно усложнилась, а разработчики компиляторов, они (как это ни странно) тоже люди и не ходят без нужды осложнять себе жизнь. Впрочем, оптимизирующие компиляторы умеют адресовать локальные переменные и аргументы непосредственно через ESP, освобождая регистр EBP для более полезных целей. Подробнее об этом см. "FPO Frame Pointer Omission".

Рисунок 16 0х00F Адресация локальных переменных. Механизм адресации локальных переменных очень похож на адресацию стековых аргументов, только аргументы расположены ниже указателя кадра стека – регистра EBP, а локальные переменные "проживают" выше него.




Содержание  Назад  Вперед