Re[2]: Переполнение буффера?
От: kisatomsk  
Дата: 18.01.06 12:25
Оценка:
Здравствуйте, gear nuke:

Спасибо за наиболее вразумительный ответ, ведь ассемблер я пока не знаю и глядя на лист дизасемблированной программы не могу найти нужного. Темболее там полно др. вещей.

GN>В общем случае нельзя по исходнику сказать, в каких адресах будет переменная n, но скорее всего — ниже, т.е. надо

GN>[c]
GN> b[-2]='C'; //Переполнение

Этот вариант подошол и сработал отлично, тут вы по моему ошиблись с моделями заполнения памяти, но лиш чуть чуть.

Стек памяти под функцию, для переменных класса auto:
Направление заполнения: <---
--------------------------------------|
| Переменная | Массив ------------> |
--------------------------------------|

Из этой модели которую представил себе я наглядно видно, что массивы индексируются и распологаются с лева на право.
Ну а стек памяти под функцию с права на лево, по этому ваш пример который вы привели (откорректировав мой сработал), но можно было не писать b[-2]='C'; достаточно b[-2]='C';.
И отсюда вопрос: b[-2]='C'; — это уже расширение массива до ячейки за переменной n которую требовалось переписать, но видимо это влечет за собой уничтожение значений в переменной n из за того что эта ячейка памяти теперь автоматически вошла в пределы массива, так ли это или я ошибаюсь?
И во вторых почему вернулся мусор, возможно из за догадки которая описана мной чуть выше?


GN>Но обычно переполнение делают не для того, что бы функция вернула не то значение, а что бы выполнился некоторый код, из-за перезаписи на стеке адреса возврата.


Спасибо за разъяснение, это я знал но всеравно пока не понимаю точно как.....

Эти знания мне нужны для того что бы сразу привыкать писать устойчивый к таким атакам код, ибо проверка при включенной опции компилятора для защиты от таких вещей показала не состоятельность компилятора — получается то же что и при выключенной опции!


Еще раз спасибо gear nuke, за наиболее вразумительную помощь в этом вопросе

--------------------------------------------------------------------------------------------------------------------
P.S: Мне кажется это тот вопрос на который надо найти ответ уже сейчас, а то потом ............
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.