СТЕК 2, ПЕРЕЗАГРУЗКА

Alex Shark

Спецвыпуск Xakep, номер #032, стр. 032-020-1

(qqqqqwww@e-mail.ru, http://nevod.nm.ru)

ЧТО ТАКОЕ BUFFER OVERFLOW И КАК ЭТО ЮЗАТЬ?

К сожалению, никому не дано понять, что такое стек. Ты все должен увидеть сам. Съешь красную пилюлю - и я покажу тебе дизассемблер и что творится на самом деле в компьютере. Съешь синюю - и ты проснешься в привычном мире окон...

Читатель берет зеленое колесо и проваливается в канализацию...

ЧТО ТАКОЕ СТЕК

Тем, кто знаком с понятием стека, можно пропустить этот абзац. Представь, ты попал в мир Великого Дани. Ты сидишь в школьном классе, у всех на партах стоят телефоны, но рты у всех заклеены скотчем. Есть бумага и ручки, передавать листики запрещено, потому что можно ненароком оторвать руку или ногу товарищу. Есть главный перец, его зовут Ядро. Есть кедр, который умеет складывать числа. И еще один умеет их умножать. Ядру приспичило посчитать формулу 2*3+10. Он берет три листка, пишет на первом - 2, на втором - 3, на третьем - свой телефон. Кладет это все на стол (это и есть стек), звонит Умножителю. Тот берет эти листики, рвет и кладет листок с цифрой 6. После чего перезванивает Ядру. Тот докладывает в кучу листок с числом 10 и опять листок с телефоном Ядра. Звонит Складывателю. Тот вытаскивает три листика, рвет и кладет листок с числом 16, после чего перезванивает Ядру. Все, Ядро доволен и сияет.

Конечно, для простых арифметических действий существует процессор, а для сложных - математический сопроцессор. Поэтому данный пример сильно утрирован. Но принцип действия, я думаю, тебе ясен. Стек есть то место в памяти, куда заносятся данные для передачи в другую функцию. Все функции имеют входные и выходные данные. В языках высокого уровня стек напрямую не используется. Но при компиляции проги без него не обойтись. Для работы со стеком есть только две основные функции: положить и вытащить. Для обслуживания всей работы нужно только два регистра процессора. Первый - указывает на "вершину" стека (в зависимости от процессора, может вообще отсутствовать). Второй - на настоящее положение последней записи. То есть когда мы кладем число, положение стека удаляется от вершины. Когда вытаскиваем - приближается. Стек может расти как вверх по адресам памяти (крайне редко), так и вниз. Кроме того, существует несколько разных организаций стека.

ПОСЛЕДНИЙ, НА ВЫХОД!

Наиболее распространенный вид стека - это LIFO (Last In First Out, последним пришел - первым ушел). Если сравнить с листками, то кладут листки друг на друга, а берут начиная с верхнего. Если взять последний листик и попытаться еще раз вытащить данные, то происходит исчерпание стека. То есть вершина и позиция не могут проходить друг сквозь друга. Есть еще вид стека FIFO, похожий на конвейер. Такой стек, как правило, имеет четкий размер, и при занесении в стек позиция записи передвигается вперед, при вытаскивании вершина передвигается в том же направлении. То есть они просто ходят по кругу. Система очень напоминает работу с потоками данных.

ЧТО ТУДА ПОПАДАЕТ?

Любой язык программирования под любой платформой использует функции. Холостых функций, которые не принимают и не возвращают значения, очень мало. Поэтому прежде всего при обращении к функции в стек заносится передаваемое значение. Затем адрес возврата, то есть место программы, откуда функция была запущена. Во время работы функция выгребает все данные из стека, так или иначе использует их, затем записывает выходные данные (если это не булевое значение), и программа возвращается в точку, из которой была запущена функция. При этом нет разницы - мастдай это или правильная система. В обоих случаях работа со стеком идет на уровне ассемблера, а он един для всех осей. Самое главное, что в ассемблере никак не проверяется, а то ли количество байтиков записано в стек при передаче в функцию (или при возврате из нее). Поэтому, если программер не проверил все ручками, есть реальная маза залить туда чуть больше ожидаемого.

Содержание  Вперед на стр. 032-020-2
Выпуски журнала "СПЕЦ Xakep"
Cпец Хакер #01Cпец Хакер #02Cпец Хакер #03Cпец Хакер #04Cпец Хакер #05Cпец Хакер #06Cпец Хакер #07Cпец Хакер #08Cпец Хакер #09Cпец Хакер #10Cпец Хакер #11Cпец Хакер #12Cпец Хакер #13Cпец Хакер #14Cпец Хакер #15Cпец Хакер #16Cпец Хакер #17Cпец Хакер #18Cпец Хакер #19Cпец Хакер #20Cпец Хакер #21Cпец Хакер #22Cпец Хакер #23Cпец Хакер #24Cпец Хакер #25Cпец Хакер #26Cпец Хакер #27Cпец Хакер #28Cпец Хакер #29Cпец Хакер #30Cпец Хакер #31Cпец Хакер #32Cпец Хакер #33Cпец Хакер #34Cпец Хакер #35Cпец Хакер #36Cпец Хакер #37Cпец Хакер #38Cпец Хакер #39Cпец Хакер #40Cпец Хакер #41Cпец Хакер #42Cпец Хакер #43Cпец Хакер #44Cпец Хакер #45Cпец Хакер #46Cпец Хакер #47Cпец Хакер #48Cпец Хакер #49Cпец Хакер #50Cпец Хакер #51Cпец Хакер #52Cпец Хакер #53Cпец Хакер #54Cпец Хакер #55Cпец Хакер #56Cпец Хакер #57Cпец Хакер #58Cпец Хакер #59Cпец Хакер #60Cпец Хакер #61Cпец Хакер #62Cпец Хакер #63Cпец Хакер #64Cпец Хакер #65Cпец Хакер #66Cпец Хакер #67Cпец Хакер #68Cпец Хакер #69Cпец Хакер #70Cпец Хакер #71Cпец Хакер #72Cпец Хакер #73Cпец Хакер #74Cпец Хакер #75