Re: Переполнение буффера?
От: gear nuke  
Дата: 18.01.06 10:49
Оценка: 2 (1) +1
Здравствуйте, kisatomsk, Вы писали:

K>Короче говоря вопрос дурацкий, но меня как начинающего интересует. Вобщем пытался эмулировать переполнение буффера (в реалии стека) но ничего не вышло, значение возвращаемое функцией не изменилось. Что в этом коде не так? Опции защиты буфера в компиляторе выключены.


K>
K>#include <iostream>
K>using namespace std;

K>int func(void){
// массив занимает в стеке 4 байта
K>    char b[2]={'A','B'};
K>    int n=10;
// здесь запись в "свободное место"
K>    b[2]='C'; //Переполнение
K>    return n;
K>    }

K>void main(void){

K>    cout << func(); //Возвращает 10, почему ни мусор или код символа 'C'
    
K>    }

В общем случае нельзя по исходнику сказать, в каких адресах будет переменная n, но скорее всего — ниже, т.е. надо
    b[-2]='C'; //Переполнение
Что бы знать точно, нужно смотреть асм листинг, а лучше бинарник (в отладчике)

Но обычно переполнение делают не для того, что бы функция вернула не то значение, а что бы выполнился некоторый код, из-за перезаписи на стеке адреса возврата. Вот пример где проще наблюдать эффект:
#include<stdio.h>

void oops()
{
    char buf[25];
    scanf("%s", buf);
    buf[sizeof(buf)] = '\0';
 //   puts(buf);
}

int main()
{
    puts("before oops");
    oops();
    puts("after oops");
}
Вводите различное количество символов, after oops не напечатается, если их много.
После этого никогда не будете использовать scanf
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.