...

Примечание

Все приведенные в главе примеры откомпилированы в операционной системе Windows 2000 компилятором VC++ 6 SP5 (Msdn.microsoft.com), если об этом ничего не сказано. Для большей ясности и простоты при компиляции примеров использовалась возможность построения выполнимой версии программы с отключенными опциями оптимизации программного кода. Примеры дизассемблирования подготовлены с использованием дизассемблера IDA pro 4.18 (www.datarescue.com). Все примеры предполагают использование стандартного чипсета x86.

Рассматриваемые в главе стеки процессора Intel x86 инвертированы в том смысле, что области памяти с меньшими адресами находятся на «вершине» стека. Операция push перемещает указатель вершины стека ниже (проталкивает запись в стек), в то время как операция pop – выше (выталкивает данные из стека). Данные располагаются в области памяти, отведенной под стек, начиная со дна стека, то есть с его максимального адреса, по последовательно уменьшающимся адресам памяти. Отчасти этим объясняется переполнение буфера: при записи в буфер от младших адресов к старшим возможно затирание данных, ранее сохраненных в области памяти со старшими адресами, например подмена сохраненного в стеке содержимого расширенного регистра команд EIP (Extended Instruction Pointer). Адрес доступного верхнего элемента хранится в регистре-указателе стека ESP.

Загрузка...