Производители конкретных компиляторов работающих в разных операционных системахПроизводители конкретных компиляторов, работающих в разных операционных системах, могут, конечно, видоизменить схему вызова, но в любом случае она будет представлять собой некую разновидность вышеописанной. Не обращая внимания на мелкие различия в схемах вызова, можно представить себе некую обобщенную картину — как будет выглядеть стек программы в момент начала работы функции «check_password» — см. рис. 6.12. Локальные переменные функции, адрес возврата и параметры, передаваемые функции, хранятся рядом друг с другом — в стеке.

Теперь предположим, что пользователь вводит строку пароля. Пока ее длина не превышает размера отведенного буфера, программа будет работать корректно. Но как только пользователь введет слишком длинную строку, массив переполнится, и адрес возврата из функции будет заменен некими данными, представляющими собой «хвост» вводимого пароля. Отсюда вытекает идея взлома : если сформировать «хвост» парольной строки таким образом, чтобы он соответствовал заранее известному адресу памяти, то возврат из процедуры будет выполнен не в главную программу, а туда, куда задумал злоумышленник.

В результате злоумышленник может заставить программу не только перейти на сообщение «Добро пожаловать!», но и на свой программный код, размещенный в том же строковом буфере вместо строки пароля. Эта «хитрая» строка, подаваемая на вход программы и содержащая и код, и данные, является не чем иным, как упомянутым ранее shell-кодом. Разумеется, приведенный пример очень примитивен и нереалистичен, но идею перехвата управления программой со стороны постороннего кода иллюстрирует вполне адекватно.

Еще интересные статьи :