вычесть переменные на ассемблере
7,48 Mb.страница20/28Дата конвертации02.12.2011Размер7,48 Mb.Тип ... Смотрите также: 20 ^ Идентификация локальных стековых переменных общая масса бактерий гораздо больше, чем наша с вами суммарная масса. Бактерии - основа жизни на земле А.П. КапицаЛокальные переменные размещаются в стеке (так же называемым автоматической памятью) и удаляются оттуда вызываемой функцией по ее завершению. Рассмотрим подробнее: как это происходит. Сначала в стек затягиваются аргументы, передаваемые функции (если они есть), а сверху на них кладется адрес возврата, помещаемый туда инструкцией CALL вызывающей эту функцию. Получив управление, функция открывает кадр стека сохраняет прежнее значение регистра EBP и устанавливает его равным регистру ESP (регистр указатель вершины стека). "Выше" (т.е. в более младших адресах) EBP находится свободная область стека, ниже служебные данные (сохраненный EBP, адрес возврата) и аргументы. Сохранность области стека, расположенная выше указателя вершины стека (регистра ESP), не гарантируется от затирания и искажения. Ее беспрепятственно могут использовать, например, обработчики аппаратных прерываний, вызываемые в непредсказуемом месте в непредсказуемое время. Да и использование стека самой функцией (для сохранения ль регистров или передачи аргументов) приведет к его искажению. Какой из этой ситуации выход? принудительно переместить указатель вершины стека вверх, тем самым "занимая" данную область стека. Сохранность память, находящейся "ниже" ESP гарантируется (имеется ввиду гарантируется от непреднамеренных искажений), - очередной вызов инструкции PUSH занесет данные на вершину стека, не затирая локальные переменные. По окончании же своей работы, функция обязана вернуть ESP на прежнее место, иначе функция RET снимет со стека отнюдь не адрес возврата, а вообще не весь что (значение самой "верхней" локальной переменной) и передаст управление "в космос" Рисунок 15 0х00E Механизм размещения локальных переменных в стеке. На левой картинке показано состояние стека на момент вызова функции. Она открывает кадр стека, сохраняя прежнее значение регистра 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, а локальные переменные "проживают" выше него.Детали технической реализации. Существует множество вариаций реализации выделения и освобождения памяти под локальные переменные. Казалось бы, чем плохо очевидное SUB ESP,xxx на входе и ADD ESP,
Техника хакерских атак Фундаментальные основы хакерства
Идентификация локальных стековых переменных - Техника хакерских атак Фундаментальные основы хакерства

Комментарии: 0:
Отправить комментарий
Подпишитесь на каналы Комментарии к сообщению [Atom]
<< Главная страница