|
Переполнение буфера в стеке. Часть 1 kas1e Xakep, номер #050, стр. 050-062-2 Процессор и регистры Для начала нужно иметь представление о том, что на самом деле представляет собой процессор. Процессор - это большая-большая схема, элементы которой миниатюрны и "залиты" в боксы (сам процессор). На самом нижнем уровне - это банальные резисторы, конденсаторы и транзисторы. Связки из нескольких транзисторов стали называть регистры, и именно с их помощью процессор получает и обрабатывает информацию от внешнего мира (все это весьма приблизительно, для получения более детальной информации читай соответствующую литературу), и именно ими управляют злые любители ассемблера. Регистры можно представлять себе по-разному. Я же их представляю как мужиков со стройки в оранжевых касках, готовых день и ночь складывать все, что им дают. Вот этих мужиков-строителей - регистров на разных процессорах разное количество. И даже на x86-семействе их число постоянно увеличивается. Есть регистры для управления fpu, есть для арифметических операций, есть регистры, предназначенные для индексации, адресации, индикации состояния, и самое для нас главное - регистры для работы со стеком. Регистры бывают 16/32/64-битные. Маленькая размерность (разрядность) идет с самых младших x86 процессоров (такие как 8088, 8086, 80286), далее, получив расширенную адресацию и защищенный режим, процессорные регистры расширились до 32 бит (80386, 80486) и после до 64 бит. Нас, в особенности, будут интересовать регистры, которые имеют непосредственное отношение к стеку: Регистр EIP (современная 32-битная версия 16-битного прототипа - регистра IP). Этот регистр содержит в себе адрес команды, которая будет выполнена процессором. EIP расшифровывается как extended index pointer, т.е. расширенный индексный указатель. Этот регистр является одним из трех самых важных регистров, которые нам понадобятся в процессе освоения техники. Можно представить это очень просто. Есть программка, которую мы запустили на выполнение. Адрес первой команды этой программки лежит в eip. Выполнилась одна команда, адрес следующей уже в eip и так далее. Т.е. изменяя данные в eip регистре, мы говорим процессору, по какому адресу следует искать следующие инструкции для выполнения. Второй регистр - это ESP (также современная 32-битная версия 16-битного SP регистра). ESP означает extended stack pointer - т.е. расширенный стековый указатель. Этот регистр позволяет нам адресоваться по стеку, и именно он указывает на адреса данных, которые будут вынуты из стека (о стеке будет чуть ниже). Также очень важный для нас регистр. И третий регистр - это EBP (современная версия 16-битного BP регистра). EBP - extended base pointer - расширенный указатель на базу. Регистр призван облегчить доступ к данным, находящимся в стеке. Если программа использует хранение локальных переменных в стеке (а в нашем случае именно так), то при помощи ebp мы можем напрямую адресоваться к параметрам. Вот три регистра, которые нам нужно знать и понимать. Теперь пришло время поговорить непосредственно о стеке. |